From 1c43f478a3653ad7ada51d95f01cedad27aa5bbd Mon Sep 17 00:00:00 2001 From: Elliot Nunn Date: Wed, 20 Sep 2017 19:58:54 +0800 Subject: [PATCH] Build updated MainCode image (matches Mac OS ROM 9.6.1+) --- BuildResults/RISC/Lib/ATAMgr.lib | Bin 0 -> 1982 bytes BuildResults/RISC/Lib/AliasMgr.lib | Bin 0 -> 26370 bytes BuildResults/RISC/Lib/CQD.lib | Bin 0 -> 155760 bytes BuildResults/RISC/Lib/ComponentMgr.lib | Bin 0 -> 13736 bytes BuildResults/RISC/Lib/DataAccessMgr.lib | Bin 0 -> 94 bytes BuildResults/RISC/Lib/DialogMgr.lib | Bin 0 -> 11034 bytes BuildResults/RISC/Lib/DisplayMgr.lib | Bin 0 -> 45760 bytes BuildResults/RISC/Lib/ExpansionBusMgr.lib | Bin 0 -> 31946 bytes BuildResults/RISC/Lib/FontMgr.lib | Bin 0 -> 94496 bytes BuildResults/RISC/Lib/Gestalt.lib | Bin 0 -> 4858 bytes BuildResults/RISC/Lib/HFS.lib | Bin 0 -> 60600 bytes BuildResults/RISC/Lib/IoPrimitives.lib | Bin 0 -> 3320 bytes BuildResults/RISC/Lib/Lastly.lib | Bin 0 -> 3226 bytes BuildResults/RISC/Lib/MMU.lib | Bin 0 -> 1272 bytes BuildResults/RISC/Lib/MemoryMgr.lib | Bin 0 -> 23998 bytes BuildResults/RISC/Lib/MenuMgr.lib | Bin 0 -> 12138 bytes BuildResults/RISC/Lib/NotificationMgr.lib | Bin 0 -> 4318 bytes BuildResults/RISC/Lib/SCSI.lib | Bin 0 -> 20250 bytes BuildResults/RISC/Lib/ScriptMgr.lib | Bin 0 -> 33390 bytes BuildResults/RISC/Lib/SlotMgr.lib | Bin 0 -> 8864 bytes BuildResults/RISC/Lib/WindowMgr.lib | Bin 0 -> 19308 bytes BuildResults/RISC/Obj/BCScreenRelated.o | Bin 0 -> 1270 bytes BuildResults/RISC/Obj/DeviceMgr.a.o | Bin 0 -> 21408 bytes BuildResults/RISC/Obj/DeviceRelatedMgr.o | Bin 0 -> 678 bytes BuildResults/RISC/Obj/InterruptHandlers.a.o | Bin 0 -> 3624 bytes BuildResults/RISC/Obj/NKEventGroupRelated.a.o | Bin 0 -> 524 bytes BuildResults/RISC/Obj/PowerMgr.o | Bin 0 -> 9298 bytes BuildResults/RISC/Obj/Printing.a.o | Bin 0 -> 1212 bytes BuildResults/RISC/Obj/ScrapMgr.a.o | Bin 0 -> 666 bytes BuildResults/RISC/Obj/ShutDownMgr.c.o | Bin 0 -> 3006 bytes BuildResults/RISC/Obj/StartInterstix.c.o | Bin 0 -> 10404 bytes BuildResults/RISC/Obj/StartLibGlue.c.o | Bin 0 -> 742 bytes BuildResults/RISC/Obj/TextEdit.lib | Bin 0 -> 21222 bytes BuildResults/RISC/Obj/UniversalTables.a.o | Bin 0 -> 606 bytes Drivers/Drivers.make | 4 +- Interfaces/AIncludes/SysEqu.a | 2 +- Internal/Asm/AppleDeskBusPriv.a | 2 +- Internal/Asm/CrsrDevEqu.a | 2 + Internal/Asm/InternalOnlyEqu.a | 632 ++- Internal/Asm/ResourceMgrPriv.a | 2 +- Internal/Asm/SysPrivateEqu.a | 4 +- Internal/Asm/VectorTableInit.a | 6 +- Internal/Asm/egretequ.a | 4 +- Make/Build | 2 +- Make/FeatureList | 56 +- Make/MainCode.Make | 22 +- Make/RISC.make | 53 +- Make/VectorTable.a | 1644 +------- Misc/GoNativeROMLib.o | Bin 53724 -> 35526 bytes OS/ADBMgr/ADBMgr.a | 264 +- OS/Beep/Beep.make | 0 OS/Clock.a | 33 +- OS/CrsrDev.a | 169 +- OS/CudaMgr.a | 230 +- OS/DeferredTaskMgr.a | 16 +- OS/DispTable.a | 379 +- OS/EgretMgr.a | 1020 +---- OS/Gestalt/Gestalt.make | 4 +- OS/HFS/HFS.make | 4 +- OS/HwPriv.a | 777 +--- OS/IoPrimitives/IOPrimitives.make | 4 +- OS/MMU/GetReal.a | 545 +-- OS/MMU/MMU.a | 274 +- OS/MMU/MMU.make | 4 +- OS/MMU/MMUTables.a | 3482 +---------------- OS/MemoryMgr/MemoryMgr.make | 17 +- OS/NKEventGroupWrapper.a | 55 + OS/NKLogShim.a | 68 + OS/OS.make | 83 +- OS/OSEventMgr.a | 122 +- OS/PowerMgr/PowerMgr.a | 42 +- OS/PowerMgr/PowerMgr.make | 32 +- OS/Queue.a | 43 - OS/RealTime/RealTime.make | 0 OS/SCSIMgr/SCSIMgr.make | 4 +- OS/SlotMgr/SlotMgr.make | 4 +- OS/StartMgr/StartAlert.a | 86 +- OS/StartMgr/StartBoot.a | 315 +- OS/StartMgr/StartErr.a | 139 +- OS/StartMgr/StartFail.a | 35 +- OS/StartMgr/StartInit.a | 1818 +++------ OS/StartMgr/StartMgr.make | 2 + OS/StartMgr/StartSearch.a | 562 +-- OS/SysUtil.a | 279 +- OS/TrapDispatcher/Dispatch.a | 154 +- OS/Universal.a | 1073 +---- OS/VerticalRetraceMgr.a | 61 +- Patches/MiscPatches.a | 219 +- QuickDraw/ColorQD.make | 4 +- Toolbox/AliasMgr/AliasMgr.make | 4 +- Toolbox/ComponentMgr/ComponentMgr.make | 4 +- Toolbox/ControlMgr/ControlMgr.a | 67 +- Toolbox/DataAccessMgr/DataAccessMgr.make | 4 +- Toolbox/DataAccessMgr/DataAccessPackEntry.a | 3 +- Toolbox/DeskMgr/DeskMgr.a | 57 +- Toolbox/DialogMgr/DialogMgr.make | 4 +- Toolbox/DisplayMgr/DisplayMgr.make | 4 +- Toolbox/ExpansionBusMgr/ExpansionBusMgr.Make | 4 +- Toolbox/FontMgr/FontMgr.make | 4 +- Toolbox/GetMgr/GetMgr.a | 27 +- Toolbox/MenuMgr/MenuMgr.make | 4 +- Toolbox/Munger/Munger.a | 6 +- Toolbox/NotificationMgr/NotificationMgr.make | 4 +- Toolbox/ResourceMgr/ResourceMgr.a | 50 +- Toolbox/ResourceMgr/ResourceMgrExtensions.a | 98 +- Toolbox/ScrapMgr/ScrapMgr.a | 1 + Toolbox/ScriptMgr/ScriptMgr.make | 4 +- Toolbox/SegmentLoader/SegmentLoader.a | 22 +- Toolbox/ShutDownMgr/ShutDownMgr.a | 633 +-- Toolbox/Toolbox.make | 75 + Toolbox/ToolboxEventMgr/ToolboxEventMgr.a | 83 - .../ToolboxEventMgr/ToolboxEventMgrPatches.a | 187 - Toolbox/WindowMgr/WindowMgr.make | 4 +- 113 files changed, 4076 insertions(+), 12134 deletions(-) create mode 100644 BuildResults/RISC/Lib/ATAMgr.lib create mode 100644 BuildResults/RISC/Lib/AliasMgr.lib create mode 100644 BuildResults/RISC/Lib/CQD.lib create mode 100644 BuildResults/RISC/Lib/ComponentMgr.lib create mode 100644 BuildResults/RISC/Lib/DataAccessMgr.lib create mode 100644 BuildResults/RISC/Lib/DialogMgr.lib create mode 100644 BuildResults/RISC/Lib/DisplayMgr.lib create mode 100644 BuildResults/RISC/Lib/ExpansionBusMgr.lib create mode 100644 BuildResults/RISC/Lib/FontMgr.lib create mode 100644 BuildResults/RISC/Lib/Gestalt.lib create mode 100644 BuildResults/RISC/Lib/HFS.lib create mode 100644 BuildResults/RISC/Lib/IoPrimitives.lib create mode 100644 BuildResults/RISC/Lib/Lastly.lib create mode 100644 BuildResults/RISC/Lib/MMU.lib create mode 100644 BuildResults/RISC/Lib/MemoryMgr.lib create mode 100644 BuildResults/RISC/Lib/MenuMgr.lib create mode 100644 BuildResults/RISC/Lib/NotificationMgr.lib create mode 100644 BuildResults/RISC/Lib/SCSI.lib create mode 100644 BuildResults/RISC/Lib/ScriptMgr.lib create mode 100644 BuildResults/RISC/Lib/SlotMgr.lib create mode 100644 BuildResults/RISC/Lib/WindowMgr.lib create mode 100644 BuildResults/RISC/Obj/BCScreenRelated.o create mode 100644 BuildResults/RISC/Obj/DeviceMgr.a.o create mode 100644 BuildResults/RISC/Obj/DeviceRelatedMgr.o create mode 100644 BuildResults/RISC/Obj/InterruptHandlers.a.o create mode 100644 BuildResults/RISC/Obj/NKEventGroupRelated.a.o create mode 100644 BuildResults/RISC/Obj/PowerMgr.o create mode 100644 BuildResults/RISC/Obj/Printing.a.o create mode 100644 BuildResults/RISC/Obj/ScrapMgr.a.o create mode 100644 BuildResults/RISC/Obj/ShutDownMgr.c.o create mode 100644 BuildResults/RISC/Obj/StartInterstix.c.o create mode 100644 BuildResults/RISC/Obj/StartLibGlue.c.o create mode 100644 BuildResults/RISC/Obj/TextEdit.lib create mode 100644 BuildResults/RISC/Obj/UniversalTables.a.o create mode 100644 OS/Beep/Beep.make create mode 100644 OS/NKEventGroupWrapper.a create mode 100644 OS/NKLogShim.a create mode 100644 OS/RealTime/RealTime.make create mode 100644 Toolbox/Toolbox.make diff --git a/BuildResults/RISC/Lib/ATAMgr.lib b/BuildResults/RISC/Lib/ATAMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..3aa6bec79b143af2b8c6b54446b0a3e2ff05f4f6 GIT binary patch literal 1982 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

*{N27s|Bj>oC{hhN)Ip;pX!T#Bv=hE8M41Q(Nna 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 z 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%0Dwt3X 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 literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/ComponentMgr.lib b/BuildResults/RISC/Lib/ComponentMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..b688be5eb9318fcf8e0d232cb9da30ff063bb878 GIT binary patch literal 13736 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 literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/DataAccessMgr.lib b/BuildResults/RISC/Lib/DataAccessMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..c5e4630b08299e54f9b362c812e39efbcafe3dc8 GIT binary patch literal 94 zcmZQ%WME=pVBlt8WbsYR%wqtuc^OWy1vol;8yYjPb}*b^U}R?i0zD1}1|u(qbS{Mo urfps;7;@5u6e_syC;@rSFB$dpE!Z;rN)_TCcs%yFcffAXpUZw1m>2*N^cTbc literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/DialogMgr.lib b/BuildResults/RISC/Lib/DialogMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..69809a14b2466420d8268e2440f0f184b87f661e GIT binary patch literal 11034 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 literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/DisplayMgr.lib b/BuildResults/RISC/Lib/DisplayMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..d0dee87e266e8ebc0057d764f12ab2690e599f79 GIT binary patch literal 45760 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 literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/ExpansionBusMgr.lib b/BuildResults/RISC/Lib/ExpansionBusMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..89c325462af6572a967c908ab45273a31cb5e11e GIT binary patch literal 31946 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 G6#oZ#z7Q+` literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/FontMgr.lib b/BuildResults/RISC/Lib/FontMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..52bc0d9b953ed1024b0b454e66ad85c64e0c4580 GIT binary patch literal 94496 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

-&|* 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 literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/Gestalt.lib b/BuildResults/RISC/Lib/Gestalt.lib new file mode 100644 index 0000000000000000000000000000000000000000..a69f74e0b95748d4f0aa3db76efffb537db904ca GIT binary patch literal 4858 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 S+F`WU7`uk^MjBfw*Y^ literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/MenuMgr.lib b/BuildResults/RISC/Lib/MenuMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..27eafae88091d0e896de2eef4e4f97c53b89584d GIT binary patch literal 12138 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 C#K2Pk literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/ScriptMgr.lib b/BuildResults/RISC/Lib/ScriptMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..99c5ef0c920e65fe82257e1843131a221582526c GIT binary patch literal 33390 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 literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Lib/SlotMgr.lib b/BuildResults/RISC/Lib/SlotMgr.lib new file mode 100644 index 0000000000000000000000000000000000000000..1d30b2bba5f57323037175363783218284207277 GIT binary patch literal 8864 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 a2Br9R&P literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Obj/BCScreenRelated.o b/BuildResults/RISC/Obj/BCScreenRelated.o new file mode 100644 index 0000000000000000000000000000000000000000..b00079f1377fab0a6d82abe5b566b23032569e50 GIT binary patch literal 1270 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 PKlGiUC$i8JtycPfTbQaj literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Obj/DeviceRelatedMgr.o b/BuildResults/RISC/Obj/DeviceRelatedMgr.o new file mode 100644 index 0000000000000000000000000000000000000000..c39a9137b5a4158a583f56964bc2e60736d9ac19 GIT binary patch literal 678 zcmaKpKWGzC9LIloIWO1rDA9J&L0*nfk_f%SAy6$e|EiZGy(StYbh(^q?s{^`i}@oR zL}RCj19=B4Ol(zfy-Yhxf0tu(Qonpz1O|)1 zVgg=a3+)LOlHX)Ee8Sy1M(tp2?JIZ}TIz@D`@%PXKmL|B=cN6*<=QtqXA+~*rD+R$vW<-wq;nTfXbMA6aZAv}@@I2Z>Q4bjF;*>*%L+HNA3sEI& zTvNJ$jHsh3Av7`~l=_bH*yNRt5#~a`j(-}0pwTH8oGrz7#U;AJv&&24cds7ipE~{) z4%Mch$w!6Zyd0);!ex{WmVr@rOf2%^v|t0Lc9bV3Bh3;nm{WF)}aI2*1W`jz_Do^-N47O*UgJV>yo5nMvehH1> z5t1oo5jeD)Of_j9-Kwb{CR9~T6jhTqp(>N2_Kj6lU>kK%I`N@evI>dvXTznea-ER3 zbD!-r^AP<|b*inO&pG$pd+xdCo_p>!!vM-YTeCN&$J&`_tAQpQY7L3TCBU2J$C=E3mQf z>-~JuS1bX@MeU-gu>cPa*a)rU3FEdrqVbAV6BJex!&kLZ&G#_z0I1xYF6Uzl%?@g_ zw(1krRoA5Ps)Uh)2P8ERn82^P!wa1xefTOdp(0@K2B_}Sh5WYXR2eh_sW;&@Fj zW>{s#;|1%P7t)4dw6)43@mt1C5*KHH!5DwT{IviZm;~|6X|&kV(4z^MK-XHm0>Bb) z#RcHmZihXy#!4caxkLTO-7b=TxPrVF;IT(1Hf4Y_xDVBcWHhqdwB{l={#h(kL< z9|FJad*Ga32D0b8@ri`};jL|BhOydqN5UA@MmW{>%|77FUPkB|@DKSwsE<{g>E{VA zWzlL?!`C&^c2KA%9gCaCd7kqD8T=#-OE158-e0kedFs})f{zCk;B;6IU-c1}R`oY@ z9rz(%;UGBGrkce&iq(~SC<0t;fn&p07qg_kCTBF4dAuf-7?8YKT#!J2It~eoe|T;Z z<9b8^c!Z;E#BAZr7U$eDFaS4l5@rNH4z|v5%%vl-1;&P6{%h6C(XXnPs~#RRJuH3I zqPXhcPpM~L_MXWjIEVgUdC~q^UUZJ(?q_K(;CZ9_zqPvi+779nN#YP}-O>bt-!N41 z#wnLa1pXXm#Yqvf0#Dlqu?33_s|u|c^)WR2gfuK4he=ga!e@+p$-0Kwmam^{R&}u~QBz@XGFJvvqWxh3Rk)D9O zn{l%pUf35t202YEo^(S8L)I>l;IYob8wmZjbG zEUmIbKpufEau8bdf)_H5A%gOw$P*Qq!asF@;d*h_P)J>S4Xcss#3f{hp)fKtd2PWLzAiC+T6AK@PCfxPTsgFsAv`-&^ zw%CHrq4$H3X{xSQ0XR-)HZzf^*SRbJh=qRO)h5xyixFLcm5X@uac&;(EDev~nPKOZ z$qa{4nV~+RM?J)M)}lImI_oPLi>YkjAE}-C=G-?i&Th6kPc@EYU!Y*xC@26{oC#pe z2GS_|Mzou)WS-J&x*JF)(R+=pkOB5!G_P(#Iuy-kTGId;@`u>5vLWYD^3t)(zeHZW#Z535zoNQ%3uDUqy;@ed?_8pFW2C>s7wus#4nL{y^Ir0@q?tq!5EB z_tfS*U>FsOe#9UGeXR^5M%U=khb3J15{JMzEMYvB#F`%MePr6Q@^BtwIgRuJ)gk>e o5)tWNkcN@|6=@3TMWnMx-$lBJl%AFf(mDKJkVlGpf`2jKKXCvv{Qv*} literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Obj/NKEventGroupRelated.a.o b/BuildResults/RISC/Obj/NKEventGroupRelated.a.o new file mode 100644 index 0000000000000000000000000000000000000000..36f5431ee95bc4ce3df98423c0a7034d875e26af GIT binary patch literal 524 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 T_!ODX!zI9%051a`7wCTh3nMKa literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Obj/Printing.a.o b/BuildResults/RISC/Obj/Printing.a.o new file mode 100644 index 0000000000000000000000000000000000000000..e40b3ddd549c90d405a766c8815c01bd362287fe GIT binary patch literal 1212 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 mqCevHG$4=vH_<%-z!|`Cz>kPZncgfQ# literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Obj/StartLibGlue.c.o b/BuildResults/RISC/Obj/StartLibGlue.c.o new file mode 100644 index 0000000000000000000000000000000000000000..9a9c8626c11dd3c154910d930218961e9c7efebf GIT binary patch literal 742 zcmZQ%WME=pVBlt8WbsYR%wqtuQy5N228TEXh4^?n#k;$PfZ3q|F0Nso&aSdJWkMnY zTvd@}-8_R_!+{t@zo(y@KWhiW2?j=X1_lPE01gJG5Wld0-#nf(O1S@GSQOf?&#iA$ zP+pK+z^KpQkq4B?`}fBq?>~dR4FltUM)cm;am= zvMMUX-+wlKXcM;r(PD*-gW)7FZVmwHQw$7@4NMFGbZhm) literal 0 HcmV?d00001 diff --git a/BuildResults/RISC/Obj/TextEdit.lib b/BuildResults/RISC/Obj/TextEdit.lib new file mode 100644 index 0000000000000000000000000000000000000000..ca9db829605845fc3861af9c05a909e4149ac6bf GIT binary patch literal 21222 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 Z?K(Em=bw}`SHTkpRq~mvkuQc8z5ud-)ouU) literal 0 HcmV?d00001 diff --git a/Drivers/Drivers.make b/Drivers/Drivers.make index 85152e1..3e56fe0 100644 --- a/Drivers/Drivers.make +++ b/Drivers/Drivers.make @@ -22,8 +22,8 @@ BackLightDir = {DriverDir}BackLight: #include {SonyDir}Sony.make -#include {SerialDir}Serial.make -#include {SerialDMADir}SerialDMA.make +##include {SerialDir}Serial.make +##include {SerialDMADir}SerialDMA.make #include {NewAgeDir}NewAge.make diff --git a/Interfaces/AIncludes/SysEqu.a b/Interfaces/AIncludes/SysEqu.a index 1458352..79f1d4e 100644 --- a/Interfaces/AIncludes/SysEqu.a +++ b/Interfaces/AIncludes/SysEqu.a @@ -674,7 +674,7 @@ btQType EQU 21 ; B*Tree Manager ; Device Control Entry Definition ;dCtlEntrySize used to be only 40 bytes! -dCtlEntrySize EQU $34 ; length of a DCE [52 bytes] +dCtlEntrySize EQU $38 ; length of a DCE [52 bytes] dCtlDriver EQU 0 ; driver [handle] dCtlFlags EQU 4 ; flags [word] dCtlQueue EQU 6 ; queue header diff --git a/Internal/Asm/AppleDeskBusPriv.a b/Internal/Asm/AppleDeskBusPriv.a index 4851418..9104a6b 100644 --- a/Internal/Asm/AppleDeskBusPriv.a +++ b/Internal/Asm/AppleDeskBusPriv.a @@ -53,7 +53,7 @@ resetCmd EQU $00 ; Command for Bus Reset kbdAddr EQU $02 ; keyboard type device mouseAddr EQU $03 ; mouse type device numFDBAdr EQU 16 ; number of avaiblae FDB address -moveTime EQU 50 ; number of times to move device +moveTime EQU 10 ; number of times to move device IF IopADB THEN diff --git a/Internal/Asm/CrsrDevEqu.a b/Internal/Asm/CrsrDevEqu.a index c436e17..bb58f84 100644 --- a/Internal/Asm/CrsrDevEqu.a +++ b/Internal/Asm/CrsrDevEqu.a @@ -90,6 +90,8 @@ denom ds.w 1 ; Private: fraction of the errors to use next time spread ds.w 1 ; Private: Number of samples to spread errors over newData ds.b 1 ; Private: set when deltas are new ds.b 1 ; align + + ds.b 4 ; new CrsrDevSize EQU * ENDR diff --git a/Internal/Asm/InternalOnlyEqu.a b/Internal/Asm/InternalOnlyEqu.a index d60daa7..28f4d60 100644 --- a/Internal/Asm/InternalOnlyEqu.a +++ b/Internal/Asm/InternalOnlyEqu.a @@ -231,41 +231,110 @@ DockingGlobals EQU $1FF8 ; pointer to docking globals ;_______________________________________________________________________ -; Processor Info Record -; -; Used to pass Processor information from the NanoKernel to user mode -; software. +; Configuration Info Record +; Used to pass Configuration information from the Boot Program to the +; NanoKernel for data structure and address mapping initialization. ;_______________________________________________________________________ -ProcessorInfoPtr equ $5FFFEFD8 ; logical address of ProcessorInfo record -ProcessorInfoVer equ $5FFFEFDC ; version number of ProcessorInfo record -ProcessorInfoLen equ $5FFFEFDE ; length of ProcessorInfo record +NKConfigurationInfo record 0,increment +ROMByteCheckSums ds.l 8 ; 000 ; ROM Checksums - one word for each of 8 byte lanes +ROMCheckSum64 ds.l 2 ; 020 ; ROM Checksum - 64 bit sum of doublewords -ProcessorInfo record 0,increment -ProcessorVersionReg ds.l 1 ; contents of the PVR special purpose register -CpuClockRateHz ds.l 1 ; CPU Clock frequency -BusClockRateHz ds.l 1 ; Bus Clock frequency -DecClockRateHz ds.l 1 ; Decrementer Clock frequency -PageSize ds.l 1 ; number of bytes in a memory page -DataCacheTotalSize ds.l 1 ; number of bytes in the Data Cache -InstCacheTotalSize ds.l 1 ; number of bytes in the Instruction Cache -CoherencyBlockSize ds.w 1 ; number of bytes in a Coherency Block -ReservationGranuleSize ds.w 1 ; number of bytes in a Reservation Granule -CombinedCaches ds.w 1 ; 1 <- combined or no cache, 0 <- split cache -InstCacheLineSize ds.w 1 ; number of bytes in a Line of the Instruction Cache -DataCacheLineSize ds.w 1 ; number of bytes in a Line of the Data Cache -DataCacheBlockSizeTouch ds.w 1 ; number of bytes in a Block for DCBT DCBTST -InstCacheBlockSize ds.w 1 ; number of bytes in a Block of the Instruction Cache -DataCacheBlockSize ds.w 1 ; number of bytes in a Block of the Data Cache -InstCacheAssociativity ds.w 1 ; Associativity of the Instruction Cache -DataCacheAssociativity ds.w 1 ; Associativity of the Data Cache +ROMImageBaseOffset ds.l 1 ; 028 ; Offset of Base of total ROM image +ROMImageSize ds.l 1 ; 02c ; Number of bytes in ROM image +ROMImageVersion ds.l 1 ; 030 ; ROM Version number for entire ROM -TransCacheTotalSize ds.w 1 ; number of entries in the Translation Cache -TransCacheAssociativity ds.w 1 ; Associativity of the Translation Cache - align 32 ; pad to nice cache block alignment -Size equ *-ProcessorInfo +Mac68KROMOffset ds.l 1 ; 034 ; Offset of base of Macintosh 68K ROM +Mac68KROMSize ds.l 1 ; 038 ; Number of bytes in Macintosh 68K ROM + +ExceptionTableOffset ds.l 1 ; 03c ; Offset of base of PowerPC Exception Table Code +ExceptionTableSize ds.l 1 ; 040 ; Number of bytes in PowerPC Exception Table Code + +HWInitCodeOffset ds.l 1 ; 044 ; Offset of base of Hardware Init Code (field moved!) +HWInitCodeSize ds.l 1 ; 048 ; Number of bytes in Hardware Init Code + +KernelCodeOffset ds.l 1 ; 04c ; Offset of base of NanoKernel Code +KernelCodeSize ds.l 1 ; 050 ; Number of bytes in NanoKernel Code + +EmulatorCodeOffset ds.l 1 ; 054 ; Offset of base of Emulator Code +EmulatorCodeSize ds.l 1 ; 058 ; Number of bytes in Emulator Code + +OpcodeTableOffset ds.l 1 ; 05c ; Offset of base of Opcode Table +OpcodeTableSize ds.l 1 ; 060 ; Number of bytes in Opcode Table + +BootstrapVersion ds.b 16 ; 064 ; Bootstrap loader version info +BootVersionOffset ds.l 1 ; 074 ; offset within EmulatorData of BootstrapVersion +ECBOffset ds.l 1 ; 078 ; offset within EmulatorData of ECB +IplValueOffset ds.l 1 ; 07c ; offset within EmulatorData of IplValue + +EmulatorEntryOffset ds.l 1 ; 080 ; offset within Emulator Code of entry point +KernelTrapTableOffset ds.l 1 ; 084 ; offset within Emulator Code of KernelTrapTable + +TestIntMaskInit ds.l 1 ; 088 ; initial value for test interrupt mask +ClearIntMaskInit ds.l 1 ; 08c ; initial value for clear interrupt mask +PostIntMaskInit ds.l 1 ; 090 ; initial value for post interrupt mask +LA_InterruptCtl ds.l 1 ; 094 ; logical address of Interrupt Control I/O page +InterruptHandlerKind ds.b 1 ; 098 ; kind of handler to use + ds.b 3 ; 099 ; filler + +LA_InfoRecord ds.l 1 ; 09c ; logical address of InfoRecord page +LA_KernelData ds.l 1 ; 0a0 ; logical address of KernelData page +LA_EmulatorData ds.l 1 ; 0a4 ; logical address of EmulatorData page +LA_DispatchTable ds.l 1 ; 0a8 ; logical address of Dispatch Table +LA_EmulatorCode ds.l 1 ; 0ac ; logical address of Emulator Code + +MacLowMemInitOffset ds.l 1 ; 0b0 ; offset to list of LowMem addr/data values + +PageAttributeInit ds.l 1 ; 0b4 ; default WIMG/PP settings for PTE creation +PageMapInitSize ds.l 1 ; 0b8 ; size of page mapping info +PageMapInitOffset ds.l 1 ; 0bc ; offset to page mapping info (from base of ConfigInfo) +PageMapIRPOffset ds.l 1 ; 0c0 ; offset of InfoRecord map info (from base of PageMap) +PageMapKDPOffset ds.l 1 ; 0c4 ; offset of KernelData map info (from base of PageMap) +PageMapEDPOffset ds.l 1 ; 0c8 ; offset of EmulatorData map info (from base of PageMap) + +SegMaps +SegMap32SupInit ds.l 32 ; 0cc ; 32 bit mode Segment Map Supervisor space +SegMap32UsrInit ds.l 32 ; 14c ; 32 bit mode Segment Map User space +SegMap32CPUInit ds.l 32 ; 1cc ; 32 bit mode Segment Map CPU space +SegMap32OvlInit ds.l 32 ; 24c ; 32 bit mode Segment Map Overlay mode + +BATRangeInit ds.l 32 ; 2cc ; BAT mapping ranges + +BatMap32SupInit ds.l 1 ; 34c ; 32 bit mode BAT Map Supervisor space +BatMap32UsrInit ds.l 1 ; 350 ; 32 bit mode BAT Map User space +BatMap32CPUInit ds.l 1 ; 354 ; 32 bit mode BAT Map CPU space +BatMap32OvlInit ds.l 1 ; 358 ; 32 bit mode BAT Map Overlay mode + +SharedMemoryAddr ds.l 1 ; 35c ; physical address of Mac/Smurf shared message mem + +PA_RelocatedLowMemInit ds.l 1 ; 360 ; physical address of RelocatedLowMem + +OpenFWBundleOffset ds.l 1 ; 364 ; Offset of base of OpenFirmware PEF Bundle +OpenFWBundleSize ds.l 1 ; 368 ; Number of bytes in OpenFirmware PEF Bundle + +LA_OpenFirmware ds.l 1 ; 36c ; logical address of Open Firmware +PA_OpenFirmware ds.l 1 ; 370 ; physical address of Open Firmware +LA_HardwarePriv ds.l 1 ; 374 ; logical address of HardwarePriv callback + +; Used to stop here, plus 8 bytes for cache block alignment (0x380 bytes). +; Now there be more! + +Debug ds.w 1 ; 378 ; > 256 required for screen log +DebugThreshold equ 257 + + org $388 +DebugFlags ds.l 1 ; 388 ; bit 1<< 1 required for screen log +NanodbgrFlagShift equ 0 +NanodbgrFlagBit equ 31 - NanodbgrFlagShift +LogFlagShift equ 1 +LogFlagBit equ 31 - LogFlagShift + + org $100 +Size equ * endr + + ;_______________________________________________________________________ ; System Info Record ; @@ -273,70 +342,112 @@ Size equ *-ProcessorInfo ; software. ;_______________________________________________________________________ -NKSystemInfoPtr equ $5FFFEFF0 ; logical address of NKSystemInfo record -NKSystemInfoVer equ $5FFFEFF4 ; version number of NKSystemInfo record -NKSystemInfoLen equ $5FFFEFF6 ; length of NKSystemInfo record +NKSystemInfoPtr equ $68FFEFF0 ; logical address of NKSystemInfo record +NKSystemInfoVer equ $68FFEFF4 ; version number of NKSystemInfo record +NKSystemInfoLen equ $68FFEFF6 ; length of NKSystemInfo record NKSystemInfo record 0,increment -PhysicalMemorySize ds.l 1 ; Number of bytes in Physical RAM -UsableMemorySize ds.l 1 ; Number of bytes in Usable RAM -LogicalMemorySize ds.l 1 ; Number of bytes in Logical RAM -HashTableSize ds.l 1 ; Number of bytes in Memory Hash Table +PhysicalMemorySize ds.l 1 ; 000, irp+dc0 ; Number of bytes in Physical RAM +UsableMemorySize ds.l 1 ; 004, irp+dc4 ; Number of bytes in Usable RAM +LogicalMemorySize ds.l 1 ; 008, irp+dc8 ; Number of bytes in Logical RAM +HashTableSize ds.l 1 ; 00c, irp+dcc ; Number of bytes in Memory Hash Table -L2DataCacheTotalSize ds.l 1 ; number of bytes in the L2 Data Cache -L2InstCacheTotalSize ds.l 1 ; number of bytes in the L2 Instruction Cache -L2CombinedCaches ds.w 1 ; 1 <- combined or no cache, 0 <- split cache -L2InstCacheBlockSize ds.w 1 ; number of bytes in a Block of the L2 Instruction Cache -L2DataCacheBlockSize ds.w 1 ; number of bytes in a Block of the L2 Data Cache -L2InstCacheAssociativity ds.w 1 ; Associativity of the L2 Instruction Cache -L2DataCacheAssociativity ds.w 1 ; Associativity of the L2 Data Cache - ds.b 2 ; unused +L2DataCacheTotalSize ds.l 1 ; 010, irp+dd0 ; number of bytes in the L2 Data Cache +L2InstCacheTotalSize ds.l 1 ; 014, irp+dd4 ; number of bytes in the L2 Instruction Cache +L2CombinedCaches ds.w 1 ; 018, irp+dd8 ; 1 <- combined or no cache, 0 <- split cache +L2InstCacheBlockSize ds.w 1 ; 01a, irp+dda ; number of bytes in a Block of the L2 Instruction Cache +L2DataCacheBlockSize ds.w 1 ; 01c, irp+ddc ; number of bytes in a Block of the L2 Data Cache +L2InstCacheAssociativity ds.w 1 ; 01e, irp+dde ; Associativity of the L2 Instruction Cache +L2DataCacheAssociativity ds.w 1 ; 020, irp+de0 ; Associativity of the L2 Data Cache + ds.b 2 ; 022, irp+de2 ; unused - ds.b 2 ; unused -FlashManufacturerCode ds.b 1 ; Flash ROM Manufacturer code -FlashDeviceCode ds.b 1 ; Flash ROM Device code -FlashStart ds.l 1 ; Starting address of Flash ROM -FlashSize ds.l 1 ; Number of bytes in Flash ROM + ds.b 2 ; 024, irp+de4 ; unused +FlashManufacturerCode ds.b 1 ; 026, irp+de6 ; Flash ROM Manufacturer code +FlashDeviceCode ds.b 1 ; 027, irp+de7 ; Flash ROM Device code +FlashStart ds.l 1 ; 028, irp+de8 ; Starting address of Flash ROM +FlashSize ds.l 1 ; 02c, irp+dec ; Number of bytes in Flash ROM - align 16 -Bank0Start ds.l 1 ; Starting address of RAM bank 0 -Bank0Size ds.l 1 ; Number of bytes in RAM bank 0 -Bank1Start ds.l 1 ; Starting address of RAM bank 1 -Bank1Size ds.l 1 ; Number of bytes in RAM bank 1 -Bank2Start ds.l 1 ; Starting address of RAM bank 2 -Bank2Size ds.l 1 ; Number of bytes in RAM bank 2 -Bank3Start ds.l 1 ; Starting address of RAM bank 3 -Bank3Size ds.l 1 ; Number of bytes in RAM bank 3 -Bank4Start ds.l 1 ; Starting address of RAM bank 4 -Bank4Size ds.l 1 ; Number of bytes in RAM bank 4 -Bank5Start ds.l 1 ; Starting address of RAM bank 5 -Bank5Size ds.l 1 ; Number of bytes in RAM bank 5 -Bank6Start ds.l 1 ; Starting address of RAM bank 6 -Bank6Size ds.l 1 ; Number of bytes in RAM bank 6 -Bank7Start ds.l 1 ; Starting address of RAM bank 7 -Bank7Size ds.l 1 ; Number of bytes in RAM bank 7 -Bank8Start ds.l 1 ; Starting address of RAM bank 8 -Bank8Size ds.l 1 ; Number of bytes in RAM bank 8 -Bank9Start ds.l 1 ; Starting address of RAM bank 9 -Bank9Size ds.l 1 ; Number of bytes in RAM bank 9 -Bank10Start ds.l 1 ; Starting address of RAM bank 10 -Bank10Size ds.l 1 ; Number of bytes in RAM bank 10 -Bank11Start ds.l 1 ; Starting address of RAM bank 11 -Bank11Size ds.l 1 ; Number of bytes in RAM bank 11 -Bank12Start ds.l 1 ; Starting address of RAM bank 12 -Bank12Size ds.l 1 ; Number of bytes in RAM bank 12 -Bank13Start ds.l 1 ; Starting address of RAM bank 13 -Bank13Size ds.l 1 ; Number of bytes in RAM bank 13 -Bank14Start ds.l 1 ; Starting address of RAM bank 14 -Bank14Size ds.l 1 ; Number of bytes in RAM bank 14 -Bank15Start ds.l 1 ; Starting address of RAM bank 15 -Bank15Size ds.l 1 ; Number of bytes in RAM bank 15 - align 32 ; pad to nice cache block alignment -MaxBanks equ 16 ; 16 banks, 0É15 -Size equ *-SystemInfo +Bank0Start ds.l 1 ; 030, irp+df0 ; Starting address of RAM bank 0 +Bank0Size ds.l 1 ; 034, irp+df4 ; Number of bytes in RAM bank 0 +Bank1Start ds.l 1 ; 038, irp+df8 ; Starting address of RAM bank 1 +Bank1Size ds.l 1 ; 03c, irp+dfc ; Number of bytes in RAM bank 1 +Bank2Start ds.l 1 ; 040, irp+e00 ; Starting address of RAM bank 2 +Bank2Size ds.l 1 ; 044, irp+e04 ; Number of bytes in RAM bank 2 +Bank3Start ds.l 1 ; 048, irp+e08 ; Starting address of RAM bank 3 +Bank3Size ds.l 1 ; 04c, irp+e0c ; Number of bytes in RAM bank 3 +Bank4Start ds.l 1 ; 050, irp+e10 ; Starting address of RAM bank 4 +Bank4Size ds.l 1 ; 054, irp+e14 ; Number of bytes in RAM bank 4 +Bank5Start ds.l 1 ; 058, irp+e18 ; Starting address of RAM bank 5 +Bank5Size ds.l 1 ; 05c, irp+e1c ; Number of bytes in RAM bank 5 +Bank6Start ds.l 1 ; 060, irp+e20 ; Starting address of RAM bank 6 +Bank6Size ds.l 1 ; 064, irp+e24 ; Number of bytes in RAM bank 6 +Bank7Start ds.l 1 ; 068, irp+e28 ; Starting address of RAM bank 7 +Bank7Size ds.l 1 ; 06c, irp+e2c ; Number of bytes in RAM bank 7 +Bank8Start ds.l 1 ; 070, irp+e30 ; Starting address of RAM bank 8 +Bank8Size ds.l 1 ; 074, irp+e34 ; Number of bytes in RAM bank 8 +Bank9Start ds.l 1 ; 078, irp+e38 ; Starting address of RAM bank 9 +Bank9Size ds.l 1 ; 07c, irp+e3c ; Number of bytes in RAM bank 9 +Bank10Start ds.l 1 ; 080, irp+e40 ; Starting address of RAM bank 10 +Bank10Size ds.l 1 ; 084, irp+e44 ; Number of bytes in RAM bank 10 +Bank11Start ds.l 1 ; 088, irp+e48 ; Starting address of RAM bank 11 +Bank11Size ds.l 1 ; 08c, irp+e4c ; Number of bytes in RAM bank 11 +Bank12Start ds.l 1 ; 090, irp+e50 ; Starting address of RAM bank 12 +Bank12Size ds.l 1 ; 094, irp+e54 ; Number of bytes in RAM bank 12 +Bank13Start ds.l 1 ; 098, irp+e58 ; Starting address of RAM bank 13 +Bank13Size ds.l 1 ; 09c, irp+e5c ; Number of bytes in RAM bank 13 +Bank14Start ds.l 1 ; 0a0, irp+e60 ; Starting address of RAM bank 14 +Bank14Size ds.l 1 ; 0a4, irp+e64 ; Number of bytes in RAM bank 14 +Bank15Start ds.l 1 ; 0a8, irp+e68 ; Starting address of RAM bank 15 +Bank15Size ds.l 1 ; 0ac, irp+e6c ; Number of bytes in RAM bank 15 +Bank16Start ds.l 1 ; 0b0, irp+e70 ; Starting address of RAM bank 16 +Bank16Size ds.l 1 ; 0b4, irp+e74 ; Number of bytes in RAM bank 16 +Bank17Start ds.l 1 ; 0b8, irp+e78 ; Starting address of RAM bank 17 +Bank17Size ds.l 1 ; 0bc, irp+e7c ; Number of bytes in RAM bank 17 +Bank18Start ds.l 1 ; 0c0, irp+e80 ; Starting address of RAM bank 18 +Bank18Size ds.l 1 ; 0c4, irp+e84 ; Number of bytes in RAM bank 18 +Bank19Start ds.l 1 ; 0c8, irp+e88 ; Starting address of RAM bank 19 +Bank19Size ds.l 1 ; 0cc, irp+e8c ; Number of bytes in RAM bank 19 +Bank20Start ds.l 1 ; 0d0, irp+e90 ; Starting address of RAM bank 20 +Bank20Size ds.l 1 ; 0d4, irp+e94 ; Number of bytes in RAM bank 20 +Bank21Start ds.l 1 ; 0d8, irp+e98 ; Starting address of RAM bank 21 +Bank21Size ds.l 1 ; 0dc, irp+e9c ; Number of bytes in RAM bank 21 +Bank22Start ds.l 1 ; 0e0, irp+ea0 ; Starting address of RAM bank 22 +Bank22Size ds.l 1 ; 0e4, irp+ea4 ; Number of bytes in RAM bank 22 +Bank23Start ds.l 1 ; 0e8, irp+ea8 ; Starting address of RAM bank 23 +Bank23Size ds.l 1 ; 0ec, irp+eac ; Number of bytes in RAM bank 23 +Bank24Start ds.l 1 ; 0f0, irp+eb0 ; Starting address of RAM bank 24 +Bank24Size ds.l 1 ; 0f4, irp+eb4 ; Number of bytes in RAM bank 24 +Bank25Start ds.l 1 ; 0f8, irp+eb8 ; Starting address of RAM bank 25 +Bank25Size ds.l 1 ; 0fc, irp+ebc ; Number of bytes in RAM bank 25 +EndOfBanks +MaxBanks equ 26 ; Pads out to old struct len (cache block), more to come... + + ; Interrupt Support Data +IntCntrBaseAddr ds.l 1 ; 100, irp+ec0 ; Interrupt Controller Base Address (variable is used since this is a PCI Dev and address is relocatable) +IntPendingReg ds.l 2 ; 104, irp+ec4 ; Data of current interrupts pending register + + ; These fields were added to report information about tightly-coupled L2 caches. + ; The inline L2 information should be used in situations where there is a CPU + ; card L2 cache that can coexist with a motherboard L2. + +InlineL2DSize ds.l 1 ; 10c, irp+ecc ; Size of in-line L2 Dcache +InlineL2ISize ds.l 1 ; 110, irp+ed0 ; Size of in-line L2 Icache +InlineL2Combined ds.w 1 ; 114, irp+ed4 ; 1 <- combined or no cache, 0 <- split cache +InlineL2IBlockSize ds.w 1 ; 116, irp+ed6 ; Block size of in-line I L2 cache +InlineL2DBlockSize ds.w 1 ; 118, irp+ed8 ; Block size of in-line D L2 cache +InlineL2IAssoc ds.w 1 ; 11a, irp+eda ; Associativity of L2 I +InlineL2DAssoc ds.w 1 ; 11c, irp+edc ; Associativity of L2 D + ds.w 1 ; 11e, irp+ede ; pad + + ; More Interrupt Support Data +IntsCompleted ds.l 2 ; 120, irp+ee0 ; completed interrupts + + ds.b $18 +Size equ * endr + ;_______________________________________________________________________ ; Diagnostic Info Record ; @@ -344,19 +455,52 @@ Size equ *-SystemInfo ; the NanoKernel, and from the NanoKernel to user mode software. ;_______________________________________________________________________ -nkDiagInfoPtr equ $5FFFEFE8 ; logical address of DiagnosticInfo record -nkDiagInfoVer equ $5FFFEFEC ; version number of DiagnosticInfo record -nkDiagInfoLen equ $5FFFEFEE ; length of DiagnosticInfo record +NKDiagInfoPtr equ $68FFEFE8 ; logical address of DiagnosticInfo record +NKDiagInfoVer equ $68FFEFEC ; version number of DiagnosticInfo record +NKDiagInfoLen equ $68FFEFEE ; length of DiagnosticInfo record -nkDiagInfo record 0,increment - ds.b 236 ; it WILL all fit in 256 bytes -DiagPOSTResult2 ds.l 1 ; POST results -DiagPOSTResult1 ds.l 1 ; POST results -DiagEmoRestart ds.l 1 ; Burn in restart flag -DiagWarmStartHigh ds.l 1 ; First long of native warm start (WLSC) -DiagWarmStartLow ds.l 1 ; Second long of native warm start (SamB) - align 32 ; pad to nice cache block alignment -Size equ *-nkDiagInfo +NKDiagInfo record 0,increment +BankMBFailOffset ds.l 1 ; 000 ; Mother Board RAM failure code +BankAFailOffset ds.l 1 ; 004 ; Bank A RAM failure code +BankBFailOffset ds.l 1 ; 008 ; Bank B RAM failure code +BankCFailOffset ds.l 1 ; 00c ; Bank C RAM failure code + +BankDFailOffset ds.l 1 ; 010 ; Bank D RAM failure code +BankEFailOffset ds.l 1 ; 014 ; Bank E RAM failure code +BankFFailOffset ds.l 1 ; 018 ; Bank F RAM failure code +BankGFailOffset ds.l 1 ; 01c ; Bank G RAM failure code + +BankHFailOffset ds.l 1 ; 020 ; Bank H RAM failure code +CacheFailOffset ds.l 1 ; 024 ; cache failure code +LongBootParamOffset ds.l 1 ; 028 ; on longBoot this is where the params will be +POSTTraceOffset ds.l 1 ; 02c ; this tells us what route the POST took + +POSTOldWarmOffset ds.l 1 ; 030 ; logged address of old warmstart flag +POSTOldLongOffset ds.l 1 ; 034 ; logged address of old long boot flag +POSTOldGlobbOffset ds.l 1 ; 038 ; logged address of old Diagnostic Info Record +POSTOldParamOffset ds.l 1 ; 03c ; the params from the old diag globb + +POSTStartRTCUOffset ds.l 1 ; 040 ; PPC Real Time Clock Upper at start of POST +POSTStartRTCLOffset ds.l 1 ; 044 ; PPC Real Time Clock Lower at start of POST +POSTEndRTCUOffset ds.l 1 ; 048 ; PPC Real Time Clock Upper at end of POST +POSTEndRTCLOffset ds.l 1 ; 04c ; PPC Real Time Clock Lower at end of POST + +POSTTestTypeOffset ds.l 1 ; 050 ; when long RAM tests fail test type which failed is put here +POSTError2Offset ds.l 1 ; 054 ; result codes from tests +POSTError3Offset ds.l 1 ; 058 ; result codes from tests +POSTError4Offset ds.l 1 ; 05c ; result codes from tests + +RegistersStore ds.b 140 ; 060 ; store all 60x registers here, still fit into 256 bytes size. + +; Everything BEFORE here is new (hence the funny-sized register store) + +DiagPOSTResult2 ds.l 1 ; 0ec ; POST results +DiagPOSTResult1 ds.l 1 ; 0f0 ; POST results +DiagLongBootSig ds.l 1 ; 0f4 ; Burn in restart flag +DiagWarmStartHigh ds.l 1 ; 0f8 ; First long of native warm start (WLSC) +DiagWarmStartLow ds.l 1 ; 0fc ; Second long of native warm start (SamB) + +Size equ * endr @@ -368,30 +512,278 @@ Size equ *-nkDiagInfo ; software. ;_______________________________________________________________________ -nkNanoKernelInfoPtr equ $5FFFEFE0 ; logical address of NanoKernelInfo record -nkNanoKernelInfoVer equ $5FFFEFE4 ; version number of NanoKernelInfo record -nkNanoKernelInfoLen equ $5FFFEFE6 ; length of NanoKernelInfo record +NKNanoKernelInfoPtr equ $68FFEFE0 ; logical address of NanoKernelInfo record +NKNanoKernelInfoVer equ $68FFEFE4 ; version number of NanoKernelInfo record +NKNanoKernelInfoLen equ $68FFEFE6 ; length of NanoKernelInfo record -nkNanoKernelInfo record 0,increment -ExceptionCauseCounts ds.l 32 ; counters per exception cause -NanoKernelCallCounts ds.l 16 ; counters per NanoKernel call -ExternalIntCount ds.l 1 ; count of External Interrupts -MisalignmentCount ds.l 1 ; count of Misalignment Interrupts -FPUReloadCount ds.l 1 ; count of FPU reloads on demand -DecrementerIntCount ds.l 1 ; count of Decrementer Interrupts -QuietWriteCount ds.l 1 ; count of Writes to Quiet Read-Only memory -HashTableCreateCount ds.l 1 ; count of Hash Table Entry creations -HashTableDeleteCount ds.l 1 ; count of Hash Table Entry deletions -HashTableOverflowCount ds.l 1 ; count of Hash Table Entry overflows -EmulatedUnimpInstCount ds.l 1 ; count of Emulated unimplemented instructions -NCBPtrCacheMissCount ds.l 1 ; count of NCB Pointer cache misses -ExceptionPropagateCount ds.l 1 ; count of Exceptions propagated to system -ExceptionForcedCount ds.l 1 ; count of Exceptions forced to system - align 8 ; align for 64 bit time base counters -SysContextCpuTime ds.l 2 ; CPU Time used by System Context -AltContextCpuTime ds.l 2 ; CPU Time used by Alternate Context - align 32 ; pad to nice cache block alignment -Size equ *-nkNanoKernelInfo +NKNanoKernelInfo record 0,increment +ExceptionCauseCounts ds.l 32 ; 000, kdp+dc0 ; counters per exception cause +NanoKernelCallCounts ds.l 16 ; 080, kdp+e40 ; counters per NanoKernel call +ExternalIntCount ds.l 1 ; 0c0, kdp+e80 ; count of External Interrupts +MisalignmentCount ds.l 1 ; 0c4, kdp+e84 ; count of Misalignment Interrupts +FPUReloadCount ds.l 1 ; 0c8, kdp+e88 ; count of FPU reloads on demand +DecrementerIntCount ds.l 1 ; 0cc, kdp+e8c ; count of Decrementer Interrupts +QuietWriteCount ds.l 1 ; 0d0, kdp+e90 ; count of Writes to Quiet Read-Only memory +HashTableCreateCount ds.l 1 ; 0d4, kdp+e94 ; count of Hash Table Entry creations +HashTableDeleteCount ds.l 1 ; 0d8, kdp+e98 ; count of Hash Table Entry deletions +HashTableOverflowCount ds.l 1 ; 0dc, kdp+e9c ; count of Hash Table Entry overflows +EmulatedUnimpInstCount ds.l 1 ; 0e0, kdp+ea0 ; count of Emulated unimplemented instructions +NCBPtrCacheMissCount ds.l 1 ; 0e4, kdp+ea4 ; count of NCB Pointer cache misses +ExceptionPropagateCount ds.l 1 ; 0e8, kdp+ea8 ; count of Exceptions propagated to system +ExceptionForcedCount ds.l 1 ; 0ec, kdp+eac ; count of Exceptions forced to system +SysContextCpuTime ds.l 2 ; 0f0, kdp+eb0 ; CPU Time used by System Context +AltContextCpuTime ds.l 2 ; 0f8, kdp+eb4 ; CPU Time used by Alternate Context + +; This stuff is new (starts at 0x100) + +blueProcessID ds.l 1 ; 100, kdp+ec0 ; ID of the blue process. +blueTaskID ds.l 1 ; 104, kdp+ec4 ; ID of the blue task. +pageQueueID ds.l 1 ; 108, kdp+ec8 ; ID of the page fault queue. +TaskCount ds.l 1 ; 10c, kdp+ecc ; Number of tasks. +FreePoolExtendCount ds.l 1 ; 110, kdp+ed0 ; Number of pages given to the nanokernel. + +;rsrv1 ds.l 3 ; 114, kdp+ed4 ; reserved??? + +; My additions + + org $11c +ConfigFlags ds.l 1 ; 11c, kdp+edc ; includes ScreenConsole ... TODO put flag equs here +NanodbgrFlagShift equ 1 +NanodbgrFlagBit equ 31 - NanodbgrFlagShift +LogFlagShift equ 3 +LogFlagBit equ 31 - LogFlagShift +; bit 31 always set on replacement, bit 27 set on replacement with ROM 2.7f3 or later + + org $128 +VMDispatchCountTblPtr ds.l 1 ; 128, kdp+ee8 + ds.l 1 + ds.l 1 +MPDispatchCountTblPtr ds.l 1 ; 134, kdp+ef4 ; ??????? +AddrSpcSetCtr ds.l 1 ; 138, kdp+ef8 ; incremented by SetAddrSpcRegisters +IDCtr ds.l 1 ; 13c, kdp+efc + + ds.b $20 +Size equ * + endr + + + +;_______________________________________________________________________ +; Processor Info Record +; +; Used to pass Processor information from the NanoKernel to user mode +; software. +;_______________________________________________________________________ + +ProcessorInfoPtr equ $68FFEFD8 ; logical address of ProcessorInfo record +ProcessorInfoVer equ $68FFEFDC ; version number of ProcessorInfo record +ProcessorInfoLen equ $68FFEFDE ; length of ProcessorInfo record + +ProcessorInfo record 0,increment +ProcessorVersionReg ds.l 1 ; 000, kdp+f20 ; contents of the PVR special purpose register +CpuClockRateHz ds.l 1 ; 004, kdp+f24 ; CPU Clock frequency +BusClockRateHz ds.l 1 ; 008, kdp+f28 ; Bus Clock frequency +DecClockRateHz ds.l 1 ; 00c, kdp+f2c ; Decrementer Clock frequency + +Ovr +PageSize ds.l 1 ; 010, kdp+f30 ; number of bytes in a memory page +DataCacheTotalSize ds.l 1 ; 014, kdp+f34 ; number of bytes in the Data Cache +InstCacheTotalSize ds.l 1 ; 018, kdp+f38 ; number of bytes in the Instruction Cache +CoherencyBlockSize ds.w 1 ; 01c, kdp+f3c ; number of bytes in a Coherency Block +ReservationGranuleSize ds.w 1 ; 01e, kdp+f3e ; number of bytes in a Reservation Granule +CombinedCaches ds.w 1 ; 020, kdp+f40 ; 1 <- combined or no cache, 0 <- split cache +InstCacheLineSize ds.w 1 ; 022, kdp+f42 ; number of bytes in a Line of the Instruction Cache +DataCacheLineSize ds.w 1 ; 024, kdp+f44 ; number of bytes in a Line of the Data Cache +DataCacheBlockSizeTouch ds.w 1 ; 026, kdp+f46 ; number of bytes in a Block for DCBT DCBTST +InstCacheBlockSize ds.w 1 ; 028, kdp+f48 ; number of bytes in a Block of the Instruction Cache +DataCacheBlockSize ds.w 1 ; 02a, kdp+f4a ; number of bytes in a Block of the Data Cache +InstCacheAssociativity ds.w 1 ; 02c, kdp+f4c ; Associativity of the Instruction Cache +DataCacheAssociativity ds.w 1 ; 02e, kdp+f4e ; Associativity of the Data Cache + +TransCacheTotalSize ds.w 1 ; 030, kdp+f50 ; number of entries in the Translation Cache +TransCacheAssociativity ds.w 1 ; 032, kdp+f52 ; Associativity of the Translation Cache +OvrEnd + +; These fields were added to report information about back-side L2 caches + +ProcessorL2DSize ds.l 1 ; 034, kdp+f54 ; Size of back-side L2 Dcache +ProcessorL2ISize ds.l 1 ; 038, kdp+f58 ; Size of back-side L2 Icache +ProcessorL2Combined ds.w 1 ; 03c, kdp+f5c ; 1 <- combined or no cache, 0 <- split cache +ProcessorL2IBlockSize ds.w 1 ; 03e, kdp+f5e ; Block size of back-side I L2 cache +ProcessorL2DBlockSize ds.w 1 ; 040, kdp+f60 ; Block size of back-side D L2 cache +ProcessorL2IAssoc ds.w 1 ; 042, kdp+f62 ; Associativity of L2 I +ProcessorL2DAssoc ds.w 1 ; 044, kdp+f64 ; Associativity of L2 D + +filler1 ds.w 1 ; 046, kdp+f66 ; align to long + +; ProcessorFlags - Definitions for the processor flags field. These are bit positions, +; as in 1 << hasVMX, and not masks. +hasL2CR equ 0 +hasPLRUL1 equ 1 +hasTAU equ 2 +hasVMX equ 3 +unknownFlag equ 4 +hasExtraBATs equ 5 +ProcessorFlags ds.l 1 ; 048, kdp+f68 ; flags to specify processor features + + align 5 ; pad to nice cache block alignment + + org $05e +SetToZero ds.w 1 ; 05e, kdp+f7e ; by same code that sets below +CpuClockRateHzCopy ds.l 1 ; 060, kdp+f80 ; copies by Init.s +BusClockRateHzCopy ds.l 1 ; 064, kdp+f84 ; copies by Init.s +DecClockRateHzCopy ds.l 1 ; 068, kdp+f88 ; copies by Init.s + + ds.b $34 +Size equ * + endr + + + +;_______________________________________________________________________ +; Hardware Info Record +; +; Used to pass hardware information from the NanoKernel to user mode +; software. +;_______________________________________________________________________ + +NKHWInfoPtr equ $68FFEFD0 ; logical address of HWInfo record +NKHWInfoVer equ $68FFEFD4 ; version number of HWInfo record +NKHWInfoLen equ $68FFEFD6 ; length of HWInfo record + +NKHWInfo record 0,increment +MacROM_Base ds.l 1 ; 000, irp+f00 ; base address (physical) of Mac ROM +DeviceTreeBase ds.l 1 ; 004, irp+f04 ; base address of the copied device tree properties +UniversalInfoTableBase ds.l 1 ; 008, irp+f08 ; base address of the Universal Info Table +ConfigInfoTableBase ds.l 1 ; 00c, irp+f0c ; base address of the Config Info Table +VectorLookupTable ds.l 1 ; 010, irp+f10 ; base address of the interrupt vector lookup table (short *) +VectorMaskTable ds.l 1 ; 014, irp+f14 ; base address of the interrupt vector mask table (long *) + +OpenPICBaseAddr ds.l 1 ; 018, irp+f18 ; OpenPIC base address + +ISAMaster8259 ds.l 1 ; 01c, irp+f1c ; ISA Master 8259 ports (char *) +ISASlave8259 ds.l 1 ; 020, irp+f20 ; ISA Slave 8259 ports (char *) +InterruptAck8259 ds.l 1 ; 024, irp+f24 ; address to read to ack 8259 interrupt (long *) + + ; interrupt pending bits (actively changing) + +PendingInts ds.l 2 ; 028, irp+f28 ; 64 bits of pending interrupts + + ; some Mac I/O device base addresses + +ADB_Base ds.l 1 ; 030, irp+f30 ; base address of ADB +SCSI_DMA_Base ds.l 1 ; 034, irp+f34 ; base address of SCSI DMA registers + + ; RTAS related stuff + +RTAS_PrivDataArea ds.l 1 ; 038, irp+f38 ; RTAS private data area +MacOS_NVRAM_Offset ds.l 1 ; 03c, irp+f3c ; offset into nvram to MacOS data + +RTAS_NVRAM_Fetch ds.l 1 ; 040, irp+f40 ; token for RTAS NVRAM fetch +RTAS_NVRAM_Store ds.l 1 ; 044, irp+f44 ; token for RTAS NVRAM store +RTAS_Get_Clock ds.l 1 ; 048, irp+f48 ; token for RTAS clock get +RTAS_Set_Clock ds.l 1 ; 04c, irp+f4c ; token for RTAS clock set +RTAS_Restart ds.l 1 ; 050, irp+f50 ; token for RTAS Restart +RTAS_Shutdown ds.l 1 ; 054, irp+f54 ; token for RTAS Shutdown +RTAS_Restart_At ds.l 1 ; 058, irp+f58 ; token for RTAS system startup at specified time +RTAS_EventScan ds.l 1 ; 05c, irp+f5c ; token for RTAS event scan +RTAS_Check_Exception ds.l 1 ; 060, irp+f60 ; token for RTAS check exception +RTAS_Read_PCI_Config ds.l 1 ; 064, irp+f64 ; token for RTAS read PCI config +RTAS_Write_PCI_Config ds.l 1 ; 068, irp+f68 ; token for RTAS write PCI config + + ; SIO interrupt source numbers for the MPIC + +SIOIntVect ds.w 1 ; 06c, irp+f6c ; SIO (8259 cascade vector) vector number +SIOIntBit ds.w 1 ; 06e, irp+f6e ; SIO (8259 cascade vector) bit number + +Signature ds.l 1 ; 070, irp+f70 ; signature for this record ('Hnfo') + + ; more interrupt source numbers + +SpuriousIntVect ds.w 1 ; 074, irp+f74 ; spurious vector number + +CPU_ID ds.w 1 ; 076, irp+f76 ; the ID of this CPU (universal-tables-related) + +SCCAIntVect ds.w 1 ; 078, irp+f78 ; SCC A (non-DMA) vector number +SCCBIntVect ds.w 1 ; 07a, irp+f7a ; SCC B (non-DMA) vector number +SCSIIntVect ds.w 1 ; 07c, irp+f7c ; SCSI vector number +SCSIDMAIntVect ds.w 1 ; 07e, irp+f7e ; SCSI DMA vector number +VIAIntVect ds.w 1 ; 080, irp+f80 ; VIA vector number +VIAIntBit ds.w 1 ; 082, irp+f82 ; VIA bit number +ADBIntVect ds.w 1 ; 084, irp+f84 ; vector number +NMIIntVect ds.w 1 ; 086, irp+f86 ; NMI vector number +NMIIntBit ds.w 1 ; 088, irp+f88 ; NMI bit number + + ; current (actively changing) interrupt handling variables + +ISAPendingInt ds.w 1 ; 08a, irp+f8a ; currently pending ISA/8259 interrupt +CompletedInts ds.b 8 ; 08c, irp+f8c ; completed interrupts + +nkHWInfoFlagSlowMESH equ 1 ; set if fast MESH doesn't work on this box +nkHWInfoFlagAsynchMESH equ 2 ; set if Synchronous MESH doesn't work on this box +nkHWInfoFlagNoCopySWTLB equ 4 ; set if the software TLB walk code for 603 should NOT be copied +HardwareInfoFlags ds.l 1 ; 094, irp+f94 ; 32 bits of flags (see enum above) + +RTAS_Get_PowerOn_Time ds.l 1 ; 098, irp+f98 ; token for RTAS getting time for system startup + + ds.b $24 +Size equ * + endr + + + +;_______________________________________________________________________ +; Processor State Record +; +; Used to save the state of the processor across sleep. +;_______________________________________________________________________ + +NKProcessorStatePtr equ $68FFEFC8 ; logical address of ProcessorState record +NKProcessorStateVer equ $68FFEFCC ; version number of ProcessorState record +NKProcessorStateLen equ $68FFEFCE ; length of ProcessorState record + +NKProcessorState record 0,increment +saveDBAT0u ds.l 1 ; 000 ; place to store DBAT0U +saveDBAT0l ds.l 1 ; 004 ; place to store DBAT0L +saveDBAT1u ds.l 1 ; 008 ; place to store DBAT1U +saveDBAT1l ds.l 1 ; 00c ; place to store DBAT1L +saveDBAT2u ds.l 1 ; 010 ; place to store DBAT2U +saveDBAT2l ds.l 1 ; 014 ; place to store DBAT2L +saveDBAT3u ds.l 1 ; 018 ; place to store DBAT3U +saveDBAT3l ds.l 1 ; 01c ; place to store DBAT3L + +saveIBAT0u ds.l 1 ; 020 ; place to store IBAT0U +saveIBAT0l ds.l 1 ; 024 ; place to store IBAT0L +saveIBAT1u ds.l 1 ; 028 ; place to store IBAT1U +saveIBAT1l ds.l 1 ; 02c ; place to store IBAT1L +saveIBAT2u ds.l 1 ; 030 ; place to store IBAT2U +saveIBAT2l ds.l 1 ; 034 ; place to store IBAT2L +saveIBAT3u ds.l 1 ; 038 ; place to store IBAT3U +saveIBAT3l ds.l 1 ; 03c ; place to store IBAT3L + +saveSPRG0 ds.l 1 ; 040 ; place to store SPRG0 +saveSPRG1 ds.l 1 ; 044 ; place to store SPRG1 +saveSPRG2 ds.l 1 ; 048 ; place to store SPRG2 +saveSPRG3 ds.l 1 ; 04c ; place to store SPRG3 + +saveL2CR ds.l 1 ; 050 ; place to store Arthur's L2CR + +saveSRR0 ds.l 1 ; 054 ; place to store SRR0 +saveSRR1 ds.l 1 ; 058 ; place to store SRR1 +saveTBU ds.l 1 ; 05c ; place to store TBU +saveTBL ds.l 1 ; 060 ; place to store TBL +saveHID0 ds.l 1 ; 064 ; place to store HID0 +saveDEC ds.l 1 ; 068 ; place to store DEC +saveMSR ds.l 1 ; 06c ; place to store MSR +saveSDR1 ds.l 1 ; 070 ; place to store SDR1 + + ; saveKernelDataPtr needs to always be right after saveReturnAddr + ; because of how the code works. DO NOT CHANGE THIS ORDERING! + +saveReturnAddr ds.l 1 ; 074 ; place to store the addr to jump to. +saveKernelDataPtr ds.l 1 ; 078 ; place to store the KernelDataPtr +saveContextPtr ds.l 1 ; 07c ; place to store the ContextPtr +Size equ * endr diff --git a/Internal/Asm/ResourceMgrPriv.a b/Internal/Asm/ResourceMgrPriv.a index 90da301..1f555e7 100644 --- a/Internal/Asm/ResourceMgrPriv.a +++ b/Internal/Asm/ResourceMgrPriv.a @@ -104,7 +104,7 @@ kPreventFileFromBeingClosedMask equ 16 kAllOverrideAttributesMask equ kOverrideNextMapMask + \ kDontCountOrIndexDuplicatesMask + \ kTwoDeepMask + \ - kPreventFileFromBeingClosedMask + kPreventFileFromBeingClosedMask + 32 + 64 + 128 kAllButOverrideAttributesMask equ 255 - kAllOverrideAttributesMask selectMakeOverrideMap equ 4 diff --git a/Internal/Asm/SysPrivateEqu.a b/Internal/Asm/SysPrivateEqu.a index 301cf1b..cc6234b 100644 --- a/Internal/Asm/SysPrivateEqu.a +++ b/Internal/Asm/SysPrivateEqu.a @@ -436,11 +436,13 @@ emExpansionBusGlobals ds.l 1 ; Pointer to Expansion Bus Manager Globals jSWModemSoundVector ds.l 1 ; Vector to control routine for software modem sound + ds.b 270 + ; NOTE: When adding new fields here, be sure to update the high-level language header files as well ; (currently {CInternal}ExpandMemPriv.h is the one) ; Be sure to update the Reality sources when you change this file (and the version number) -emCurVersion EQU $0133 ; version +emCurVersion EQU $016b ; version emRecSize equ * ; size for this version size equ * diff --git a/Internal/Asm/VectorTableInit.a b/Internal/Asm/VectorTableInit.a index d240bad..06afd27 100644 --- a/Internal/Asm/VectorTableInit.a +++ b/Internal/Asm/VectorTableInit.a @@ -118,13 +118,13 @@ InitVec&TVec proc export ; initialize the vector table vector Endif - ; fill in the unused "holes" with the address of UNIMPLEMENTED + ; fill in the unused "holes" with the address of BADTRAP If (&thisCVect - &lastCVect) > 4 Then - import UNIMPLEMENTED + import BADTRAP - dcb.l (&thisCVect - &lastCVect - 4)/4 ,UNIMPLEMENTED-BASEOFROM+ROMBASE + dcb.l (&thisCVect - &lastCVect - 4)/4 ,BADTRAP-BASEOFROM+ROMBASE Endif diff --git a/Internal/Asm/egretequ.a b/Internal/Asm/egretequ.a index 7d8629e..be7745e 100644 --- a/Internal/Asm/egretequ.a +++ b/Internal/Asm/egretequ.a @@ -109,6 +109,7 @@ ContinueComp ds.l 1 ; vector to power message continue procedure deferredPDM ds.l 1 ; pointer to PDM deferred task to post alert prevPollStack ds.l 1 ; keep address of any other poll stack SpareComp3 ds.l 1 ; spare vector #3 + ds.b $178-$64 ; new EgretGlobSize EQU * ENDR @@ -273,7 +274,8 @@ EnDisPDM equ $21 ; Enable/Disable PowerDown Message RdWrIIC equ $22 ; Read or Write IIC (I sqared C) [rbm]<3> WakeUpMode equ $23 ; Enable/Disable WakeUpMode TimerTickle equ $24 ; ShutDown Timer Tickle -MaxPseudoCmd equ TimerTickle ; largest possible pseudo command number +; more commands apparently added +MaxPseudoCmd equ $2A ; largest possible pseudo command number ; ;__________________________________________________________________________________________________ diff --git a/Make/Build b/Make/Build index 6016ea5..b797f01 100644 --- a/Make/Build +++ b/Make/Build @@ -285,7 +285,7 @@ Exit 1 End - "{Sources}Tools:Make" -w {MOpts} {Targets} -f "{MakeFile}" > "{MakeOut}" || Exit + Make -w {MOpts} {Targets} -f "{MakeFile}" > "{MakeOut}" || Exit If {EchoCmds} Set Echo 1 diff --git a/Make/FeatureList b/Make/FeatureList index c6913ef..42e3e74 100644 --- a/Make/FeatureList +++ b/Make/FeatureList @@ -13,6 +13,12 @@ # # Change History (most recent first): # +# 1/29/17 HQX Add conditionals for "Custer" (Mirrored Drive Door G4 ROM v10.2.1) +# resources, change TNTPlus to hasPCI. +# 1/9/17 HQX Add Classic flag +# 12/28/16 HQX Finally realise how this works. Patch to emulate the missing +# "ParseFeatures" command. Added NewWorld and TNTPlus flags. +# # 12/13/93 PN Roll in KAOs and Horror changes to support Malcom and AJ # machines # 11/10/93 fau Update from SuperMunggio . @@ -64,7 +70,28 @@ # # -Set AvailableFeatures "hasROMGibbly ¶ +Set cdg5Features "¶ + Vanilla ¶ + LatestHack ¶ + hasPCI ¶ + BlueBox ¶ + NewWorld ¶ + CusterBacklightParcel ¶ + CusterUSBShimKeyboard ¶ + cdg5HappyMac ¶ + NKDebugShim ¶ + NKShowLog ¶ + ExtraNKLogging ¶ + DebugAlways ¶ + SkipTbxiValidation ¶ + TbxiPatchG4Version ¶ + TbxiDisableAppleKiwi ¶ + Wedge ¶ +" + +Set AvailableFeatures "{cdg5Features} ¶ + hasBCScreen ¶ + hasROMGibbly ¶ hasManEject ¶ hasCacheTypeCPU ¶ forPDMProto ¶ @@ -197,12 +224,25 @@ Set AvailableFeatures "hasROMGibbly useROMFonts " - If "` ParseFeatures -a "{AvailableFeatures}" -f ": ROM {1}" `" =~ /': ROM '(Å)¨1/ - Set Defines "{¨1}" - Else - Exit 1 - End + +# # ParseFeatures is lost to the ages... +# If "` ParseFeatures -a "{AvailableFeatures}" -f ": ROM {1}" `" =~ /': ROM '(Å)¨1/ +# Set Defines "{¨1}" +# Else +# Exit 1 +# End + +# Set Defines "-d " + + # This block of code replaces it... + For Feature in {AvailableFeatures} + Set Defines "{Defines} -d {Feature}=`Evaluate " {1} " =~ /Å {Feature} Å/`" + End + + # Ugh! + Set Defines "`Echo {Defines} | StreamEdit -e '¥,° Replace /=1/ "=TRUE" -c °' -e '¥,° Replace /=0/ "=FALSE" -c °'`" + For Override in {2} If "{Override}" =~ /(Å)¨1=(Å)¨2/ @@ -214,9 +254,9 @@ Set AvailableFeatures "hasROMGibbly End If {Value} =~ /true/ - Set Value TRUE + Set Value 1 #TRUE # to allow overrides to work right! Else If {Value} =~ /false/ - Set Value FALSE + Set Value 0 #FALSE End If "{Defines}" =~ /(Å)¨3{Name}=[Â ¶t]+(Å)¨4/ diff --git a/Make/MainCode.Make b/Make/MainCode.Make index a7fc664..c69bca3 100644 --- a/Make/MainCode.Make +++ b/Make/MainCode.Make @@ -54,30 +54,23 @@ MainCodeLibs = "{MiscDir}GoNativeROMLib.o" ¶ "{LibDir}SlotMgr.lib" ¶ "{LibDir}SCSI.lib" ¶ - "{LibDir}SCSI4pt3.lib" ¶ "{LibDir}HFS.lib" ¶ - "{LibDir}PPC.lib" ¶ "{LibDir}ADBMgr.lib" ¶ - "{LibDir}TimeMgr.lib" ¶ "{LibDir}Toolbox.lib" ¶ - "{LibDir}CommToolboxPatch.Lib" ¶ "{LibDir}MemoryMgr.lib" ¶ "{LibDir}AliasMgr.lib" ¶ "{LibDir}ComponentMgr.lib" ¶ "{LibDir}DataAccessMgr.lib" ¶ - "{LibDir}EditionMgr.lib" ¶ "{LibDir}ExpansionBusMgr.lib" ¶ - "{LibDir}HelpMgr.lib" ¶ - "{LibDir}SoundMgr.lib" ¶ "{LibDir}Gestalt.lib" ¶ - "{LibDir}IconUtils.lib" ¶ "{LibDir}NotificationMgr.lib" ¶ - "{LibDir}PictUtilities.lib" ¶ "{LibDir}ToolboxEventMgr.lib" ¶ "{LibDir}ControlMgr.lib" ¶ "{LibDir}DisplayMgr.lib" ¶ "{LibDir}WindowMgr.lib" ¶ "{LibDir}MenuMgr.lib" ¶ + "{LibDir}ATAMgr.lib" ¶ + "{ObjDir}DeviceMgr.a.o" ¶ # ¶ # DispatchHelper and DialogMgr.lib need to be colocated ¶ # ¶ @@ -89,15 +82,8 @@ MainCodeLibs = "{LibDir}ResourceMgr.lib" ¶ "{LibDir}ScriptMgr.lib" ¶ "{LibDir}CQD.lib" ¶ - "{LibDir}TextServicesMgr.lib" ¶ "{LibDir}FontMgr.lib" ¶ - "{LibDir}RomInterface.Lib" ¶ - "{LibDir}RomStandardLib.lib" ¶ - "{LibDir}StartTest.lib" ¶ - "{LibDir}VideoDriver.lib" ¶ - "{ObjDir}WallyWorld.a.o" ¶ - "{ObjDir}FPEmulation.a.o" ¶ - "{LibDir}Beep.lib" ¶ + "{LibDir}Lastly.lib" ¶ # ¶ # Keep DispTable at end ¶ # ¶ @@ -118,7 +104,7 @@ MainCodeLibs = # # Vectorization # -"{LibDir}MainCode.Lib" Ä {MainCodeLibs} "{ObjDir}VectorTablePatch.a.o" +"{LibDir}MainCode.Lib" Ä {MainCodeLibs} "{ObjDir}VectorTablePatch.a.o" "{ToolDir}Vectorize" "{ToolDir}Vectorize" -w -v "{ObjDir}VectorTablePatch.a.o" -log "{TextDir}MainCode.Sym" {StdVOpts} -o "{Targ}" {MainCodeLibs} "{ObjDir}VectorTablePatch.a.o" Ä "{Sources}Make:VectorTable.a" "{IntAIncludes}VectorTablePatch.a" diff --git a/Make/RISC.make b/Make/RISC.make index 31b0c0f..d71d569 100644 --- a/Make/RISC.make +++ b/Make/RISC.make @@ -162,26 +162,21 @@ IntAIncludes = {Sources}Internal:Asm: IntCIncludes = {Sources}Internal:C: IntPInterfaces = {Sources}Internal:Pascal: IntRIncludes = {Sources}Internal:Rez: -Libraries = {Sources}Libs:Libraries: -CLibraries = {Sources}Libs:CLibraries: -PLibraries = {Sources}Libs:PLibraries: -MAOpts = -d TRUE=1 -d FALSE=0 -d Alignment=8 -d CPU=20 -d ROMRelease=$D4C1 -wb -d SubRelease=3 -blksize 62 -MCOpts = -d TRUE=1 -d FALSE=0 -d Alignment=8 -d CPU=20 -d ROMRelease=$D4C1 -b3 -mbg full -mc68020 -blksize 62 -opt full +MAOpts = -d TRUE=1 -d FALSE=0 -d Alignment=8 -d CPU=20 -d ROMRelease=$45F6 -wb -d SubRelease=1 -blksize 62 +MCOpts = -d TRUE=1 -d FALSE=0 -d Alignment=8 -d CPU=20 -d ROMRelease=$45F6 -b3 -mbg full -mc68020 -blksize 62 -opt full MPOpts = -mbg full -mc68020 -RomBase = $40800000 +RomBase = $FFC00000 Features = hasRISCV0ResMgrPatches ¶ hasDoubleByte ¶ - hasAMIC ¶ SupportNativeComponents ¶ Script_Char_Extra ¶ hasPenFraction ¶ hasFullKerning ¶ hasGlyphState ¶ - hasNewHeapMgr ¶ hasPDMMaceEnet ¶ hasAppleTalkInROM ¶ hasMixedMode ¶ @@ -189,9 +184,7 @@ Features = hasRISCV0ResMgrPatches hasSCSIDiskModeFeature ¶ hasSysSevenResources ¶ hasDataAccessPACK ¶ - hasYMCA ¶ hasCPUIDRegister ¶ - hasHMC ¶ has2MegROMOrMore ¶ hasVideoIn ¶ hasAsyncSCSI ¶ @@ -208,7 +201,6 @@ Features = hasRISCV0ResMgrPatches forLocalizability ¶ has040MMU ¶ hasADBKeyLayouts ¶ - hasASC ¶ hasAliasMgr ¶ hasApple2Fonts ¶ hasAppleEventMgr ¶ @@ -216,49 +208,25 @@ Features = hasRISCV0ResMgrPatches hasBattery ¶ hasCommToolbox ¶ hasCQD ¶ - hasDAFB ¶ - hasDJMEMC ¶ - hasDataAccessMgr ¶ hasDisplayMgr ¶ hasDisplayMgrWindows ¶ hasEDisk ¶ - hasEclipseVIA2 ¶ - hasEditionMgr ¶ hasEgret ¶ hasExtendedCharacterSet ¶ - hasFMC ¶ hasGDU ¶ - hasGlue ¶ - hasGrandCentral ¶ hasIdle ¶ - hasIopScc ¶ - hasIopSwim ¶ - hasJaws ¶ - hasMDU ¶ - hasMMU ¶ - hasMSC ¶ - hasMac2VIA2 ¶ - hasNetBoot ¶ - hasNiagra ¶ - hasOrwell ¶ - hasOss ¶ - hasPratt ¶ hasProtectedPRAM ¶ hasSCSI96 ¶ hasSWIM2 ¶ - hasSwim3 ¶ hasSlotMgr ¶ - hasSonora ¶ hasSplineFonts ¶ hasVDAC ¶ hasVIAClock ¶ hasVISA2 ¶ - hasVISADecoder ¶ hasWaimeaVIA2 ¶ isUniversal ¶ hasPwrControls ¶ hasPwrMgrClock ¶ - hasRBV ¶ hasSplineFonts ¶ hasVIAClock ¶ hasWaimeaVIA2 ¶ @@ -267,6 +235,8 @@ Features = hasRISCV0ResMgrPatches onHafMac ¶ onMac32 ¶ onNuMac ¶ + hasBCScreen ¶ + hasMMU ¶ ForROM @@ -340,9 +310,6 @@ FeatureSet Set CIncludes "{CIncludes}" Set PInterfaces "{PInterfaces}" Set RIncludes "{RIncludes}" - Set Libraries "{Libraries}" - Set CLibraries "{CLibraries}" - Set PLibraries "{PLibraries}" Set StdAOpts "{MAOpts} {FeatureSet} -i {IntAIncludes} {AOpts} -i {ObjDir}" Set StdCOpts "{MCOpts} {FeatureSet} -i {IntCIncludes} {COpts}" Set StdCPOpts "{MCPOpts} {FeatureSet} -i {IntCIncludes} {COpts}" @@ -381,10 +348,10 @@ Clean #include {ToolSrcDir}Tools.make -#include {MakeDir}MainCode.make - -#include {DeclDir}DeclData.make - #include {DriverDir}Drivers.make -#include {ResourceDir}Resources.make +#include {MakeDir}MainCode.make + +##include {DeclDir}DeclData.make + +##include {ResourceDir}Resources.make diff --git a/Make/VectorTable.a b/Make/VectorTable.a index 4b260a1..541ffe8 100644 --- a/Make/VectorTable.a +++ b/Make/VectorTable.a @@ -221,6 +221,7 @@ ; $2080 - Time Manager ; $2084 - Window Mananger ; $2088 - Figment Memory Manager +; $208c - Expansion Bus Manager ;Global Vector Table Code Dispatch Source ;Identifier Macro Vector Vector Register File @@ -330,21 +331,21 @@ SETRESPONSEPARAMS vIndirect $2010, $0040, A7 ; {sources}OS:EgretMgr.a TICKHANDLER vIndirect $2010, $0044, A7 ; {sources}OS:EgretMgr.a PSEUDOCNTTABLE vDataTable ; {sources}OS:EgretMgr.a ADBCNTTABLE vDataTable ; {sources}OS:EgretMgr.a -EGRETINIT vIndirect $2010, $0048, A7 ; {sources}OS:EgretMgr.a +;EGRETINIT vIndirect $2010, $0048, A7 ; {sources}OS:EgretMgr.a SENDEGRETCMD vNoVector ; {sources}OS:EgretMgr.a -ECLIPSEPDMPATCH vIndirect $2010, $004c, A7 ; {sources}OS:EgretMgr.a -KEYSWITCHHANDLER vIndirect $2010, $0050, A7 ; {sources}OS:EgretMgr.a -ECLIPSEDFACPATCH vIndirect $2010, $0054, A7 ; {sources}OS:EgretMgr.a -DEBUGUTILRUNKBDPATCH vIndirect $2010, $0058, A7 ; {sources}OS:EgretMgr.a +;ECLIPSEPDMPATCH vIndirect $2010, $004c, A7 ; {sources}OS:EgretMgr.a +;KEYSWITCHHANDLER vIndirect $2010, $0050, A7 ; {sources}OS:EgretMgr.a +;ECLIPSEDFACPATCH vIndirect $2010, $0054, A7 ; {sources}OS:EgretMgr.a +;DEBUGUTILRUNKBDPATCH vIndirect $2010, $0058, A7 ; {sources}OS:EgretMgr.a CUDAEGRETCODE vDataTable ; {sources}OS:EgretMgr.a -EGRETDFACANDPDM vIndirect $2010, $005c, A7 ; {sources}OS:EgretMgr.a -CACHEINSTALL vIndirect $2010, $0060, A7 ; {sources}OS:HFS:Cache:DiskCache.a +;EGRETDFACANDPDM vIndirect $2010, $005c, A7 ; {sources}OS:EgretMgr.a +;CACHEINSTALL vIndirect $2010, $0060, A7 ; {sources}OS:HFS:Cache:DiskCache.a CHKFIRMWARE vIndirect $2010, $0064, A7 ; {sources}OS:EgretMgr.a -INSTALLFPSP vIndirect $2010, $0068, A7, has040MMU ; {sources}OS:FPUEmulation:FPEmulation.a -NEWGESTALTSELECTORS vIndirect $2010, $006c, A7 ; {sources}OS:Gestalt:GestaltExtensions.a +;INSTALLFPSP vIndirect $2010, $0068, A7, has040MMU ; {sources}OS:FPUEmulation:FPEmulation.a +;NEWGESTALTSELECTORS vIndirect $2010, $006c, A7 ; {sources}OS:Gestalt:GestaltExtensions.a GESTALTTRAP vATrap A??? ; {sources}OS:Gestalt:GestaltFunction.a -newGestalt vIndirect $2010, $0070, A7 ; {sources}OS:Gestalt:GestaltLookup.c -findLong vIndirect $2010, $0074, A7 ; {sources}OS:Gestalt:GestaltLookup.c +;newGestalt vIndirect $2010, $0070, A7 ; {sources}OS:Gestalt:GestaltLookup.c +;findLong vIndirect $2010, $0074, A7 ; {sources}OS:Gestalt:GestaltLookup.c HWPRIV vATrap A??? ; {sources}OS:HwPriv.a SWAPICACHE vIndirect $2010, $0078, A7 ; {sources}OS:HwPriv.a FLUSHICACHE vIndirect $2010, $007c, A7 ; {sources}OS:HwPriv.a @@ -355,7 +356,7 @@ FLUSHEXTCACHE vIndirect $2010, $008c, A7 ; {sources}OS:HwPriv.a SWAPSERIALCLOCK vIndirect $2010, $0090, A7 ; {sources}OS:HwPriv.a FLUSHCRANGEFORBM vNoVector ; {sources}OS:HwPriv.a FLUSHCRANGE vIndirect $2010, $0094, A7 ; {sources}OS:HwPriv.a -WAITFORSCSIDEVS vIndirect $2010, $0098, A7 ; {sources}OS:HwPriv.a +;WAITFORSCSIDEVS vIndirect $2010, $0098, A7 ; {sources}OS:HwPriv.a MEMORYDISPATCH vNoVector ; {sources}OS:HwPriv.a HOLDMEMORYPROC vNoVector ; {sources}OS:HwPriv.a UNHOLDMEMORYPROC vNoVector ; {sources}OS:HwPriv.a @@ -372,13 +373,13 @@ MMUSETWRITEPROTECT vNoVector ; {sources}OS:HwPriv.a MMUSETCACHEINHIBIT vNoVector ; {sources}OS:HwPriv.a MMUSETCACHEMODE vNoVector ; {sources}OS:HwPriv.a MMUFLUSHATC vNoVector ; {sources}OS:HwPriv.a -; UNUSED vIndirect $2010, $009C ; +MAKESOMETHINGWRITETHROUGH vIndirect $2010, $009C, A7 ; {sources}OS:HwPriv.a IOPMGR vNoVector ; {sources}OS:IOPMgr.a -IOPINFOACCESS vIndirect $2010, $00a0, A7 ; {sources}OS:IOPMgr.a -IOPMSGREQUEST vIndirect $2010, $00a4, A7 ; {sources}OS:IOPMgr.a -IOPMOVEDATA vIndirect $2010, $00a8, A7 ; {sources}OS:IOPMgr.a +;IOPINFOACCESS vIndirect $2010, $00a0, A7 ; {sources}OS:IOPMgr.a +;IOPMSGREQUEST vIndirect $2010, $00a4, A7 ; {sources}OS:IOPMgr.a +;IOPMOVEDATA vIndirect $2010, $00a8, A7 ; {sources}OS:IOPMgr.a IOPINTERRUPT vDirect ???? ; {sources}OS:IOPMgr.a -MOVEREQHANDLER vIndirect $2010, $00ac, A7 ; {sources}OS:IOPMgr.a +;MOVEREQHANDLER vIndirect $2010, $00ac, A7 ; {sources}OS:IOPMgr.a INITIOPMGR vNoVector ; {sources}OS:IOPMgr.a SCCIOPBYPASS vNoVector ; {sources}OS:IOPMgr.a SCCIOPHWINIT vNoVector ; {sources}OS:IOPMgr.a @@ -422,7 +423,7 @@ PMGROP vATrap A??? ; {sources}OS:PowerMgr:PowerMgr.a IDLEMIND vNoVector ; {sources}OS:PowerMgr:PowerMgr.a GOTOSLEEP vATrap A??? ; {sources}OS:PowerMgr:PowerMgr.a WAKEUP vNoVector ; {sources}OS:PowerMgr:PowerMgr.a -SETSUPERVISORMODE vIndirect $2010, $00b8, A7, hasPwrControls ; {sources}OS:PowerMgr:PowerMgr.a +;SETSUPERVISORMODE vIndirect $2010, $00b8, A7, hasPwrControls ; {sources}OS:PowerMgr:PowerMgr.a DISPATCHER vNoVector ; {sources}OS:TrapDispatcher:Dispatch.a GETTRAPADDRESSTRAP vATrap A??? ; {sources}OS:TrapDispatcher:Dispatch.a SETTRAPADDRESSTRAP vATrap A??? ; {sources}OS:TrapDispatcher:Dispatch.a @@ -430,7 +431,7 @@ CACHEFLUSH vDirect ???? ; {sources}OS:TrapDispatcher:Dispatch.a VCACHEFLUSH vDirect ???? ; {sources}OS:TrapDispatcher:Dispatch.a INITDISPATCHER vNoVector ; {sources}OS:TrapDispatcher:Dispatch.a BADTRAP vIndirect $2010, $00bc, A7 ; {sources}OS:TrapDispatcher:Dispatch.a -TRAPADDRESSBITS vIndirect $2010, $00c0, A7 ; {sources}OS:TrapDispatcher:Dispatch.a +;TRAPADDRESSBITS vIndirect $2010, $00c0, A7 ; {sources}OS:TrapDispatcher:Dispatch.a UNIVERSAL vNoVector ; {sources}OS:Universal.a JUMPINTOROM vNoVector ; {sources}OS:Universal.a INITVIAS vNoVector ; {sources}OS:Universal.a @@ -483,7 +484,7 @@ RELTIMETASK vNoVector ; {sources}OS:sysUtil.a ; UNUSED vATrap A??? ; {sources}Patches:MiscPatches.a INITAPP vIndirect $2010, $00c8, A7 ; {sources}Patches:MiscPatches.a CLEANUPAPP vATrap A??? ; {sources}Patches:MiscPatches.a -MISCPATCHESINSTALL vIndirect $2010, $00cc, A7 ; {sources}Patches:MiscPatches.a +;MISCPATCHESINSTALL vIndirect $2010, $00cc, A7 ; {sources}Patches:MiscPatches.a PACK8 vATrap A??? ; {sources}Toolbox:AppleEventMgr:AEPackEntry.a @@ -509,9 +510,9 @@ GETNEWCONTROL vATrap A??? ; {sources}Toolbox:GetMgr:GetMgr.a GETMENU vATrap A??? ; {sources}Toolbox:GetMgr:GetMgr.a GETNEWMBAR vATrap A??? ; {sources}Toolbox:GetMgr:GetMgr.a GETMGREND vNoVector ; {sources}Toolbox:GetMgr:GetMgr.a -INSTALLPRIVTRAP vIndirect $2010, $00d8, A7, has040MMU ; {sources}Toolbox:InSANE:FPPrivTrap.a -PRIVTRAP881 vIndirect $2010, $00dc, A7, has040MMU ; {sources}Toolbox:InSANE:FPPrivTrap.a -PRIVTRAP040 vIndirect $2010, $00e0, A7, has040MMU ; {sources}Toolbox:InSANE:FPPrivTrap.a +;INSTALLPRIVTRAP vIndirect $2010, $00d8, A7, has040MMU ; {sources}Toolbox:InSANE:FPPrivTrap.a +;PRIVTRAP881 vIndirect $2010, $00dc, A7, has040MMU ; {sources}Toolbox:InSANE:FPPrivTrap.a +;PRIVTRAP040 vIndirect $2010, $00e0, A7, has040MMU ; {sources}Toolbox:InSANE:FPPrivTrap.a PACKDISPATCHER vIndirect $2010, $00e4, A7 ; {sources}Toolbox:PackageMgr.a INITPACK vATrap A??? ; {sources}Toolbox:PackageMgr.a INITALLPACKS vATrap A??? ; {sources}Toolbox:PackageMgr.a @@ -540,6 +541,19 @@ EMT1010 vDirect ???? ; {sources}Objects:ROM:Dispatch.a.o BASEOFROM vDataTable ; {sources}Objects:ROM:StartTop.a.o ; UNUSED vIndirect $2010, $00ec, A7 ; {sources} +MISCELLANEOUS_VEC00F0 vIndirect $2010, $00f0, A7 +MISCELLANEOUS_VEC00F4 vIndirect $2010, $00f4, A7 +MISCELLANEOUS_VEC00F8 vIndirect $2010, $00f8, A7 +MISCELLANEOUS_VEC00FC vIndirect $2010, $00fc, A7 +MISCELLANEOUS_VEC0100 vIndirect $2010, $0100, A7 +MISCELLANEOUS_VEC0104 vIndirect $2010, $0104, A7 +MISCELLANEOUS_VEC0108 vIndirect $2010, $0108, A7 +MISCELLANEOUS_VEC010C vIndirect $2010, $010c, A7 +MISCELLANEOUS_VEC0110 vIndirect $2010, $0110, A7 +MISCELLANEOUS_VEC0114 vIndirect $2010, $0114, A7 +MISCELLANEOUS_VEC0118 vIndirect $2010, $0118, A7 +MISCELLANEOUS_VEC011C vIndirect $2010, $011c, A7 + ;============================== End Misc. Vectors ;============================== Public Vectors @@ -552,13 +566,13 @@ PICKWDCB vIndirect $2014, $002C, A7 ; {sources}OS:HFS:TFSVol.a ### PC Exch ALIASMGRINSTALL vIndirect $2018, $0004, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a ALIAS vATrap A??? ; {sources}Toolbox:AliasMgr:AliasMgr.a -gestaltAliasMgr vIndirect $2018, $0008, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a +;gestaltAliasMgr vIndirect $2018, $0008, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a GETEXPORTEDFOLDERINFO vIndirect $2018, $000c, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a -GETVOLMOUNTINFOSIZE vIndirect $2018, $0010, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a -GETVOLMOUNTINFO vIndirect $2018, $0014, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a -VOLUMEMOUNT vIndirect $2018, $0018, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a +;GETVOLMOUNTINFOSIZE vIndirect $2018, $0010, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a +;GETVOLMOUNTINFO vIndirect $2018, $0014, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a +;VOLUMEMOUNT vIndirect $2018, $0018, A7 ; {sources}Toolbox:AliasMgr:AliasMgr.a InitFolderManager vIndirect $2018, $001c, A7 ; {sources}Toolbox:AliasMgr:FolderMgr.a -gestaltFolderMgr vIndirect $2018, $0020, A7 ; {sources}Toolbox:AliasMgr:FolderMgr.a +;gestaltFolderMgr vIndirect $2018, $0020, A7 ; {sources}Toolbox:AliasMgr:FolderMgr.a FindFolder vIndirect $2018, $0024, A7 ; {sources}Toolbox:AliasMgr:FolderMgr.a GetFolderName vIndirect $2018, $0028, A7 ; {sources}Toolbox:AliasMgr:FolderMgr.a FindFolderInternal vIndirect $2018, $002c, A7 ; {sources}Toolbox:AliasMgr:FolderMgr.a @@ -631,29 +645,6 @@ AL_mountVolume vIndirect $2018, $0134, A1 ; {sources}Toolbox:AliasMgr:alUti ;============================== End Alias Manager Vectors -;============================== Commtoolbox Vectors - -MyGetString vIndirect $201C, $0004, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CRMBuiltInSerial.c -REGISTERBUILTINPORTS vIndirect $201C, $0008, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CRMBuiltInSerial.c -COMMTOOLBOXDISPATCHER vATrap A??? ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxDispatcher.a -SETUPGLOBALS vIndirect $201C, $000c, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -SETUPGESTALT vIndirect $201C, $0010, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETCTBVERSION vIndirect $201C, $0014, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETCMATTR vIndirect $201C, $0018, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETFTATTR vIndirect $201C, $001c, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETTMATTR vIndirect $201C, $0020, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETCRMATTR vIndirect $201C, $0024, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETDITLATTR vIndirect $201C, $0028, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETPOPUPATTR vIndirect $201C, $002c, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -GETSTDNBPATTR vIndirect $201C, $0030, A7 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.a -CLEANUPCOMMTOOLBOX vIndirect $201C, $0034, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.c -TRACKMANAGERS vIndirect $201C, $0038, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.c -FindApp vIndirect $201C, $003c, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.c -AddApp vIndirect $201C, $0040, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.c -RemoveApp vIndirect $201C, $0044, A1 ; {sources}Toolbox:CommToolbox:CommToolboxStartup:CommToolboxPatches.c - -;============================== End Commtoolbox Vectors - ;============================== Component Manager Vectors ;COMPONENTMGRINSTALL vIndirect $2020, $0004, A7 ; {sources}Toolbox:ComponentMgr:ComponentExtensions.a @@ -712,7 +703,7 @@ __OPENCOMPONENT vIndirect $2020, $00d4, A1 ; {sources}Toolbox:ComponentMgr: __CLOSECOMPONENT vIndirect $2020, $00d8, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c __OPENDEFAULTCOMPONENT vIndirect $2020, $00dc, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c __CALLCOMPONENT vIndirect $2020, $00e0, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c -REGISTERCOMPONENTROMRESOURCE vIndirect $2020, $00e4, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c +;REGISTERCOMPONENTROMRESOURCE vIndirect $2020, $00e4, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c __REGISTERROMCOMPONENTS vIndirect $2020, $00e8, A1 ; {sources}Toolbox:ComponentMgr:ThingManager.c __MAINCOMPONENT vATrap A??? ; {sources}Toolbox:ComponentMgr:ThingManagerDisp.a COMPONENTBUMMER vIndirect $2020, $00ec, A7 ; {sources}Toolbox:ComponentMgr:ThingManagerDisp.a @@ -1432,233 +1423,11 @@ BLKCHK vIndirect $2030, $0370, A7 ; {sources}OS:HFS:vsm.a UPDATEFREE vIndirect $2030, $0374, A7 ; {sources}OS:HFS:vsm.a VREADBM vDirect ???? ; {sources}OS:HFS:vsm.a +HFS_VEC0378 vIndirect $2030, $0378, A7 +HFS_VEC037C vIndirect $2030, $037c, A7 + ;============================== End HFS Vectors -;============================== Help Manager Vectors - -HELPMGRINSTALL vIndirect $2034, $0004, A7 ; {sources}Toolbox:HelpMgr:BalloonExtensions.a -PACK14ENTRY vATrap A??? ; {sources}Toolbox:HelpMgr:BalloonExtensions.a -PTCHHMUPDATEHELPMENU vIndirect $2034, $0008, A7 ; {sources}Toolbox:HelpMgr:BalloonExtensions.a -PTCHHMGETHELPGLOBAL vIndirect $2034, $000c, A7 ; {sources}Toolbox:HelpMgr:BalloonExtensions.a -PTCHHMGETBALLOONS vIndirect $2034, $0010, A7 ; {sources}Toolbox:HelpMgr:BalloonExtensions.a -PTCHHMSETHELPGLOBAL vIndirect $2034, $0014, A7 ; {sources}Toolbox:HelpMgr:BalloonExtensions.a -PTCHHMPASCALGETBALLOONS vIndirect $2034, $0018, A1 ; {sources}Toolbox:HelpMgr:Balloonptch28.p -PTCHHMGESTALTISTHEREHELP vIndirect $2034, $001c, A1 ; {sources}Toolbox:HelpMgr:Balloonptch28.p -PTCHHMBOOTINITHELPMANAGER vIndirect $2034, $0020, A1 ; {sources}Toolbox:HelpMgr:Balloonptch28.p -PTCHHMTOGGLEWHATIS vIndirect $2034, $0024, A1 ; {sources}Toolbox:HelpMgr:Balloonptch28.p -PTCHHMCALLTRACKERINCONTEXT vIndirect $2034, $0028, A1 ; {sources}Toolbox:HelpMgr:Balloonptch28.p -PTCHHMSHOWHELPABOUTDIALOG vIndirect $2034, $002c, A1 ; {sources}Toolbox:HelpMgr:Balloonptch28.p - -;============================== End Help Manager Vectors - -;============================== Icon Utils Vectors - -ICONDISPATCH vATrap A??? ; {sources}Toolbox:IconUtils:IconUtils.a -typeTable vDataTable ; {sources}Toolbox:IconUtils:IconUtils.a -GetGlobalPtr vIndirect $2038, $0004, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -GetGlobalHandle vIndirect $2038, $0008, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -FromResource vIndirect $2038, $000c, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__PLOTICONID vIndirect $2038, $0010, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__LOADICONCACHE vIndirect $2038, $0014, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__PLOTICONSUITE vIndirect $2038, $0018, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__ICONIDTORGN vIndirect $2038, $001c, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__ICONSUITETORGN vIndirect $2038, $0020, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__RECTINICONID vIndirect $2038, $0024, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__PTINICONID vIndirect $2038, $0028, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__RECTINICONSUITE vIndirect $2038, $002c, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__PTINICONSUITE vIndirect $2038, $0030, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -FromMethod vIndirect $2038, $0034, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__PLOTICONMETHOD vIndirect $2038, $0038, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__ICONMETHODTORGN vIndirect $2038, $003c, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__RECTINICONMETHOD vIndirect $2038, $0040, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__PTINICONMETHOD vIndirect $2038, $0044, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__ADDICONTOSUITE vIndirect $2038, $0048, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__GETICONFROMSUITE vIndirect $2038, $004c, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -ADJUSTRGN vIndirect $2038, $0050, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__GETICONCACHEDATA vIndirect $2038, $0054, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__SETICONCACHEDATA vIndirect $2038, $0058, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__GETICONCACHEPROC vIndirect $2038, $005c, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__SETICONCACHEPROC vIndirect $2038, $0060, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__GETICONDEVICE vIndirect $2038, $0064, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -__SETICONDEVICE vIndirect $2038, $0068, A7 ; {sources}Toolbox:IconUtils:IconUtils.a -PERFORMALIGNMENT vIndirect $2038, $006c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -ADDBUFFERTORGN vIndirect $2038, $0070, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -MASKRGN vIndirect $2038, $0074, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -GETBESTDATA vIndirect $2038, $0078, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -ChooseBestSize vIndirect $2038, $007c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -SETUPPIXMAP vIndirect $2038, $0080, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__NEWICONSUITE vIndirect $2038, $0084, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__MAKEICONCACHE vIndirect $2038, $0088, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -EDITICONSUITE vIndirect $2038, $008c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__FOREACHICONDO vIndirect $2038, $0090, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -GETICONFROMRESOURCE vIndirect $2038, $0094, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__GETICONSUITE vIndirect $2038, $0098, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__SETSUITELABEL vIndirect $2038, $009c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__GETSUITELABEL vIndirect $2038, $00a0, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -DISPOSER vIndirect $2038, $00a4, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__DISPOSEICONSUITE vIndirect $2038, $00a8, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -FromSuite vIndirect $2038, $00ac, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -DOREGIONTRANSFORM vIndirect $2038, $00b0, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -DoOutline vIndirect $2038, $00b4, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -APPLYPATTERN vIndirect $2038, $00b8, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -DOBITMAPTRANSFORM vIndirect $2038, $00bc, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -RENDER vIndirect $2038, $00c0, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTDEEP vIndirect $2038, $00c4, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTSHALLOWBLACKANDWHITE vIndirect $2038, $00c8, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTSHALLOWCOLOR vIndirect $2038, $00cc, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTSHALLOW vIndirect $2038, $00d0, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTTHEICON vIndirect $2038, $00d4, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -MakeBoundary vIndirect $2038, $00d8, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -CreateMask vIndirect $2038, $00dc, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -SetupParamBlock vIndirect $2038, $00e0, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PRESCALEMASK vIndirect $2038, $00e4, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTICONGENERIC vIndirect $2038, $00e8, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -ICONTORGNGENERIC vIndirect $2038, $00ec, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -HITTESTICONMASKGENERIC vIndirect $2038, $00f0, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -HITTESTICONGENERIC vIndirect $2038, $00f4, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -MAKEICONDATA vIndirect $2038, $00f8, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -CompareComponent vIndirect $2038, $00fc, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -Darken vIndirect $2038, $0100, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -Luminance vIndirect $2038, $0104, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -Brighten vIndirect $2038, $0108, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -FindBlack vIndirect $2038, $010c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -MakeClut vIndirect $2038, $0110, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -GetDeviceCheck vIndirect $2038, $0114, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -CheckClut vIndirect $2038, $0118, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -IconGetClut vIndirect $2038, $011c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__GETLABEL vIndirect $2038, $0120, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -INVALLABELCLUTS vIndirect $2038, $0124, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__SETLABEL vIndirect $2038, $0128, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -FromICON vIndirect $2038, $012c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -FromSICN vIndirect $2038, $0130, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__PLOTICONHANDLE vIndirect $2038, $0134, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__PLOTSICNHANDLE vIndirect $2038, $0138, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -SetupParamBlockForCIcon vIndirect $2038, $013c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -CopyClut vIndirect $2038, $0140, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -GETCICONCLUT vIndirect $2038, $0144, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -PLOTTHECICON vIndirect $2038, $0148, A1 ; {sources}Toolbox:IconUtils:IconUtils.c -__PLOTCICONHANDLE vIndirect $2038, $014c, A1 ; {sources}Toolbox:IconUtils:IconUtils.c - -;============================== End Icon Utils Vectors - -;============================== MMU Vectors - -GETREALPROC vNoVector ; {sources}OS:MMU:GetReal.a -GETPAGEDESCPROC vNoVector ; {sources}OS:MMU:GetReal.a -GETMMUINFO vNoVector ; {sources}OS:MMU:GetReal.a -CHECKTTREGS vNoVector ; {sources}OS:MMU:GetReal.a -EDISKPROTECT vNoVector ; {sources}OS:MMU:GetReal.a -INITMMUTRAP vNoVector ; {sources}OS:MMU:MMU.a -INITMMUGLOBALS vNoVector ; {sources}OS:MMU:MMU.a -MMUCLEANUPFOR8MB vNoVector ; {sources}OS:MMU:MMU.a -INITMMU vNoVector ; {sources}OS:MMU:MMUTables.a -TRANS vNoVector ; {sources}OS:MMU:MMUTables.a - -;============================== End MMU Vectors - -;============================== Memory Manager Vectors - -__BLOCKMOVE vATrap A??? ; {sources}OS:MemoryMgr:BlockMove.a -BLOCKMOVE68020 vNoVector ; {sources}OS:MemoryMgr:BlockMove.a -BLOCKMOVE68040 vNoVector ; {sources}OS:MemoryMgr:BlockMove.a -HEAP vNoVector ; {sources}OS:MemoryMgr:MemoryMgr.a -INITMEMVECT vNoVector ; {sources}OS:MemoryMgr:MemoryMgr.a -SETAPPLBASE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -INITAPPLZONE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -VIAZINIT vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -VIAZPOSTINIT vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -INITZONETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -GETZONE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -SETZONE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -MAXBLOCKTRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -COMPACTMEMTRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -PURGEMEM vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -PURGESPACETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -FREEMEM vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -RESRVMEM vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -MAXMEMTRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -SETGROWZONE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -SETAPPLLIMIT vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -STACKSPACETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -MAXAPPLZONE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -NEWPTRTRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -DISPOSEPTR vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -GETPTRSIZETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -SETPTRSIZETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -PTRZONETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -NEWEMPTYHANDLETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -NWHANDLE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -DSPOSEHANDLE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -__GETHANDLESIZE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -SETHANDLESIZETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HANDLEZONETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -RECOVERHANDLETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -EMPTYHANDLE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -REALLOCHANDLETRAP vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HLOCK vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HUNLOCK vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HPURGE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HNOPURGE vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HRSRC vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HNORSRC vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HGETFLAGS vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -HSETFLAGS vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -MOREMASTERS vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -__STRIPADDRESS vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -MOVEHHI vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgr.a -MOVEHLOW vATrap A??? ; {sources}OS:MemoryMgr:MemoryMgrExtensions.a -HEAPGUTS vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMPPROLOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMHPROLOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMNOPROLOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMMMPROLOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMPROLOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMRHPROLOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMEPILOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MMNOERREPILOGUE vDirect ???? ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24MAKEBKF vIndirect $2040, $0004, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32MAKEBKF vIndirect $2040, $0008, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24EH vIndirect $2040, $000c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32EH vIndirect $2040, $0010, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24PURGEHEAP vIndirect $2040, $0014, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32PURGEHEAP vIndirect $2040, $0018, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24TOTEPURGEABLES vIndirect $2040, $001c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32TOTEPURGEABLES vIndirect $2040, $0020, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24BKCOMPACTS vIndirect $2040, $0024, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32BKCOMPACTS vIndirect $2040, $0028, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24ALLOCBK vIndirect $2040, $002c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32ALLOCBK vIndirect $2040, $0030, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24COMPACTHP vIndirect $2040, $0034, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32COMPACTHP vIndirect $2040, $0038, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -TOMAXLIMIT vIndirect $2040, $003c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24MAXLIMIT vIndirect $2040, $0040, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32MAXLIMIT vIndirect $2040, $0044, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24ZONEADJUSTEND vIndirect $2040, $0048, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32ZONEADJUSTEND vIndirect $2040, $004c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24ACTUALS vIndirect $2040, $0050, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32ACTUALS vIndirect $2040, $0054, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24GETSIZE vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32GETSIZE vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -CLEARGZSTUFF vIndirect $2040, $0058, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24SETSIZE vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32SETSIZE vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -ADJUSTFREE vIndirect $2040, $005c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24NEXTMASTER vIndirect $2040, $0060, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32NEXTMASTER vIndirect $2040, $0064, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24HMAKEMOREMASTERS vIndirect $2040, $0068, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32HMAKEMOREMASTERS vIndirect $2040, $006c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -RELEASEMP vIndirect $2040, $0070, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24MAKEPTRSPC vIndirect $2040, $0074, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32MAKEPTRSPC vIndirect $2040, $0078, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A24FREEBK vIndirect $2040, $007c, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -A32FREEBK vIndirect $2040, $0080, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -STDGZ vIndirect $2040, $0084, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -MEMMGREND vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -INITMEMMGR vNoVector ; {sources}OS:MemoryMgr:MemoryMgrInternal.a -IAZ vIndirect $2040, $0088, A7 ; {sources}OS:MemoryMgr:MemoryMgrInternal.a - -;============================== End Memory Manager Vectors - ;============================== Menu Manager Vectors MENUMGRDISPATCH vATrap A??? ; {sources}Toolbox:MenuMgr:MenuDispatch.a @@ -1744,41 +1513,6 @@ FIND6BOFROMID vIndirect $2044, $007c, A7 ; {sources}Toolbox:MenuMgr:SystemM ;============================== End Menu Manager Vectors -;============================== Munger Vectors - -BYTES vIndirect $2048, $0004, A7 ; {sources}Toolbox:Munger:Munger.a -MUNGER vATrap A??? ; {sources}Toolbox:Munger:Munger.a -XMUNGER vATrap A??? ; {sources}Toolbox:Munger:Munger.a -HANDTOHANDTRAP vATrap A??? ; {sources}Toolbox:Munger:Munger.a -PTRTOXHANDTRAP vATrap A??? ; {sources}Toolbox:Munger:Munger.a -PTRTOHANDTRAP vATrap A??? ; {sources}Toolbox:Munger:Munger.a -HANDANDHANDTRAP vATrap A??? ; {sources}Toolbox:Munger:Munger.a -PTRANDHANDTRAP vATrap A??? ; {sources}Toolbox:Munger:Munger.a -METHODDISPATCH vATrap A??? ; {sources}Toolbox:Munger:Munger.a -LONGMUL vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRACMUL vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIXMUL vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRACDIV vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIXDIV vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRACSQRT vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIXRATIO vATrap A??? ; {sources}Toolbox:Munger:Munger.a -LOWORD vATrap A??? ; {sources}Toolbox:Munger:Munger.a -HIWORD vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIXROUND vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRACCOS vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRACSIN vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIXATAN2 vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIX2X vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRAC2X vATrap A??? ; {sources}Toolbox:Munger:Munger.a -X2FIX vATrap A??? ; {sources}Toolbox:Munger:Munger.a -X2FRAC vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIX2LONG vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FRAC2FIX vATrap A??? ; {sources}Toolbox:Munger:Munger.a -LONG2FIX vATrap A??? ; {sources}Toolbox:Munger:Munger.a -FIX2FRAC vATrap A??? ; {sources}Toolbox:Munger:Munger.a - -;============================== End Munger Vectors - ;============================== Notification Manager Vectors __NMINSTALL vATrap A??? ; {sources}Toolbox:NotificationMgr:NotificationMgr.a @@ -1799,10 +1533,10 @@ ValidIconRec vIndirect $204C, $0034, A1 ; {sources}Toolbox:NotificationMgr: NMINIT vIndirect $204C, $0038, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c _NMInstall vIndirect $204C, $003c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c _NMRemove vIndirect $204C, $0040, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c -COPYSTRING vIndirect $204C, $0044, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c +;COPYSTRING vIndirect $204C, $0044, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c FLUSHAPPLNM vIndirect $204C, $0048, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c NMFILTER vIndirect $204C, $004c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c -DEFBUTPROC vIndirect $204C, $0050, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c +;DEFBUTPROC vIndirect $204C, $0050, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c NMCallMBarProc vIndirect $204C, $0054, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c SWAPITEMMARKS vIndirect $204C, $0058, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c ClearMarks vIndirect $204C, $005c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c @@ -1812,223 +1546,13 @@ RotateIcon vIndirect $204C, $0068, A1 ; {sources}Toolbox:NotificationMgr:N DoSound vIndirect $204C, $006c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c DoDialog vIndirect $204C, $0070, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c DoRespProc vIndirect $204C, $0074, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c -NMGNEFILTER vIndirect $204C, $0078, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c +;NMGNEFILTER vIndirect $204C, $0078, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c NMTASK vIndirect $204C, $007c, A1 ; {sources}Toolbox:NotificationMgr:NotificationMgr.c disable vIndirect $204C, $0080, A7 ; {sources}Toolbox:NotificationMgr:SetProcessorLevel.a spl vIndirect $204C, $0084, A7 ; {sources}Toolbox:NotificationMgr:SetProcessorLevel.a ;============================== End Notification Manager Vectors -;============================== PPC Vectors - -OPENUGBT vIndirect $2050, $0004, A7 ; {sources}OS:PPC:BTIntf.a -BLDFSKEY vIndirect $2050, $0008, A7 ; {sources}OS:PPC:BTIntf.a -BTINIT vIndirect $2050, $000c, A7 ; {sources}OS:PPC:BTreeCGlue.a -MYBTOPEN vIndirect $2050, $0010, A7 ; {sources}OS:PPC:BTreeCGlue.a -MYBTCLOSE vIndirect $2050, $0014, A7 ; {sources}OS:PPC:BTreeCGlue.a -BTINSREC vIndirect $2050, $0018, A7 ; {sources}OS:PPC:BTreeCGlue.a -BTSETREC vIndirect $2050, $001c, A7 ; {sources}OS:PPC:BTreeCGlue.a -BTREPLREC vIndirect $2050, $0020, A7 ; {sources}OS:PPC:BTreeCGlue.a -MYBTSEARCH vIndirect $2050, $0024, A7 ; {sources}OS:PPC:BTreeCGlue.a -BTSEARCHPPC vIndirect $2050, $0028, A7 ; {sources}OS:PPC:BTreeCGlue.a -BTGETREC vIndirect $2050, $002c, A7 ; {sources}OS:PPC:BTreeCGlue.a -MYBTDELETE vIndirect $2050, $0030, A7 ; {sources}OS:PPC:BTreeCGlue.a -BTGETINFO vIndirect $2050, $0034, A7 ; {sources}OS:PPC:BTreeCGlue.a -MYBTFLUSH vIndirect $2050, $0038, A7 ; {sources}OS:PPC:BTreeCGlue.a -mixupPswd vIndirect $2050, $003c, A1 ; {sources}OS:PPC:PPCAuth.c -getUserRec vIndirect $2050, $0040, A1 ; {sources}OS:PPC:PPCAuth.c -GetUserCompletion vIndirect $2050, $0044, A1 ; {sources}OS:PPC:PPCAuth.c -GetAuthInfo vIndirect $2050, $0048, A1 ; {sources}OS:PPC:PPCAuth.c -random vATrap A??? ; {sources}OS:PPC:PPCAuth.c -checkInit vIndirect $2050, $004c, A1 ; {sources}OS:PPC:PPCAuth.c -ppcStartSecure vIndirect $2050, $0050, A1 ; {sources}OS:PPC:PPCAuth.c -promptCallBack vIndirect $2050, $0054, A1 ; {sources}OS:PPC:PPCAuth.c -UserRefNumCompare vIndirect $2050, $0058, A1 ; {sources}OS:PPC:PPCAuth.c -ppcDeleteUser vIndirect $2050, $005c, A1 ; {sources}OS:PPC:PPCAuth.c -ppcGetDefaultUser vIndirect $2050, $0060, A1 ; {sources}OS:PPC:PPCAuth.c -FindUserByNameAndPassword vIndirect $2050, $0064, A1 ; {sources}OS:PPC:PPCAuth.c -findUserByRef vIndirect $2050, $0068, A1 ; {sources}OS:PPC:PPCAuth.c -GetFreeEntry vIndirect $2050, $006c, A1 ; {sources}OS:PPC:PPCAuth.c -scramble vIndirect $2050, $0070, A1 ; {sources}OS:PPC:PPCAuth.c -PACK9 vATrap A??? ; {sources}OS:PPC:PPCBrowserPackEntry.a -ppcDispatcher vIndirect $2050, $0074, A7 ; {sources}OS:PPC:PPCDispatcher.a -VPPCDISPATCHER vATrap A??? ; {sources}OS:PPC:PPCDispatcher.a -ppcBadSelector vIndirect $2050, $0078, A7 ; {sources}OS:PPC:PPCDispatcher.a -OpenADSPDriver vIndirect $2050, $007c, A1 ; {sources}OS:PPC:PPCDsp.c -CreateConnectionListener vIndirect $2050, $0080, A1 ; {sources}OS:PPC:PPCDsp.c -ListenConnectionRequest vIndirect $2050, $0084, A1 ; {sources}OS:PPC:PPCDsp.c -RejectConnectionRequest vIndirect $2050, $0088, A1 ; {sources}OS:PPC:PPCDsp.c -RemoveConnectionListener vIndirect $2050, $008c, A1 ; {sources}OS:PPC:PPCDsp.c -CreateConnectionEnd vIndirect $2050, $0090, A1 ; {sources}OS:PPC:PPCDsp.c -OpenConnectionEnd vIndirect $2050, $0094, A1 ; {sources}OS:PPC:PPCDsp.c -RemoveConnectionEnd vIndirect $2050, $0098, A1 ; {sources}OS:PPC:PPCDsp.c -WriteToConnection vIndirect $2050, $009c, A1 ; {sources}OS:PPC:PPCDsp.c -ReadFromConnection vIndirect $2050, $00a0, A1 ; {sources}OS:PPC:PPCDsp.c -ppcOpen vIndirect $2050, $00a4, A1 ; {sources}OS:PPC:PPCEntry.c -ppcStart vIndirect $2050, $00a8, A1 ; {sources}OS:PPC:PPCEntry.c -ppcInform vIndirect $2050, $00ac, A1 ; {sources}OS:PPC:PPCEntry.c -ppcAccept vIndirect $2050, $00b0, A1 ; {sources}OS:PPC:PPCEntry.c -ppcReject vIndirect $2050, $00b4, A1 ; {sources}OS:PPC:PPCEntry.c -ppcWrite vIndirect $2050, $00b8, A1 ; {sources}OS:PPC:PPCEntry.c -ppcRead vIndirect $2050, $00bc, A1 ; {sources}OS:PPC:PPCEntry.c -ppcEnd vIndirect $2050, $00c0, A1 ; {sources}OS:PPC:PPCEntry.c -ppcClose vIndirect $2050, $00c4, A1 ; {sources}OS:PPC:PPCEntry.c -ipcListPorts vIndirect $2050, $00c8, A1 ; {sources}OS:PPC:PPCEntry.c -PPCCommonPBEntry vIndirect $2050, $00cc, A1 ; {sources}OS:PPC:PPCEntry.c -PPCCommonPBExit vIndirect $2050, $00d0, A1 ; {sources}OS:PPC:PPCEntry.c -NetOpenCompletion vIndirect $2050, $00d4, A1 ; {sources}OS:PPC:PPCEntry.c -CallCompletionRoutine vIndirect $2050, $00d8, A1 ; {sources}OS:PPC:PPCEntry.c -CompleteWithResult vIndirect $2050, $00dc, A1 ; {sources}OS:PPC:PPCEntry.c -VerifyLocNameFormat vIndirect $2050, $00e0, A1 ; {sources}OS:PPC:PPCEntry.c -LocationNameLocal vIndirect $2050, $00e4, A1 ; {sources}OS:PPC:PPCEntry.c -LocNameTaken vIndirect $2050, $00e8, A1 ; {sources}OS:PPC:PPCEntry.c -BeginLocalOrRemote vIndirect $2050, $00ec, A1 ; {sources}OS:PPC:PPCEntry.c -LocalOrNot vIndirect $2050, $00f0, A1 ; {sources}OS:PPC:PPCEntry.c -DoGetMyZone vIndirect $2050, $00f4, A1 ; {sources}OS:PPC:PPCEntry.c -DMFix vIndirect $2050, $00f8, A1 ; {sources}OS:PPC:PPCEntry.c -PPCSetUp vIndirect $2050, $00fc, A1 ; {sources}OS:PPC:PPCInit.c -AtalkEvent vIndirect $2050, $0100, A1 ; {sources}OS:PPC:PPCInit.c -EnableIncoming vIndirect $2050, $0104, A1 ; {sources}OS:PPC:PPCInit.c -DisableIncoming vIndirect $2050, $0108, A1 ; {sources}OS:PPC:PPCInit.c -initUserGroupFile vIndirect $2050, $010c, A1 ; {sources}OS:PPC:PPCInit.c -RemoveConnectionListeners vIndirect $2050, $0110, A1 ; {sources}OS:PPC:PPCInit.c -SetUpToolBoxName vIndirect $2050, $0114, A1 ; {sources}OS:PPC:PPCInit.c -RemoveToolBoxName vIndirect $2050, $0118, A1 ; {sources}OS:PPC:PPCInit.c -SetUpConnectionListeners vIndirect $2050, $011c, A1 ; {sources}OS:PPC:PPCInit.c -PPCSleepEvent vIndirect $2050, $0120, A1 ; {sources}OS:PPC:PPCInit.c -EndAllNetworkSessions vIndirect $2050, $0124, A1 ; {sources}OS:PPC:PPCInit.c -KillUserSession vIndirect $2050, $0128, A1 ; {sources}OS:PPC:PPCInit.c -PPCCloseUserSessions vIndirect $2050, $012c, A1 ; {sources}OS:PPC:PPCInit.c -PPCCountAcceptedNetworkSessions vIndirect $2050, $0130, A1 ; {sources}OS:PPC:PPCInit.c -PPCCheckDupNBPName vIndirect $2050, $0134, A1 ; {sources}OS:PPC:PPCInit.c -PPCGESTALTFUNCTION vIndirect $2050, $0138, A1 ; {sources}OS:PPC:PPCInit.c -GetPPCGlobalFlag vIndirect $2050, $013c, A1 ; {sources}OS:PPC:PPCInit.c -PPCSHUTDOWN vIndirect $2050, $0140, A1 ; {sources}OS:PPC:PPCInit.c -PPCSystemTask vNoVector ; {sources}OS:PPC:PPCInit.c -UnRegisterAllNBPNames vIndirect $2050, $0144, A1 ; {sources}OS:PPC:PPCInit.c -ReRegisterAllNBPNames vIndirect $2050, $0148, A1 ; {sources}OS:PPC:PPCInit.c -PPCDEADGESTAULT vIndirect $2050, $014c, A1 ; {sources}OS:PPC:PPCInit.c -KillPPC vIndirect $2050, $0150, A1 ; {sources}OS:PPC:PPCInit.c -PPCINSTALL vIndirect $2050, $0154, A1 ; {sources}OS:PPC:PPCInstall.a -setupGlobal vIndirect $2050, $0158, A1 ; {sources}OS:PPC:PPCInstall.a -ppcLoader vIndirect $2050, $015c, A1 ; {sources}OS:PPC:PPCLoader.c -initAuth vIndirect $2050, $0160, A1 ; {sources}OS:PPC:PPCLoader.c -GetLocSess vIndirect $2050, $0164, A1 ; {sources}OS:PPC:PPCLocal.c -FreeLocSess vIndirect $2050, $0168, A1 ; {sources}OS:PPC:PPCLocal.c -StartLocalSession vIndirect $2050, $016c, A1 ; {sources}OS:PPC:PPCLocal.c -AcceptLocalSession vIndirect $2050, $0170, A1 ; {sources}OS:PPC:PPCLocal.c -RejectLocalSession vIndirect $2050, $0174, A1 ; {sources}OS:PPC:PPCLocal.c -WriteLocalData vIndirect $2050, $0178, A1 ; {sources}OS:PPC:PPCLocal.c -ReadLocalData vIndirect $2050, $017c, A1 ; {sources}OS:PPC:PPCLocal.c -EndLocalSession vIndirect $2050, $0180, A1 ; {sources}OS:PPC:PPCLocal.c -ListLocalPorts vIndirect $2050, $0184, A1 ; {sources}OS:PPC:PPCLocal.c -LocalTransfer vIndirect $2050, $0188, A1 ; {sources}OS:PPC:PPCLocal.c -RegisterName vIndirect $2050, $018c, A1 ; {sources}OS:PPC:PPCNbp.c -LookupName vIndirect $2050, $0190, A1 ; {sources}OS:PPC:PPCNbp.c -RemoveName vIndirect $2050, $0194, A1 ; {sources}OS:PPC:PPCNbp.c -GetRemSess vIndirect $2050, $0198, A1 ; {sources}OS:PPC:PPCNetwork.c -FreeRemSess vIndirect $2050, $019c, A1 ; {sources}OS:PPC:PPCNetwork.c -RemoveNetworkConnection vIndirect $2050, $01a0, A1 ; {sources}OS:PPC:PPCNetwork.c -RemoveCompletion vIndirect $2050, $01a4, A1 ; {sources}OS:PPC:PPCNetwork.c -StartNetworkSession vIndirect $2050, $01a8, A1 ; {sources}OS:PPC:PPCNetwork.c -AcceptNetworkSession vIndirect $2050, $01ac, A1 ; {sources}OS:PPC:PPCNetwork.c -RejectNetworkSession vIndirect $2050, $01b0, A1 ; {sources}OS:PPC:PPCNetwork.c -WriteNetworkData vIndirect $2050, $01b4, A1 ; {sources}OS:PPC:PPCNetwork.c -ReadNetworkData vIndirect $2050, $01b8, A1 ; {sources}OS:PPC:PPCNetwork.c -EndNetworkSession vIndirect $2050, $01bc, A1 ; {sources}OS:PPC:PPCNetwork.c -ListNetworkPorts vIndirect $2050, $01c0, A1 ; {sources}OS:PPC:PPCNetwork.c -BeginNetworkConnection vIndirect $2050, $01c4, A1 ; {sources}OS:PPC:PPCNetwork.c -AcceptNetworkConnection vIndirect $2050, $01c8, A1 ; {sources}OS:PPC:PPCNetwork.c -NetLookUpCompletion vIndirect $2050, $01cc, A1 ; {sources}OS:PPC:PPCNetwork.c -ConnectionEndCompletion vIndirect $2050, $01d0, A1 ; {sources}OS:PPC:PPCNetwork.c -OpenCompletion vIndirect $2050, $01d4, A1 ; {sources}OS:PPC:PPCNetwork.c -StartSendCompletion vIndirect $2050, $01d8, A1 ; {sources}OS:PPC:PPCNetwork.c -StartCommandCompletion vIndirect $2050, $01dc, A1 ; {sources}OS:PPC:PPCNetwork.c -ListSendCompletion vIndirect $2050, $01e0, A1 ; {sources}OS:PPC:PPCNetwork.c -ListReadCompletion vIndirect $2050, $01e4, A1 ; {sources}OS:PPC:PPCNetwork.c -ListCommandCompletion vIndirect $2050, $01e8, A1 ; {sources}OS:PPC:PPCNetwork.c -ConnectionRequestCompletion vIndirect $2050, $01ec, A1 ; {sources}OS:PPC:PPCNetwork.c -RespConnectionEndCompletion vIndirect $2050, $01f0, A1 ; {sources}OS:PPC:PPCNetwork.c -RespOpenCompletion vIndirect $2050, $01f4, A1 ; {sources}OS:PPC:PPCNetwork.c -RecvSessReqCompletion vIndirect $2050, $01f8, A1 ; {sources}OS:PPC:PPCNetwork.c -GuestRecCompletion vIndirect $2050, $01fc, A1 ; {sources}OS:PPC:PPCNetwork.c -UserRecCompletion vIndirect $2050, $0200, A1 ; {sources}OS:PPC:PPCNetwork.c -AuthSendCompletion vIndirect $2050, $0204, A1 ; {sources}OS:PPC:PPCNetwork.c -AuthRespCompletion vIndirect $2050, $0208, A1 ; {sources}OS:PPC:PPCNetwork.c -ProcessInform vIndirect $2050, $020c, A1 ; {sources}OS:PPC:PPCNetwork.c -RespSendCompletion vIndirect $2050, $0210, A1 ; {sources}OS:PPC:PPCNetwork.c -ARepostConnectionListener vIndirect $2050, $0214, A1 ; {sources}OS:PPC:PPCNetwork.c -RepostConnectionListener vIndirect $2050, $0218, A1 ; {sources}OS:PPC:PPCNetwork.c -ListWrite vIndirect $2050, $021c, A1 ; {sources}OS:PPC:PPCNetwork.c -ListWriteCompletion vIndirect $2050, $0220, A1 ; {sources}OS:PPC:PPCNetwork.c -ListRespCompletion vIndirect $2050, $0224, A1 ; {sources}OS:PPC:PPCNetwork.c -BeginWriteBlock vIndirect $2050, $0228, A1 ; {sources}OS:PPC:PPCNetwork.c -WriteHdrCompletion vIndirect $2050, $022c, A1 ; {sources}OS:PPC:PPCNetwork.c -WriteBlockData vIndirect $2050, $0230, A1 ; {sources}OS:PPC:PPCNetwork.c -WriteBlockDataCompletion vIndirect $2050, $0234, A1 ; {sources}OS:PPC:PPCNetwork.c -CompleteWriteRequest vIndirect $2050, $0238, A1 ; {sources}OS:PPC:PPCNetwork.c -BeginReadBlock vIndirect $2050, $023c, A1 ; {sources}OS:PPC:PPCNetwork.c -ReadHdrCompletion vIndirect $2050, $0240, A1 ; {sources}OS:PPC:PPCNetwork.c -ReadBlockData vIndirect $2050, $0244, A1 ; {sources}OS:PPC:PPCNetwork.c -ReadDataCompletion vIndirect $2050, $0248, A1 ; {sources}OS:PPC:PPCNetwork.c -CompleteReadRequest vIndirect $2050, $024c, A1 ; {sources}OS:PPC:PPCNetwork.c -CopyReadBlk vIndirect $2050, $0250, A1 ; {sources}OS:PPC:PPCNetwork.c -ClosePortTable vIndirect $2050, $0254, A1 ; {sources}OS:PPC:PPCPort.c -NBPRemoveCompletion vIndirect $2050, $0258, A1 ; {sources}OS:PPC:PPCPort.c -CompleteClosePort vIndirect $2050, $025c, A1 ; {sources}OS:PPC:PPCPort.c -CheckPortName vIndirect $2050, $0260, A1 ; {sources}OS:PPC:PPCPort.c -ValidPortName vIndirect $2050, $0264, A1 ; {sources}OS:PPC:PPCPort.c -ComparePortName vIndirect $2050, $0268, A1 ; {sources}OS:PPC:PPCPort.c -GetLocationName vIndirect $2050, $026c, A1 ; {sources}OS:PPC:PPCPort.c -PortRefNumCompare vIndirect $2050, $0270, A1 ; {sources}OS:PPC:PPCPort.c -DeletePortByRefNum vIndirect $2050, $0274, A1 ; {sources}OS:PPC:PPCPort.c -PortRefNumtoPtr vIndirect $2050, $0278, A1 ; {sources}OS:PPC:PPCPort.c -GetUniquePortRefNum vIndirect $2050, $027c, A1 ; {sources}OS:PPC:PPCPort.c -GetPortTable vIndirect $2050, $0280, A1 ; {sources}OS:PPC:PPCPort.c -FreePortTable vIndirect $2050, $0284, A1 ; {sources}OS:PPC:PPCPort.c -SetPortInformQue vIndirect $2050, $0288, A1 ; {sources}OS:PPC:PPCPort.c -GetPortNames vIndirect $2050, $028c, A1 ; {sources}OS:PPC:PPCPort.c -WildPortMatch vIndirect $2050, $0290, A1 ; {sources}OS:PPC:PPCPort.c -QueueFromSessRefNum vIndirect $2050, $0294, A1 ; {sources}OS:PPC:PPCSession.c -SessRefNumCompare vIndirect $2050, $0298, A1 ; {sources}OS:PPC:PPCSession.c -SessRefNumtoPtr vIndirect $2050, $029c, A1 ; {sources}OS:PPC:PPCSession.c -DeleteSessByRefNum vIndirect $2050, $02a0, A1 ; {sources}OS:PPC:PPCSession.c -GetSessionRefNum vIndirect $2050, $02a4, A1 ; {sources}OS:PPC:PPCSession.c -SetSessionTable vIndirect $2050, $02a8, A1 ; {sources}OS:PPC:PPCSession.c -PortSessCompare vIndirect $2050, $02ac, A1 ; {sources}OS:PPC:PPCSession.c -CleanSessions vIndirect $2050, $02b0, A1 ; {sources}OS:PPC:PPCSession.c -KillReadAndWrite vIndirect $2050, $02b4, A1 ; {sources}OS:PPC:PPCSession.c -getGlobal vNoVector ; {sources}OS:PPC:PPCUtil.a -callCompletion vIndirect $2050, $02b8, A1 ; {sources}OS:PPC:PPCUtil.a -AddtoAtalkQ vIndirect $2050, $02bc, A1 ; {sources}OS:PPC:PPCUtil.a -RmvfromAtalkQ vIndirect $2050, $02c0, A1 ; {sources}OS:PPC:PPCUtil.a -FakeCompletion vIndirect $2050, $02c4, A1 ; {sources}OS:PPC:PPCUtil.a -PointerCompare vIndirect $2050, $02c8, A1 ; {sources}OS:PPC:PPCUtilities.c -EnQueue vIndirect $2050, $02cc, A1 ; {sources}OS:PPC:PPCUtilities.c -ServeQueue vIndirect $2050, $02d0, A1 ; {sources}OS:PPC:PPCUtilities.c -SearchQueue vIndirect $2050, $02d4, A1 ; {sources}OS:PPC:PPCUtilities.c -DeleteFromQueue vIndirect $2050, $02d8, A1 ; {sources}OS:PPC:PPCUtilities.c -DeleteMultiple vIndirect $2050, $02dc, A1 ; {sources}OS:PPC:PPCUtilities.c -NewMem vIndirect $2050, $02e0, A1 ; {sources}OS:PPC:PPCUtilities.c -DisposeMem vIndirect $2050, $02e4, A1 ; {sources}OS:PPC:PPCUtilities.c -AddNew vIndirect $2050, $02e8, A1 ; {sources}OS:PPC:PPCUtilities.c -RemOld vIndirect $2050, $02ec, A1 ; {sources}OS:PPC:PPCUtilities.c -Replenish vNoVector ; {sources}OS:PPC:PPCUtilities.c -Excess vNoVector ; {sources}OS:PPC:PPCUtilities.c -PRMTFUSER vIndirect $2050, $02f0, A7 ; {sources}OS:PPC:PromptForUser.a -PROMPTFORUSER vIndirect $2050, $02f4, A7 ; {sources}OS:PPC:PromptForUser.a -GETPASSWORDBULLET vIndirect $2050, $02f8, A1 ; {sources}OS:PPC:PromptForUser.c -GetIntlTokenChar vIndirect $2050, $02fc, A1 ; {sources}OS:PPC:PromptForUser.c -FRK vDataTable ; {sources}Objects:ROM:PPC.lib -PERMUTE vDataTable ; {sources}Objects:ROM:PPC.lib -PTBL vDataTable ; {sources}Objects:ROM:PPC.lib -IPINVTBL vDataTable ; {sources}Objects:ROM:PPC.lib -IP vDataTable ; {sources}Objects:ROM:PPC.lib -KEYSCHED vIndirect $2050, $0300, A1 ; {sources}Objects:ROM:PPC.lib -ENCODE vIndirect $2050, $0304, A1 ; {sources}Objects:ROM:PPC.lib - -;============================== End PPC Vectors - ;============================== Quickdraw Vectors ANGLEFROMSLOPE vATrap A??? ; {sources}QuickDraw:ANGLES.a @@ -2699,8 +2223,8 @@ INITCRTABLE vDataTable ; {sources}QuickDraw:cCrsrCore.a CRSRVBLTASK vIndirect $2054, $0390, A7 ; {sources}QuickDraw:cCrsrCore.a PINRECT vATrap A??? ; {sources}QuickDraw:cCrsrCore.a CURSORSECT vIndirect $2054, $0394, A7 ; {sources}QuickDraw:cCrsrCore.a -ERASECURSOR vIndirect $2054, $0398, A7 ; {sources}QuickDraw:cCrsrCore.a -DRAWCURSOR vIndirect $2054, $039c, A7 ; {sources}QuickDraw:cCrsrCore.a +;ERASECURSOR vIndirect $2054, $0398, A7 ; {sources}QuickDraw:cCrsrCore.a +;DRAWCURSOR vIndirect $2054, $039c, A7 ; {sources}QuickDraw:cCrsrCore.a GETMAINCRSR vIndirect $2054, $03a0, A7 ; {sources}QuickDraw:cCrsrCore.a SETCRSRDATA vIndirect $2054, $03a4, A7 ; {sources}QuickDraw:cCrsrCore.a ALLOCCRSR vATrap A??? ; {sources}QuickDraw:cCrsrCore.a @@ -2842,513 +2366,6 @@ GETNEXTFOND vIndirect $2058, $0090, A7 ; {sources}Toolbox:ResourceMgr:Reso ;============================== End Resource Manager Vectors -;============================== SCSI Manager Vectors - -;ÑÑÑÑÑ Old SCSI Manager -SCSIDISPATCHCOMMON vATrap A??? ; {sources}OS:SCSIMgr:SCSILinkPatch.a -SCSIBUSYPLUS vIndirect $205C, $0004, A7 ; {sources}OS:SCSIMgr:SCSILinkPatch.a -SCSIBUSYOTHERS vIndirect $205C, $0008, A7 ; {sources}OS:SCSIMgr:SCSILinkPatch.a -SCSIBOOTS vIndirect $205C, $000c, A7 ; {sources}OS:SCSIMgr:scsiboot.a -SCSILOAD vIndirect $205C, $0010, A7 ; {sources}OS:SCSIMgr:scsiboot.a -SCSI96 vNoVector ; {sources}OS:SCSIMgr:scsimgr96.a -SCSIMGR_96 vIndirect $205C, $0014, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -UNIMPLEMENTED_96 vIndirect $205C, $0018, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSISTAT_96 vIndirect $205C, $001c, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSIRESET_96 vIndirect $205C, $0020, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSIGET_96 vIndirect $205C, $0024, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSISELECT_D96 vIndirect $205C, $0028, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSISELATN_D96 vIndirect $205C, $002c, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSISELECT_S96 vIndirect $205C, $0030, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSISELATN_S96 vIndirect $205C, $0034, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSICMD_96 vIndirect $205C, $0038, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -NEWSCSIWBLIND_96 vIndirect $205C, $003c, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -NEWSCSIWRITE_96 vIndirect $205C, $0040, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -NEWSCSIRBLIND_96 vIndirect $205C, $0044, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -NEWSCSIREAD_96 vIndirect $205C, $0048, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSICOMPLETE_96 vIndirect $205C, $004c, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSIMSGIN_96 vIndirect $205C, $0050, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -DOSCSIMSGOUT_96 vIndirect $205C, $0054, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -CYCLEPHASE_96 vIndirect $205C, $0058, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -SCSIPCTO32BIT vIndirect $205C, $005c, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -ERROR vIndirect $205C, $0060, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -SCSIERR_96 vIndirect $205C, $0064, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -SWAPMMU vIndirect $205C, $0068, A7 ; {sources}OS:SCSIMgr:scsimgr96.a -SCSIHW vNoVector ; {sources}OS:SCSIMgr:scsimgrhw.a -DOSPINDOWN vNoVector ; {sources}OS:SCSIMgr:scsimgrhw.a -SLEEPTASK vNoVector ; {sources}OS:SCSIMgr:scsimgrhw.a -CLEARIRQ vIndirect $205C, $006c, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -DISENABLE vIndirect $205C, $0070, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -BUSERRHANDLER vIndirect $205C, $0074, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -ARB vIndirect $205C, $0078, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -SEL vIndirect $205C, $007c, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -DELAY22 vIndirect $205C, $0080, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -SCSIINTHND vIndirect $205C, $0084, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -TRANSFER vIndirect $205C, $0088, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -SLOWREAD vIndirect $205C, $008c, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -SLOWWRITE vIndirect $205C, $0090, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -VFASTWRITEOSS vIndirect $205C, $0094, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -PFASTWRITEOSS vIndirect $205C, $0098, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -PFASTWRITE vIndirect $205C, $009c, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -VFASTWRITE vIndirect $205C, $00a0, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -FASTWRITE vIndirect $205C, $00a4, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -FASTWRITEOSS vIndirect $205C, $00a8, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -VFASTREADOSS vIndirect $205C, $00ac, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -PFASTREADOSS vIndirect $205C, $00b0, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -PFASTREAD vIndirect $205C, $00b4, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -VFASTREAD vIndirect $205C, $00b8, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -FASTREAD vIndirect $205C, $00bc, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -FASTREADOSS vIndirect $205C, $00c0, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -SLOWCOMP vIndirect $205C, $00c4, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -FASTCOMP vIndirect $205C, $00c8, A7 ; {sources}OS:SCSIMgr:scsimgrhw.a -SCSIHW96 vNoVector ; {sources}OS:SCSIMgr:scsimgrhw96.a -INITHW_SCSI96 vNoVector ; {sources}OS:SCSIMgr:scsimgrhw96.a -INTHND_SCSI96 vIndirect $205C, $00cc, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -TRANSFER_96 vIndirect $205C, $00d0, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -XFER1BYTE vIndirect $205C, $00d4, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -SLOWREAD_96 vIndirect $205C, $00d8, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -SLOWWRITE_96 vIndirect $205C, $00dc, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -FASTWRITE_96 vIndirect $205C, $00e0, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -FASTREAD_96 vIndirect $205C, $00e4, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -RESETBUS_96 vIndirect $205C, $00e8, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -WAITFORINTNOTIME vIndirect $205C, $00ec, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -HANDLESELINPROG vIndirect $205C, $00f0, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -WT4DREQORINT vIndirect $205C, $00f4, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -WAITFORSCSIINTRP vIndirect $205C, $00f8, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -FASTCOMP_96 vIndirect $205C, $00fc, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -SLOWCOMP_96 vIndirect $205C, $0100, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -BUSERRHANDLER_96 vIndirect $205C, $0104, A7 ; {sources}OS:SCSIMgr:scsimgrhw96.a -SCSIINIT vNoVector ; {sources}OS:SCSIMgr:scsimgrinit.a -INITSCSIMGR vNoVector ; {sources}OS:SCSIMgr:scsimgrinit.a -INITSCSIHW vNoVector ; {sources}OS:SCSIMgr:scsimgrinit.a -SCSIINIT96 vNoVector ; {sources}OS:SCSIMgr:scsimgrinit96.a -INITMGR_SCSI96 vNoVector ; {sources}OS:SCSIMgr:scsimgrinit96.a -SCSISETFLAGS vIndirect $205C, $0108, A7 ; {sources}OS:SCSIMgr:scsimgrinitflags.a -SCSINEW vNoVector ; {sources}OS:SCSIMgr:scsimgrnew.a -NEWSCSITRAP vATrap A??? ; {sources}OS:SCSIMgr:scsimgrnew.a -ALTBUSCALL vIndirect $205C, $010c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -DOREQUESTIO vIndirect $205C, $0110, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -DOKILLIO vIndirect $205C, $0114, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -DOBUSINFO vIndirect $205C, $0118, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -RESETBUS vIndirect $205C, $011c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -ENDEQUEUE vIndirect $205C, $0120, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -LOGERROR vIndirect $205C, $0124, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -CLEARSTATE vIndirect $205C, $0128, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -CLEARBUS vIndirect $205C, $012c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MESSAGE vIndirect $205C, $0130, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -PREFLIGHT vIndirect $205C, $0134, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -SETUP vIndirect $205C, $0138, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -FIND vIndirect $205C, $013c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -SETTIMER vIndirect $205C, $0140, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -TIMETASK vIndirect $205C, $0144, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -SCSIDT vIndirect $205C, $0148, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -COMMAND vIndirect $205C, $014c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -STATUSPHASE vIndirect $205C, $0150, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGIN vIndirect $205C, $0154, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGINVALIDIN vIndirect $205C, $0158, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGIDENTIFYIN vIndirect $205C, $015c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGCMDCOMPLETE vIndirect $205C, $0160, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGSAVEDATAPTR vIndirect $205C, $0164, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGRESTOREPTRS vIndirect $205C, $0168, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGDISCONNECT vIndirect $205C, $016c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGMSGREJIN vIndirect $205C, $0170, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGLCCF vIndirect $205C, $0174, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGOUT vIndirect $205C, $0178, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGIDENTIFYOUT vIndirect $205C, $017c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGBUSDEVRST vIndirect $205C, $0180, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGMSGREJOUT vIndirect $205C, $0184, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGINVALIDOUT vIndirect $205C, $0188, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGKILLIO vIndirect $205C, $018c, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -MSGNOOP vIndirect $205C, $0190, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -DATAIO vIndirect $205C, $0194, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -DATADMA vIndirect $205C, $0198, A7 ; {sources}OS:SCSIMgr:scsimgrnew.a -SCSIOLD vNoVector ; {sources}OS:SCSIMgr:scsimgrold.a -SCSIMGR vATrap A??? ; {sources}OS:SCSIMgr:scsimgrold.a -UNIMPLEMENTED vIndirect $205C, $019c, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSISTAT vIndirect $205C, $01a0, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSIRESET vIndirect $205C, $01a4, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSIGET vIndirect $205C, $01a8, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSISELECT vIndirect $205C, $01ac, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSISELATN vIndirect $205C, $01b0, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSICMD vIndirect $205C, $01b4, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -NEWSCSIWBLIND vIndirect $205C, $01b8, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -NEWSCSIWRITE vIndirect $205C, $01bc, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -NEWSCSIRBLIND vIndirect $205C, $01c0, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -NEWSCSIREAD vIndirect $205C, $01c4, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSICOMPLETE vIndirect $205C, $01c8, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSIMSGIN vIndirect $205C, $01cc, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -DOSCSIMSGOUT vIndirect $205C, $01d0, A7 ; {sources}OS:SCSIMgr:scsimgrold.a -LATELOAD vIndirect $205C, $01d4, A7 ; {sources}OS:SCSIMgr:scsiLateLoad.a - -SCSIDISKMODE vNoVector -SCSIDISKWAKEALERT vNoVector -TESTFORDISKMODE vNoVector -SCSICYC96 vNoVector -SCSIERR_PSC vNoVector -NEWSCSIRBLIND_PSC vNoVector -NEWSCSIWBLIND_PSC vNoVector -NEWSCSIWRITE_PSC vNoVector -NEWSCSIREAD_PSC vNoVector -DOSCSIMSGIN_PSC vNoVector -DOSCSIGET_PSC vNoVector -DOSCSIRESET_PSC vNoVector -UNIMPLEMENTED_PSC vNoVector -ERROR_PSC vNoVector -SCSIPCTO32BIT_PSC vNoVector -DOSCSIMSGOUT_PSC vNoVector -DOSCSISTAT_PSC vNoVector -CYCLEPHASE_PSC vNoVector -DOSCSISELATN_DPSC vNoVector -DOSCSISELATN_SPSC vNoVector -DOSCSISELECT_DPSC vNoVector -DOSCSISELECT_SPSC vNoVector -DOSCSICOMPLETE_PSC vNoVector -DOSCSICMD_PSC vNoVector -SCSIMGR_PSC vNoVector -SCSICYCHW96 vNoVector -WAITFORINTNOTIME_PSC vNoVector -FASTCOMP_PSC vNoVector -FASTWRITE_PSC vNoVector -FASTREAD_PSC vNoVector -SLOWCOMP_PSC vNoVector -SLOWWRITE_PSC vNoVector -INTHND_SCSI_PSC vNoVector -INITHW_SCSI_PSC vNoVector -BUSERRHANDLER_PSC vNoVector -WAITFORSCSIINTRP_PSC vNoVector -RESETBUS_PSC vNoVector -HANDLESELINPROGPSC vNoVector -WT4DREQORINTPSC vNoVector -XFER1BYTE_PSC vNoVector -TRANSFER_PSC vNoVector -SLOWREAD_PSC vNoVector -SCSIMGRINITPSC vNoVector -INITMGR_SCSI_PSC vNoVector -SCSIC96INSTALL vNoVector -PATCHSCSIDRIVERS vNoVector -SCSIPATCHTOBLOCKIOINDRIVER vNoVector - -;ÑÑÑÑÑ SCSI Manager 4.3 ; {sources}OS:SCSIMgr4pt3:Å -SCSIAtomic vATrap A??? - -JmpToDrvr vIndirect $205C, $01d8, A7, hasAsyncSCSI ; BootItt.a -CheckSumDrvr vIndirect $205C, $01dc, A7, hasAsyncSCSI ; BootItt.a -; UNUSED vIndirect $205C, $01e0, A1, hasAsyncSCSI ; BootItt.c -; UNUSED vIndirect $205C, $01e4, A1, hasAsyncSCSI ; BootItt.c -; UNUSED vIndirect $205C, $01e8, A1, hasAsyncSCSI ; BootItt.c -ScanDrive vIndirect $205C, $01ec, A1, hasAsyncSCSI ; BootItt.c -LoadDriver vIndirect $205C, $01f0, A1, hasAsyncSCSI ; BootItt.c -ScRead vIndirect $205C, $01f4, A1, hasAsyncSCSI ; BootItt.c -; UNUSED vIndirect $205C, $01f8, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $01fc, Ax, hasAsyncSCSI ; HALc96.a -RecordEvent vIndirect $205C, $0200, A7, hasAsyncSCSI ; Recorder.a -; UNUSED vIndirect $205C, $0204, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0208, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $020c, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0210, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0214, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0218, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $021c, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0220, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0224, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0228, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $022c, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0230, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0234, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $0238, Ax, hasAsyncSCSI ; HALc96.a -; UNUSED vIndirect $205C, $023c, Ax, hasAsyncSCSI ; HALc96.a -SIMRegisterHAL vIndirect $205C, $0240, A1, hasAsyncSCSI ; HALc96Data.a -SIMReregisterHAL vIndirect $205C, $0244, A1, hasAsyncSCSI ; HALc96Data.a -SIMRegisterCommon vIndirect $205C, $0248, A1, hasAsyncSCSI ; HALc96Data.a -EarlySwitchPhase vIndirect $205C, $024c, A1, hasAsyncSCSI ; HALc96Data.a -WastePhase vIndirect $205C, $0250, A1, hasAsyncSCSI ; HALc96Data.a -HandleInitWErr vIndirect $205C, $0254, A1, hasAsyncSCSI ; HALc96Data.a -HandleRejectedIdentify vIndirect $205C, $0258, A1, hasAsyncSCSI ; HALc96Data.a -HandleEarlyMsgIn vIndirect $205C, $025c, A1, hasAsyncSCSI ; SIMmachine.c -HandleNoIdentifyMsg vIndirect $205C, $0260, A1, hasAsyncSCSI ; HALc96Data.a -CallMachine vIndirect $205C, $0264, A1, hasAsyncSCSI ; HALc96Data.a -GetVirtualIDInfo vIndirect $205C, $0268, A1, hasAsyncSCSI ; HALc96Data.a -CheckInterrupts vIndirect $205C, $026c, A1, hasAsyncSCSI ; HALc96Data.a -XPTCallCompRoutine vIndirect $205C, $0270, A1, hasAsyncSCSI ; HALc96Data.a -SIMIntPoll vIndirect $205C, $0274, A1, hasAsyncSCSI ; HALc96Data.a -SetupResetPB vIndirect $205C, $0278, A1, hasAsyncSCSI ; HALc96Data.a -ValidateDeviceIdent vIndirect $205C, $027c, A1, hasAsyncSCSI ; HALc96HWInit.a -TryToRecover vIndirect $205C, $0280, A1, hasAsyncSCSI ; HALc96Init.a -XPTRegisterCommon vIndirect $205C, $0284, A1, hasAsyncSCSI ; HALc96HWInit.a -NewXPTioPB vIndirect $205C, $0288, A1, hasAsyncSCSI ; HALc96PSC.a -; UNUSED vIndirect $205C, $028c, Ax, hasAsyncSCSI ; HALc96DMA.a -; UNUSED vIndirect $205C, $0290, Ax, hasAsyncSCSI ; HALc96DMA.a -; UNUSED vIndirect $205C, $0294, Ax, hasAsyncSCSI ; HALc96DMA.a -COMPRESETDEVICE vIndirect $205C, $0298, A7, hasAsyncSCSI ; HALc96DMA.a -Disconnected vIndirect $205C, $029c, A1, hasAsyncSCSI ; HALc96Routines.a -ciDebuggerPatch vIndirect $205C, $02a0, A7, hasAsyncSCSI ; XPT.a -ReRegisterAllSIMs vIndirect $205C, $02a4, A1, hasAsyncSCSI ; XPT.c -; UNUSED vIndirect $205C, $02a8, Ax, hasAsyncSCSI ; HALc96Routines.a -; UNUSED vIndirect $205C, $02ac, Ax, hasAsyncSCSI ; HALc96Routines.a -; UNUSED vIndirect $205C, $02b0, Ax, hasAsyncSCSI ; HALc96Routines.a -; UNUSED vIndirect $205C, $02b4, Ax, hasAsyncSCSI ; HALc96Routines.a -Ck4SCSIInt vIndirect $205C, $02b8, A7, hasAsyncSCSI ; HALc96Routines.a -Wt4SCSIInt vIndirect $205C, $02bc, A7, hasAsyncSCSI ; InitItt.c -Ck4DREQ vIndirect $205C, $02c8, A7, hasAsyncSCSI ; HALc96Routines.a -; UNUSED vIndirect $205C, $02c0, Ax, hasAsyncSCSI ; HALc96Routines.a -; UNUSED vIndirect $205C, $02c4, Ax, hasAsyncSCSI ; HALc96Routines.a - -; UNUSED vIndirect $205C, $02cc, Ax, hasAsyncSCSI ; -; UNUSED vIndirect $205C, $02d0, Ax, hasAsyncSCSI ; -; UNUSED vIndirect $205C, $02d4, Ax, hasAsyncSCSI ; -; UNUSED vIndirect $205C, $02d8, Ax, hasAsyncSCSI ; -; UNUSED vIndirect $205C, $02dc, Ax, hasAsyncSCSI ; -; UNUSED vIndirect $205C, $02e0, Ax, hasAsyncSCSI ; Recorder.a -CallOldXPT vIndirect $205C, $02e4, A7, hasAsyncSCSI ; SCSIGlue.a -; UNUSED vIndirect $205C, $02e8, Ax, hasAsyncSCSI ; SCSIGlue.a -; UNUSED vIndirect $205C, $02ec, Ax, hasAsyncSCSI ; SCSIGlue.a -; UNUSED vIndirect $205C, $02f0, Ax, hasAsyncSCSI ; SCSIGlue.a -SIMaction vIndirect $205C, $02f4, A1, hasAsyncSCSI ; SIMCore.c -NewOldCall vIndirect $205C, $02f8, A1, hasAsyncSCSI ; SIMCore.c -SIMinit vIndirect $205C, $02fc, A1, hasAsyncSCSI ; SIMCore.c -SIM_ISR vIndirect $205C, $0300, A1, hasAsyncSCSI ; SIMCore.c -ResetSIM vIndirect $205C, $0304, A1, hasAsyncSCSI ; SIMCore.c -ResetDevice vIndirect $205C, $0308, A1, hasAsyncSCSI ; SIMCore.c -TerminateIO vIndirect $205C, $030c, A1, hasAsyncSCSI ; SIMCore.c -AbortCommand vIndirect $205C, $0310, A1, hasAsyncSCSI ; SIMCore.c -SetTempXPTg vIndirect $205C, $0314, A1, hasAsyncSCSI ; XPT.c -EnQIO vIndirect $205C, $0318, A1, hasAsyncSCSI ; SIMQ.c -DeQIO vIndirect $205C, $031c, A1, hasAsyncSCSI ; SIMQ.c -GetNextReadyIO vIndirect $205C, $0320, A1, hasAsyncSCSI ; SIMQ.c -ResetQueues vIndirect $205C, $0324, A1, hasAsyncSCSI ; SIMQ.c -GetNextAutoSense vIndirect $205C, $0328, A1, hasAsyncSCSI ; SIMQ.c -FindIO vIndirect $205C, $032c, A1, hasAsyncSCSI ; SIMQ.c -SwitchQ vIndirect $205C, $0330, A1, hasAsyncSCSI ; SIMQ.c -; UNUSED vIndirect $205C, $0334, Ax, hasAsyncSCSI ; SIMmachine.a -; UNUSED vIndirect $205C, $0338, Ax, hasAsyncSCSI ; SIMmachine.a -VMEnableUserCode vIndirect $205C, $033c, A7, hasAsyncSCSI ; SIMmachine.a -VMDisableUserCode vIndirect $205C, $0340, A7, hasAsyncSCSI ; SIMmachine.a -TheMachine vIndirect $205C, $0344, A1, hasAsyncSCSI ; SIMmachine.c -Reconnect vIndirect $205C, $0348, A1, hasAsyncSCSI ; SIMmachine.c -SwitchPhase vIndirect $205C, $034c, A1, hasAsyncSCSI ; SIMmachine.c -FreeMachine vIndirect $205C, $0350, A1, hasAsyncSCSI ; SIMmachine.c -StartMachine vIndirect $205C, $0354, A1, hasAsyncSCSI ; SIMmachine.c -NewIOStartMachine vIndirect $205C, $0358, A1, hasAsyncSCSI ; SIMmachine.c -; UNUSED vIndirect $205C, $035c, Ax, hasAsyncSCSI ; SIMmachine.c -CompleteIO vIndirect $205C, $0360, A1, hasAsyncSCSI ; SIMmachine.c -; UNUSED vIndirect $205C, $0364, Ax, hasAsyncSCSI ; SIMmachine.c -CheckErrors vIndirect $205C, $0368, A1, hasAsyncSCSI ; SIMmachine.c -SetupSensePB vIndirect $205C, $036c, A1, hasAsyncSCSI ; SIMmachine.c -COMPAUTOSENSE vIndirect $205C, $0370, A1, hasAsyncSCSI ; SIMmachine.c -ValidatePB vIndirect $205C, $0374, A1, hasAsyncSCSI ; SIMmachine.c -StartTimer vIndirect $205C, $0378, A1, hasAsyncSCSI ; Timeout.c -SIMTimerProc vIndirect $205C, $037c, A7, hasAsyncSCSI ; Timeout.c -; UNUSED vIndirect $205C, $0380, Ax, hasAsyncSCSI ; XPT.a -; UNUSED vIndirect $205C, $0384, Ax, hasAsyncSCSI ; XPT.a -; UNUSED vIndirect $205C, $0388, Ax, hasAsyncSCSI ; XPT.a -; UNUSED vIndirect $205C, $038c, Ax, hasAsyncSCSI ; XPT.a -; UNUSED vIndirect $205C, $0390, Ax, hasAsyncSCSI ; XPT.a -; UNUSED vIndirect $205C, $0394, Ax, hasAsyncSCSI ; XPT.c -; UNUSED vIndirect $205C, $0398, Ax, hasAsyncSCSI ; XPT.c -; UNUSED vIndirect $205C, $039c, Ax, hasAsyncSCSI ; XPT.c -XPTRegisterBus vIndirect $205C, $03a0, A1, hasAsyncSCSI ; XPT.c -XPTDeregisterBus vIndirect $205C, $03a4, A1, hasAsyncSCSI ; XPT.c -XPTAction vIndirect $205C, $03a8, A1, hasAsyncSCSI ; XPT.c -CallSIMaction vIndirect $205C, $03ac, A1, hasAsyncSCSI ; XPT.c -SyncWait vIndirect $205C, $03b0, A1, hasAsyncSCSI ; XPT.c -XPTKillXPT vIndirect $205C, $03b4, A1, hasAsyncSCSI ; XPT.c -DispatchISR vIndirect $205C, $03b8, A1, hasAsyncSCSI ; XPT.c -SetRefNum vIndirect $205C, $03bc, A1, hasAsyncSCSI ; XPT.c -GetRefNum vIndirect $205C, $03c0, A1, hasAsyncSCSI ; XPT.c -RemoveRefNum vIndirect $205C, $03c4, A1, hasAsyncSCSI ; XPT.c -CallCompRoutine vIndirect $205C, $03c8, A1, hasAsyncSCSI ; XPT.c -XPTReregisterBus vIndirect $205C, $03cc, A1, hasAsyncSCSI ; XPT.c -SCSIXLATE vIndirect $205C, $03d0, A7, hasAsyncSCSI ; XPTSCSIXlate.a -; UNUSED vIndirect $205C, $03d4, Ax, hasAsyncSCSI ; -Clear vIndirect $205C, $03d8, A1, hasAsyncSCSI ; XPTfunctions.c -; UNUSED vIndirect $205C, $03dc, Ax, hasAsyncSCSI ; -OldSCSICall vIndirect $205C, $03e0, A1, hasAsyncSCSI ; XPToldCall.c -EnumPhaseToSCSIStat vIndirect $205C, $03e4, A1, hasAsyncSCSI ; XPToldCall.c -CallSIMNewOldCall vIndirect $205C, $03e8, A1, hasAsyncSCSI ; XPToldCall.c -OldCallWait vIndirect $205C, $03ec, A1, hasAsyncSCSI ; XPToldCall.c -getTimerPB vIndirect $205C, $03f0, A7, hasAsyncSCSI ; timeout.a - - -SIMCoreRegisterHAL vNoVector -FindIOFromID vNoVector - -AttemptDriverLoad vNoVector - -InitXPT vNoVector -SetXPTg vNoVector -XlateOldSCSIGlobals vNoVector -Init_SCSIXlate vNoVector -InitRecorder vNoVector -InitItt vNoVector -TestFor_SCSI96_1Exists vNoVector -TestFor_SCSI96_2Exists vNoVector -TestFor_PSCExists vNoVector -WtForFIFOData vNoVector -Init53c9xSW vNoVector -OldSCSIExists vNoVector -SCSITrap vNoVector -getCurrentA5 vNoVector -restoreCurrentA5 vNoVector -InitSyncWait vNoVector -RemoveSyncWait vNoVector -ReconnectISR vNoVector -BlockInterrupts vNoVector -UnblockInterrupts vNoVector -Install_ISR vNoVector -OneByteRead vNoVector -OneByteWrite vNoVector -Xfer1Byte96 vNoVector -SlowRead96 vNoVector -FastRead96 vNoVector -SlowWrite96 vNoVector -FastWrite96 vNoVector -Init53c9xHW vNoVector -Initc96Asm vNoVector -AsmInit53c9xHW vNoVector -HALinit vNoVector -GetHalInfo vNoVector -HALSyncConfig vNoVector -HALTeardownIO vNoVector -HALAssertATN vNoVector -HALResetBus vNoVector -HALIntPoll vNoVector -CallBusInquiry vNoVector -HALaction vNoVector -CallCompRoutineGlue vNoVector -Ck4IgnoreCmdShOptDel vNoVector -Ck4OnlyLoadFromDefault vNoVector -AutoMsgIn vNoVector -HandleBusInt vNoVector -InitHW_SCSI96_BIOS vNoVector -DoWeHaveFastSCSI vNoVector -DataIn_DMA1x1 vNoVector -DataOut_DMA1x1 vNoVector -InitAMIC vNoVector -HALc96DataBIOS vNoVector -OneByteWrite_BIOS vNoVector -OneByteRead_BIOS vNoVector -FastWrite_96_BIOS vNoVector -FastRead_96_BIOS vNoVector -DeferAndWait vNoVector -DataDTask vNoVector -RemoveBEH96 vNoVector -InstallBEH96 vNoVector -CEnqueueHead vNoVector -TestFor_OrwellExists vNoVector -TestFor_djMEMCExists vNoVector -IllegalInstr vNoVector -UnimplementedATrap vNoVector -VMRunning vNoVector -InitXPTAsm vNoVector -Ck4EjectableVolume vNoVector -DummyOldCallRead vNoVector -ReInitHAL vNoVector -HALInitCommon vNoVector -InitHW_AMIC vNoVector -InitSW_AMIC vNoVector -SetupIOAMIC vNoVector -TeardownIOAMIC vNoVector -InitHW_PSC vNoVector -InitSW_PSC vNoVector -SetupIOPSC vNoVector -TeardownIOPSC vNoVector - -HALc96 vDataTable ; HALc96.a -HALc96Data vDataTable ; HALc96Data.a -HALc96Init vDataTable ; HALc96Init.a - -;ÑÑÑ Internally Dispatched Entry points -DoInitiate vNoVector -DoBitBucket vNoVector -DoDataIn vNoVector -DoDataOut vNoVector -DoAcceptMsg vNoVector -DoMsgIn vNoVector -DoMsgOut vNoVector -DoStatus vNoVector -DoComplete vNoVector -DoSaveDataPointer vNoVector -DoModifyDataPointer vNoVector -DoRestorePointers vNoVector -GetReconnectInfo vNoVector -GetSelectInfo vNoVector -DoSelect vNoVector -DoSelectWAtn vNoVector -DoCommand vNoVector -SetParity vNoVector -SetupIONoDMA vNoVector -DoReset vNoVector -DoAssertATN vNoVector -TeardownIONoDMA vNoVector -HandleSelected vNoVector - -;ÑÑÑ Internally Dispatched (Non-entry points) -InitDataBuffer vNoVector -InitDataTIB vNoVector -InitDataSG vNoVector -DoDataBuffer vNoVector -DoDataTIB vNoVector -DoDataSG vNoVector -DataIn_DMA vNoVector -DataOut_DMA vNoVector -CyclePhase vNoVector -BusErrHandler96 vNoVector - -;ÑÑÑ Internally Vectored (Non-entry points) -Wt4SelectComplete vNoVector -StartPSC vNoVector ; HALc96PSC.a -PausePSC vNoVector ; HALc96PSC.a -Wt4PSCComplete vNoVector ; HALc96PSC.a -StopPSCRead vNoVector ; HALc96PSC.a -StopPSCWrite vNoVector ; HALc96PSC.a -StartAMIC vNoVector ; HALc96AMIC.a -Wt4AMICComplete vNoVector ; HALc96AMIC.a -StopAMICRead vNoVector ; HALc96AMIC.a -StopAMICWrite vNoVector ; HALc96AMIC.a -DMAInitSW vNoVector ; HALc96PSC.c -HALc96Routines vNoVector ; HALc96Routines.a -SizeOfGlobals vNoVector ; HALc96Routines.a -HAL_SingleISR vNoVector ; HALc96Routines.a -InterruptLevel vNoVector ; XPT.a -DEFERREDCALL vNoVector ; XPT.a -InitDataStuff vNoVector -TeardownIO vNoVector -Init53x9xRegs vNoVector -HAL_DualISR vNoVector -TestFor_HMCDecoder vNoVector -SetLoadFlag vNoVector -SOpenDriver vNoVector -HAL_NoISR vNoVector -DMAInitHW vNoVector -SetupIOPB vNoVector -TeardownIOPB vNoVector -ITTGESTALT vNoVector -XPT_ISR0 vNoVector -XPT_ISR1 vNoVector -XPT_ISR2 vNoVector -XPT_ISR3 vNoVector -XPT_ISR4 vNoVector -XPT_ISR5 vNoVector -XPT_ISR6 vNoVector -XPT_ISR7 vNoVector -XPT_ISR8 vNoVector -XPT_ISR9 vNoVector -XPT_ISRa vNoVector -XPT_ISRb vNoVector -XPT_ISRc vNoVector -XPT_ISRd vNoVector -XPT_ISRe vNoVector -XPT_ISRf vNoVector -ReadInitiatorID vNoVector -GetInitiatorID vNoVector - -;ÑÑÑ Non-vectored but we don't want them vectored (debugging or init things) -ISITT vNoVector -INITSCSIBOOT vNoVector -ITTBOOT vNoVector -RecordError vNoVector - -;============================== End SCSI Manager Vectors - ;============================== Script Manager Vectors GETIDENTRY vIndirect $2060, $0004, A7 ; {sources}Toolbox:ScriptMgr:DblByteCompat.a @@ -3485,6 +2502,9 @@ INTLTOKENIZE vIndirect $2060, $01dc, A7 ; {sources}Toolbox:ScriptMgr:Script MAXOLDDATE vDataTable ; {sources}Objects:ROM:ScriptMgr.lib SECSINDAYX vDataTable ; {sources}Objects:ROM:ScriptMgr.lib +SCRIPTMGR_VEC01E0 vIndirect $2060, $01e0, A7 +SCRIPTMGR_VEC01E4 vIndirect $2060, $01e4, A7 + ;============================== End Script Manager Vectors ;============================== Segment Loader Vectors @@ -3525,8 +2545,8 @@ UPDATEEMUWARMSTART vIndirect $2068, $002C, A7 ; {sources}Toolbox:ShutDownMgr ;============================== Original SuperMario Team Names -MAGICNAME vIndirect $206C, $0004, A7 ; Ricardo's attempt to hide the name strings -MAGIC vIndirect $206C, $0008, A7 ; can be found in {Sources}OS:MagicData.a +;MAGICNAME vIndirect $206C, $0004, A7 ; Ricardo's attempt to hide the name strings +;MAGIC vIndirect $206C, $0008, A7 ; can be found in {Sources}OS:MagicData.a ;============================== Original SuperMario Team Names @@ -3563,8 +2583,8 @@ CARDCHANGED vIndirect $206C, $003c, A7 ; {sources}OS:SlotMgr:SlotMgr.a SLOTEXEC vIndirect $206C, $0040, A7 ; {sources}OS:SlotMgr:SlotMgr.a CALCSPOINTER vIndirect $206C, $0044, A7 ; {sources}OS:SlotMgr:SlotMgr.a GETSLOTDRVR vIndirect $206C, $0048, A7 ; {sources}OS:SlotMgr:SlotMgr.a -GETDRIVERPATCH vIndirect $206C, $004c, A7, has2MegROMOrMore ; {sources}OS:SlotMgr:SlotMgr.a -GETDEVINDEX vIndirect $206C, $0050, A7, has2MegROMOrMore ; {sources}OS:SlotMgr:SlotMgr.a +;GETDRIVERPATCH vIndirect $206C, $004c, A7, has2MegROMOrMore ; {sources}OS:SlotMgr:SlotMgr.a +;GETDEVINDEX vIndirect $206C, $0050, A7, has2MegROMOrMore ; {sources}OS:SlotMgr:SlotMgr.a JSRTBL vDataTable ; {sources}OS:SlotMgr:SlotMgr.a READSLOTPRAM vIndirect $206C, $0054, A7 ; {sources}OS:SlotMgr:SlotMgr.a PUTSLOTPRAM vIndirect $206C, $0058, A7 ; {sources}OS:SlotMgr:SlotMgr.a @@ -3623,124 +2643,6 @@ SECONDARYEND vNoVector ; {sources}OS:SlotMgr:SlotMgrInit.a ;============================== End Slot Manager Vectors -;============================== Sound Manager Vectors - -AcceptInitOptions vIndirect $2070, $0004, A7 ; {sources}Toolbox:SoundMgr: -AddToHead vIndirect $2070, $0008, A7 ; {sources}Toolbox:SoundMgr: -CancelWaitCallback vIndirect $2070, $000c, A7 ; {sources}Toolbox:SoundMgr: -ClearASCInt vIndirect $2070, $0010, A7 ; {sources}Toolbox:SoundMgr: -ClearStandardASCInterrupt vNoVector -CloseOutputDevice vIndirect $2070, $0018, A7 ; {sources}Toolbox:SoundMgr: -__Comp3to1 vIndirect $2070, $001c, A7 ; {sources}Toolbox:SoundMgr: -__Comp6to1 vIndirect $2070, $0020, A7 ; {sources}Toolbox:SoundMgr: -CountMatchingBits vIndirect $2070, $0024, A7 ; {sources}Toolbox:SoundMgr: -DisableASCInts vIndirect $2070, $0028, A7 ; {sources}Toolbox:SoundMgr: -DisableStandardASCInterrupt vNoVector -DispAddTool vIndirect $2070, $0030, A7 ; {sources}Toolbox:SoundMgr: -DispFuncDisp vIndirect $2070, $0034, A7 ; {sources}Toolbox:SoundMgr: -DispRemTool vNoVector -DispToolAddr vNoVector -DispVersion vNoVector -DoNothing vNoVector -DOUBLEBUFFERCOMPLETE vIndirect $2070, $0048, A7 ; {sources}Toolbox:SoundMgr: -EnableASCInts vIndirect $2070, $004c, A7 ; {sources}Toolbox:SoundMgr: -EnableStandardASCInterrupt vNoVector -__Exp1to3 vIndirect $2070, $0054, A7 ; {sources}Toolbox:SoundMgr: -__Exp1to6 vIndirect $2070, $0058, A7 ; {sources}Toolbox:SoundMgr: -GetBuiltInDevice vIndirect $2070, $005c, A7 ; {sources}Toolbox:SoundMgr: -GetHardwareVolume vIndirect $2070, $0060, A7 ; {sources}Toolbox:SoundMgr: -GetSoundAttributes vIndirect $2070, $0064, A7 ; {sources}Toolbox:SoundMgr: -GetThisComponent vIndirect $2070, $0068, A7 ; {sources}Toolbox:SoundMgr: -HGetFCBInfo vIndirect $2070, $006c, A7 ; {sources}Toolbox:SoundMgr: -InitSoundMgr vNoVector ; {sources}Toolbox:SoundMgr: -InitSndDispatch vIndirect $2070, $0074, A7 ; {sources}Toolbox:SoundMgr: -InitWaveBuffer vIndirect $2070, $0078, A7 ; {sources}Toolbox:SoundMgr: -InsertInQueue vIndirect $2070, $007c, A7 ; {sources}Toolbox:SoundMgr: -InstallNewGlobals vIndirect $2070, $0080, A7 ; {sources}Toolbox:SoundMgr: -InstallSoundIntHandler vIndirect $2070, $0084, A7 ; {sources}Toolbox:SoundMgr: -IsDeadProcess vIndirect $2070, $0088, A7 ; {sources}Toolbox:SoundMgr: -IsUnknownChannel vIndirect $2070, $008c, A7 ; {sources}Toolbox:SoundMgr: -LoadSoundInputDriver vIndirect $2070, $0090, A7 ; {sources}Toolbox:SoundMgr: -MACEDispatch vIndirect $2070, $0094, A7 ; {sources}Toolbox:SoundMgr: -MakeFlags vIndirect $2070, $0098, A7 ; {sources}Toolbox:SoundMgr: -NEXTDOUBLEBUFFER vIndirect $2070, $009c, A7 ; {sources}Toolbox:SoundMgr: -NextFromQueue vIndirect $2070, $00a0, A7 ; {sources}Toolbox:SoundMgr: -NEXTNOTEBUFFER vIndirect $2070, $00a4, A7 ; {sources}Toolbox:SoundMgr: -NEXTWAVEBUFFER vIndirect $2070, $00a8, A7 ; {sources}Toolbox:SoundMgr: -OpenOutputDevice vIndirect $2070, $00ac, A7 ; {sources}Toolbox:SoundMgr: -OpenPreferenceFile vIndirect $2070, $00b0, A7 ; {sources}Toolbox:SoundMgr: -PowerTable vDataTable ; {sources}Toolbox:SoundMgr: -PrepChannel vIndirect $2070, $00b8, A7 ; {sources}Toolbox:SoundMgr: -PrepDoubleBuffer vIndirect $2070, $00bc, A7 ; {sources}Toolbox:SoundMgr: -PrepNoteBuffer vIndirect $2070, $00c0, A7 ; {sources}Toolbox:SoundMgr: -PrepSoundParamBlock vIndirect $2070, $00c4, A7 ; {sources}Toolbox:SoundMgr: -PrepWaveBuffer vIndirect $2070, $00c8, A7 ; {sources}Toolbox:SoundMgr: -ProcessCmd vIndirect $2070, $00cc, A7 ; {sources}Toolbox:SoundMgr: -ProcessNextCmd vIndirect $2070, $00d0, A7 ; {sources}Toolbox:SoundMgr: -PumpSndResource vIndirect $2070, $00d4, A7 ; {sources}Toolbox:SoundMgr: -QuantizeSample vNoVector -SadismDispatch vIndirect $2070, $00dc, A7 ; {sources}Toolbox:SoundMgr: -SadismJmpTable vNoVector -SamplesToBytes vNoVector -ScheduleWaitCallback vIndirect $2070, $00e8, A7 ; {sources}Toolbox:SoundMgr: -SetChannelType vIndirect $2070, $00ec, A7 ; {sources}Toolbox:SoundMgr: -SetSoundHeader vIndirect $2070, $00f0, A7 ; {sources}Toolbox:SoundMgr: -SetTimbre vIndirect $2070, $00f4, A7 ; {sources}Toolbox:SoundMgr: -SetUpSifter vIndirect $2070, $00f8, A7 ; {sources}Toolbox:SoundMgr: -SetupSoundInterruptVectors vIndirect $2070, $00fc, A7 ; {sources}Toolbox:SoundMgr: -SetWaveTable vIndirect $2070, $0100, A7 ; {sources}Toolbox:SoundMgr: -SineTable vDataTable ; {sources}Toolbox:SoundMgr: -SndManagerDispatch vIndirect $2070, $0108, A7 ; {sources}Toolbox:SoundMgr: -SndManagerJmpTable vNoVector ; {sources}Toolbox:SoundMgr: -SOUNDCOMPLETE vIndirect $2070, $0110, A7 ; {sources}Toolbox:SoundMgr: -SoundDispatcher vIndirect $2070, $0114, A7 ; {sources}Toolbox:SoundMgr: -SoundInDispatch vIndirect $2070, $0118, A7 ; {sources}Toolbox:SoundMgr: -SoundIntHandler vIndirect $2070, $011c, A7 ; {sources}Toolbox:SoundMgr: -StartSyncedSounds vIndirect $2070, $0120, A7 ; {sources}Toolbox:SoundMgr: -TryRomBeep vIndirect $2070, $0124, A7 ; {sources}Toolbox:SoundMgr: -TwelthPower vIndirect $2070, $0128, A7 ; {sources}Toolbox:SoundMgr: -UnimplFunction vIndirect $2070, $012c, A7 ; {sources}Toolbox:SoundMgr: -WAITCOMPLETION vIndirect $2070, $0130, A7 ; {sources}Toolbox:SoundMgr: -__CLOSEMIXERCOMPONENT vIndirect $2070, $0134, A7 ; {sources}Toolbox:SoundMgr: -__DISPOSESOUNDGLOBALS vIndirect $2070, $0138, A7 ; {sources}Toolbox:SoundMgr: -__GETCOMPRESSIONINFO vIndirect $2070, $013c, A7 ; {sources}Toolbox:SoundMgr: -__GETDEFAULTOUTPUTVOLUME vIndirect $2070, $0140, A7 ; {sources}Toolbox:SoundMgr: -__GETDEFAULTSOUNDOUTPUT vIndirect $2070, $0144, A7 ; {sources}Toolbox:SoundMgr: -__GETSOUNDHEADEROFFSET vIndirect $2070, $0148, A7 ; {sources}Toolbox:SoundMgr: -__GETSOUNDPREFERENCE vIndirect $2070, $014c, A7 ; {sources}Toolbox:SoundMgr: -__GETSYSBEEPVOLUME vIndirect $2070, $0150, A7 ; {sources}Toolbox:SoundMgr: -__MAKESIFTERCHAIN vIndirect $2070, $0154, A7 ; {sources}Toolbox:SoundMgr: -__MulDivU vIndirect $2070, $0158, A7 ; {sources}Toolbox:SoundMgr: -__OPENMIXERCOMPONENT vIndirect $2070, $015c, A7 ; {sources}Toolbox:SoundMgr: -__SETDEFAULTOUTPUTVOLUME vIndirect $2070, $0160, A7 ; {sources}Toolbox:SoundMgr: -__SETDEFAULTSOUNDOUTPUT vIndirect $2070, $0164, A7 ; {sources}Toolbox:SoundMgr: -__SETSOUNDPREFERENCE vIndirect $2070, $0168, A7 ; {sources}Toolbox:SoundMgr: -__SETSOUNDVOL vNoVector -__SETSYSBEEPVOLUME vIndirect $2070, $0170, A7 ; {sources}Toolbox:SoundMgr: -__SNDADDMODIFIER vIndirect $2070, $0174, A7 ; {sources}Toolbox:SoundMgr: -__SNDAPPDEAD vIndirect $2070, $0178, A7 ; {sources}Toolbox:SoundMgr: -__SNDCHANNELSTATUS vIndirect $2070, $017c, A7 ; {sources}Toolbox:SoundMgr: -__SNDCONTROL vIndirect $2070, $0180, A7 ; {sources}Toolbox:SoundMgr: -__SNDDISPOSECHANNEL vIndirect $2070, $0184, A7 ; {sources}Toolbox:SoundMgr: -__SNDDOCOMMAND vIndirect $2070, $0188, A7 ; {sources}Toolbox:SoundMgr: -__SNDDOIMMEDIATE vIndirect $2070, $018c, A7 ; {sources}Toolbox:SoundMgr: -__SNDGETSYSBEEPSTATE vIndirect $2070, $0190, A7 ; {sources}Toolbox:SoundMgr: -__SNDMANAGERSTATUS vIndirect $2070, $0194, A7 ; {sources}Toolbox:SoundMgr: -__SNDNEWCHANNEL vIndirect $2070, $0198, A7 ; {sources}Toolbox:SoundMgr: -__SNDPLAY vIndirect $2070, $019c, A7 ; {sources}Toolbox:SoundMgr: -__SNDPLAYDOUBLEBUFFER vIndirect $2070, $01a0, A7 ; {sources}Toolbox:SoundMgr: -__SNDSETSYSBEEPSTATE vIndirect $2070, $01a4, A7 ; {sources}Toolbox:SoundMgr: -__SNDSOUNDMANAGERVERSION vIndirect $2070, $01a8, A7 ; {sources}Toolbox:SoundMgr: -__SYSBEEP vIndirect $2070, $01ac, A7 ; {sources}Toolbox:SoundMgr: - -DELTA_TABLE vDataTable ; {sources}Toolbox:SoundMgr:Tables.3.a -MIN2_TABLE vDataTable ; {sources}Toolbox:SoundMgr:Tables.3.a -MIN3_TABLE vDataTable ; {sources}Toolbox:SoundMgr:Tables.3.a -IQUADEL2_TABLE vDataTable ; {sources}Toolbox:SoundMgr:Tables.3.a -IQUADEL3_TABLE vDataTable ; {sources}Toolbox:SoundMgr:Tables.3.a - -;============================== End Sound Manager Vectors - ;============================== Start Manager Vectors SIZEMEMORY vNoVector ; {sources}OS:StartMgr:SizeMem.a ALLOCFAKERGNS vNoVector ; {sources}OS:StartMgr:StartAlert.a @@ -3904,101 +2806,6 @@ SONIC_Test vNoVector ; {sources}OS:StartMgr:UnivTestEnv:SONIC_Test.c ;============================== End Start Manager Vectors -;============================== Text Services Manager Vectors - -TSMDISPATCH vATrap A??? ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -XINITTSMAWAREAPPLICATION vIndirect $2078, $0004, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -xInitTSMAwareDriver vIndirect $2078, $0008, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utaRecordDocumentID vIndirect $2078, $000c, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utaRemoveDocumentID vIndirect $2078, $0010, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utaUpdateAppFlagInPSNTable vIndirect $2078, $0014, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utaUpdateDocFlagInPSNTable vIndirect $2078, $0018, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utaTSMAwareApplicationP vIndirect $2078, $001c, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -XCLOSETSMAWAREAPPLICATION vIndirect $2078, $0020, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utCloseAppCommon vIndirect $2078, $0024, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -UTAGETTSMAWAREDOCTABLE vIndirect $2078, $0028, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -UTAGETTSMAPPRECORDPTR vIndirect $2078, $002c, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -UTAGETAPPSUSEINPUTWINDOWFLAG vIndirect $2078, $0030, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -UTAISAPPTSMAWAREANDNOTUSINGIW vIndirect $2078, $0034, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -XINFORMTSM vIndirect $2078, $0038, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -TSMGestalt vIndirect $2078, $003c, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -TSMGRINSTALL vIndirect $2078, $0040, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -OLDJAPANESEINPUTMETHODEXISTS vIndirect $2078, $0044, A7 ; {sources}Toolbox:TextServicesMgr:TSMExtension.a -utNewTSMDocument vIndirect $2078, $0048, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XNEWTSMDOCUMENT4SWM vIndirect $2078, $004c, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XNEWTSMDOCUMENT vIndirect $2078, $0050, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XDELETETSMDOCUMENT vIndirect $2078, $0054, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XDEACTIVATETSMDOCUMENT vIndirect $2078, $0058, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XACTIVATETSMDOCUMENT vIndirect $2078, $005c, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -utTSMEvent2InputMethod vIndirect $2078, $0060, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XTSMEVENTFROMSWM vIndirect $2078, $0064, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XTSMEVENT vIndirect $2078, $0068, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XTSMMENUSELECT vIndirect $2078, $006c, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XFIXTSMDOCUMENT vIndirect $2078, $0070, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XSETTSMCURSOR vIndirect $2078, $0074, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XGETSERVICELIST vIndirect $2078, $0078, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XOPENTEXTSERVICE vIndirect $2078, $007c, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XCLOSETEXTSERVICE vIndirect $2078, $0080, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -utMapInstance2Refcon vIndirect $2078, $0084, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -XSENDAETOCLIENT vIndirect $2078, $0088, A1 ; {sources}Toolbox:TextServicesMgr:TSMFunctions.c -utJustDeactivateIM4Document vIndirect $2078, $008c, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utBadSandL vIndirect $2078, $0090, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utVerifyTSMDocID vIndirect $2078, $0094, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utAppendTS2Document vIndirect $2078, $0098, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utMakeRoom4SInfoHandle vIndirect $2078, $009c, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utHidePaletteAndMenu vIndirect $2078, $00a0, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utCleanUpPreviousDoc vIndirect $2078, $00a4, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utCreateSystemVersionOfMenu vIndirect $2078, $00a8, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utActivateIM4Document vIndirect $2078, $00ac, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utDeactivateIMforDocument vIndirect $2078, $00b0, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utDeleteCleanUpTSMDocument vIndirect $2078, $00b4, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utCloseIM4Document vIndirect $2078, $00b8, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utDeleteInputMethodsPreviousMenu vIndirect $2078, $00bc, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utCheckSysHeapSlop vIndirect $2078, $00c0, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utOpenIM4Document vIndirect $2078, $00c4, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utOpenActivateDefaultIM vIndirect $2078, $00c8, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utActivateThisDocsInputMethod vIndirect $2078, $00cc, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utSupportedSL vIndirect $2078, $00d0, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utScriptIsNotCCJK vIndirect $2078, $00d4, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utScriptIsCCJKAndNeedsIM vIndirect $2078, $00d8, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utInformPMgr vIndirect $2078, $00dc, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utDocNeedsInputMethod vIndirect $2078, $00e0, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utGetScriptIndex vIndirect $2078, $00e4, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utGetTSMDefaultInputMethod vIndirect $2078, $00e8, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utSLRec2CompFlag vIndirect $2078, $00ec, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utChangeToOldJIM vIndirect $2078, $00f0, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utSuspendResumeApp vIndirect $2078, $00f4, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utAddTSMResource vIndirect $2078, $00f8, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utUpdateDefaultInputMethodResource vIndirect $2078, $00fc, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utFixDocumentAndCloseSWMWindow vIndirect $2078, $0100, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utCloseSWMWindow vIndirect $2078, $0104, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utDeleteMenu vIndirect $2078, $0108, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utDeleteSysMenu vIndirect $2078, $010c, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -utSwapZone vIndirect $2078, $0110, A1 ; {sources}Toolbox:TextServicesMgr:TSMInternalUtils.c -XSETDEFAULTINPUTMETHOD vIndirect $2078, $0114, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XGETDEFAULTINPUTMETHOD vIndirect $2078, $0118, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XSETTEXTSERVICELANGUAGE vIndirect $2078, $011c, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XGETTEXTSERVICELANGUAGE vIndirect $2078, $0120, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XUSEINPUTWINDOW vIndirect $2078, $0124, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XNEWSERVICEWINDOW vIndirect $2078, $0128, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XCLOSESERVICEWINDOW vIndirect $2078, $012c, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XGETFRONTSERVICEWINDOW vIndirect $2078, $0130, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -XFINDSERVICEWINDOW vIndirect $2078, $0134, A1 ; {sources}Toolbox:TextServicesMgr:TSMUtility.c -MISCMGR vNoVector ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -GETKEYS vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -BUTTON vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -TICKCOUNT vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -GETMOUSE vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -STILLDOWN vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -WAITMOUSEUP vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -EVENTAVAIL vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -GETNEXTEVENT vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -WAITNEXTEVENT vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgr.a -DOSYSERRORUPDATES vATrap A??? ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgrPatches.a -CLEARSYSERRORUPDATERECT vIndirect $2078, $0138, A7 ; {sources}Toolbox:ToolboxEventMgr:ToolboxEventMgrPatches.a - -;============================== End Text Services Manager Vectors - ;============================== TextEdit Vectors TEXTEDIT vNoVector ; {sources}Toolbox:TextEdit:TextEdit.a @@ -4082,17 +2889,17 @@ TEGETOFFSET vATrap A??? ; {sources}Toolbox:TextEdit:TextEdit.a ;============================== Time Manager Vectors -TIMEMGR vNoVector ; {sources}OS:TimeMgr:TimeMgr.a -__RMVTIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a -AFTERFREEZETIMEINRMVTIME vIndirect $2080, $0004, A7 ; {sources}OS:TimeMgr:TimeMgr.a -__INSTIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a -MULTANDMERGE vIndirect $2080, $0008, A7 ; {sources}OS:TimeMgr:TimeMgr.a -__PRIMETIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a -AFTERFREEZETIMEINPRIMETIME vIndirect $2080, $000c, A7 ; {sources}OS:TimeMgr:TimeMgr.a -AFTERFREEZETIMEINTIMER2INT vIndirect $2080, $0010, A7 ; {sources}OS:TimeMgr:TimeMgr.a -__MICROSECONDS vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a -FREEZETIME vIndirect $2080, $0014, A7 ; {sources}OS:TimeMgr:TimeMgr.a -INITTIMEMGR vNoVector ; {sources}OS:TimeMgr:TimeMgr.a +;TIMEMGR vNoVector ; {sources}OS:TimeMgr:TimeMgr.a +;__RMVTIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a +;AFTERFREEZETIMEINRMVTIME vIndirect $2080, $0004, A7 ; {sources}OS:TimeMgr:TimeMgr.a +;__INSTIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a +;MULTANDMERGE vIndirect $2080, $0008, A7 ; {sources}OS:TimeMgr:TimeMgr.a +;__PRIMETIME vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a +;AFTERFREEZETIMEINPRIMETIME vIndirect $2080, $000c, A7 ; {sources}OS:TimeMgr:TimeMgr.a +;AFTERFREEZETIMEINTIMER2INT vIndirect $2080, $0010, A7 ; {sources}OS:TimeMgr:TimeMgr.a +;__MICROSECONDS vATrap A??? ; {sources}OS:TimeMgr:TimeMgr.a +;FREEZETIME vIndirect $2080, $0014, A7 ; {sources}OS:TimeMgr:TimeMgr.a +;INITTIMEMGR vNoVector ; {sources}OS:TimeMgr:TimeMgr.a ;============================== End Time Manager Vectors @@ -4286,165 +3093,94 @@ FASTERINVALRECT vATrap A??? ; {sources}Toolbox:WindowMgr:WindowMgrExte ACTIVATEPALETTELAYERBRACKET vATrap A??? ; {sources}Toolbox:WindowMgr:WindowMgrExtensions.a GETREARWINDOW vIndirect $2084, $01d0, A7 ; {sources}Toolbox:WindowMgr:WindowMgrExtensions.a +WINDOWMGR_VEC01D4 vIndirect $2084, $01d4, A1 + ;============================== End Window Manager Vectors -;============================== Figment Memory Manager Vectors +;============================== Expansion Bus Manager Vectors +EXPANSIONBUSMGR_VEC0004 vIndirect $208c, $0004, A7 +EXPANSIONBUSMGR_VEC0008 vIndirect $208c, $0008, A7 +EXPANSIONBUSMGR_VEC000C vIndirect $208c, $000c, A7 +EXPANSIONBUSMGR_VEC0010 vIndirect $208c, $0010, A7 +EXPANSIONBUSMGR_VEC0014 vIndirect $208c, $0014, A7 +EXPANSIONBUSMGR_VEC0018 vIndirect $208c, $0018, A7 +EXPANSIONBUSMGR_VEC001C vIndirect $208c, $001c, A7 +EXPANSIONBUSMGR_VEC0020 vIndirect $208c, $0020, A7 +EXPANSIONBUSMGR_VEC0024 vIndirect $208c, $0024, A7 +EXPANSIONBUSMGR_VEC0028 vIndirect $208c, $0028, A7 +EXPANSIONBUSMGR_VEC002C vIndirect $208c, $002c, A7 +EXPANSIONBUSMGR_VEC0030 vIndirect $208c, $0030, A7 +EXPANSIONBUSMGR_VEC0034 vIndirect $208c, $0034, A7 +EXPANSIONBUSMGR_VEC0038 vIndirect $208c, $0038, A7 +EXPANSIONBUSMGR_VEC003C vIndirect $208c, $003c, A7 +EXPANSIONBUSMGR_VEC0040 vIndirect $208c, $0040, A7 +EXPANSIONBUSMGR_VEC0044 vIndirect $208c, $0044, A7 +EXPANSIONBUSMGR_VEC0048 vIndirect $208c, $0048, A7 +EXPANSIONBUSMGR_VEC004C vIndirect $208c, $004c, A7 +EXPANSIONBUSMGR_VEC0050 vIndirect $208c, $0050, A7 +EXPANSIONBUSMGR_VEC0054 vIndirect $208c, $0054, A7 +EXPANSIONBUSMGR_VEC0058 vIndirect $208c, $0058, A7 +EXPANSIONBUSMGR_VEC005C vIndirect $208c, $005c, A7 +EXPANSIONBUSMGR_VEC0060 vIndirect $208c, $0060, A7 +EXPANSIONBUSMGR_VEC0064 vIndirect $208c, $0064, A7 +EXPANSIONBUSMGR_VEC0068 vIndirect $208c, $0068, A7 +EXPANSIONBUSMGR_VEC006C vIndirect $208c, $006c, A7 +EXPANSIONBUSMGR_VEC0070 vIndirect $208c, $0070, A7 +EXPANSIONBUSMGR_VEC0074 vIndirect $208c, $0074, A7 +EXPANSIONBUSMGR_VEC0078 vIndirect $208c, $0078, A7 +EXPANSIONBUSMGR_VEC007C vIndirect $208c, $007c, A7 +EXPANSIONBUSMGR_VEC0080 vIndirect $208c, $0080, A7 +EXPANSIONBUSMGR_VEC0084 vIndirect $208c, $0084, A7 +EXPANSIONBUSMGR_VEC0088 vIndirect $208c, $0088, A7 +EXPANSIONBUSMGR_VEC008C vIndirect $208c, $008c, A7 +EXPANSIONBUSMGR_VEC0090 vIndirect $208c, $0090, A7 +EXPANSIONBUSMGR_VEC0094 vIndirect $208c, $0094, A7 +EXPANSIONBUSMGR_VEC0098 vIndirect $208c, $0098, A7 +EXPANSIONBUSMGR_VEC0100 vIndirect $208c, $0100, A7 +EXPANSIONBUSMGR_VEC0104 vIndirect $208c, $0104, A7 +EXPANSIONBUSMGR_VEC0108 vIndirect $208c, $0108, A7 +EXPANSIONBUSMGR_VEC010C vIndirect $208c, $010c, A7 +EXPANSIONBUSMGR_VEC0110 vIndirect $208c, $0110, A7 +EXPANSIONBUSMGR_VEC0114 vIndirect $208c, $0114, A7 +EXPANSIONBUSMGR_VEC0118 vIndirect $208c, $0118, A7 +EXPANSIONBUSMGR_VEC011C vIndirect $208c, $011c, A7 +EXPANSIONBUSMGR_VEC0120 vIndirect $208c, $0120, A7 +EXPANSIONBUSMGR_VEC0124 vIndirect $208c, $0124, A7 +EXPANSIONBUSMGR_VEC012C vIndirect $208c, $012c, A7 +EXPANSIONBUSMGR_VEC0130 vIndirect $208c, $0130, A7 +EXPANSIONBUSMGR_VEC0134 vIndirect $208c, $0134, A7 +EXPANSIONBUSMGR_VEC0138 vIndirect $208c, $0138, A7 +EXPANSIONBUSMGR_VEC014C vIndirect $208c, $014c, A7 +EXPANSIONBUSMGR_VEC0150 vIndirect $208c, $0150, A7 +EXPANSIONBUSMGR_VEC0154 vIndirect $208c, $0154, A7 +EXPANSIONBUSMGR_VEC0158 vIndirect $208c, $0158, A7 +EXPANSIONBUSMGR_VEC015C vIndirect $208c, $015c, A7 +EXPANSIONBUSMGR_VEC0160 vIndirect $208c, $0160, A7 +EXPANSIONBUSMGR_VEC0164 vIndirect $208c, $0164, A7 +EXPANSIONBUSMGR_VEC0168 vIndirect $208c, $0168, A7 +EXPANSIONBUSMGR_VEC016C vIndirect $208c, $016c, A7 +EXPANSIONBUSMGR_VEC0170 vIndirect $208c, $0170, A7 +EXPANSIONBUSMGR_VEC0174 vIndirect $208c, $0174, A7 +EXPANSIONBUSMGR_VEC0178 vIndirect $208c, $0178, A7 +EXPANSIONBUSMGR_VEC017C vIndirect $208c, $017c, A7 +EXPANSIONBUSMGR_VEC0180 vIndirect $208c, $0180, A7 +EXPANSIONBUSMGR_VEC0184 vIndirect $208c, $0184, A7 +EXPANSIONBUSMGR_VEC0188 vIndirect $208c, $0188, A7 +EXPANSIONBUSMGR_VEC018C vIndirect $208c, $018c, A7 +EXPANSIONBUSMGR_VEC0190 vIndirect $208c, $0190, A7 +EXPANSIONBUSMGR_VEC0194 vIndirect $208c, $0194, A7 +EXPANSIONBUSMGR_VEC0198 vIndirect $208c, $0198, A7 +EXPANSIONBUSMGR_VEC019C vIndirect $208c, $019c, A7 +EXPANSIONBUSMGR_VEC01A0 vIndirect $208c, $01a0, A7 +EXPANSIONBUSMGR_VEC01A4 vIndirect $208c, $01a4, A7 +EXPANSIONBUSMGR_VEC01A8 vIndirect $208c, $01a8, A7 +EXPANSIONBUSMGR_VEC01AC vIndirect $208c, $01ac, A7 +EXPANSIONBUSMGR_VEC01B0 vIndirect $208c, $01b0, A7 +EXPANSIONBUSMGR_VEC01B4 vIndirect $208c, $01b4, A7 -HEAPDISPATCH vIndirect $2088, $0004, A7 ; Figment -FIG_HSETFLAGS vIndirect $2088, $0008, A7 ; Figment -FIG_HGETFLAGS vIndirect $2088, $000c, A7 ; Figment -FIG_HNORSRC vIndirect $2088, $0010, A7 ; Figment -FIG_HRSRC vIndirect $2088, $0014, A7 ; Figment -FIG_STACKSPACETRAP vIndirect $2088, $0018, A7 ; Figment -FIG_PURGESPACETRAP vIndirect $2088, $001c, A7 ; Figment -FIG_MAXBLOCKTRAP vIndirect $2088, $0020, A7 ; Figment -FIG_MOVEHLOW vIndirect $2088, $0024, A7 ; Figment -FIG_MOVEHHI vIndirect $2088, $0028, A7 ; Figment -FIG_SETGROWZONE vIndirect $2088, $002c, A7 ; Figment -FIG_HNOPURGE vIndirect $2088, $0030, A7 ; Figment -FIG_HPURGE vIndirect $2088, $0034, A7 ; Figment -FIG_HUNLOCK vIndirect $2088, $0038, A7 ; Figment -FIG_HLOCK vIndirect $2088, $003c, A7 ; Figment -FIG_EMPTYHANDLE vIndirect $2088, $0040, A7 ; Figment -FIG_PURGEMEM vIndirect $2088, $0044, A7 ; Figment -FIG_RESRVMEM vIndirect $2088, $0048, A7 ; Figment -FIG_COMPACTMEMTRAP vIndirect $2088, $004c, A7 ; Figment -FIG_MAXMEMTRAP vIndirect $2088, $0050, A7 ; Figment -FIG_FREEMEM vIndirect $2088, $0054, A7 ; Figment -FIG_PTRZONETRAP vIndirect $2088, $0058, A7 ; Figment -FIG_SETPTRSIZETRAP vIndirect $2088, $005c, A7 ; Figment -FIG_GETPTRSIZETRAP vIndirect $2088, $0060, A7 ; Figment -FIG_DISPOSEPTR vIndirect $2088, $0064, A7 ; Figment -FIG_NEWPTRTRAP vIndirect $2088, $0068, A7 ; Figment -FIG_REALLOCHANDLETRAP vIndirect $2088, $006c, A7 ; Figment -FIG_RECOVERHANDLETRAP vIndirect $2088, $0070, A7 ; Figment -FIG_HANDLEZONETRAP vIndirect $2088, $0074, A7 ; Figment -FIG_SETHANDLESIZETRAP vIndirect $2088, $0078, A7 ; Figment -FIG___GETHANDLESIZE vIndirect $2088, $007c, A7 ; Figment -FIG_DSPOSEHANDLE vIndirect $2088, $0080, A7 ; Figment -FIG_NEWEMPTYHANDLETRAP vIndirect $2088, $0084, A7 ; Figment -FIG_NWHANDLE vIndirect $2088, $0088, A7 ; Figment -FIG_SETZONE vIndirect $2088, $008c, A7 ; Figment -FIG_GETZONE vIndirect $2088, $0090, A7 ; Figment -FIG_MOREMASTERS vIndirect $2088, $0094, A7 ; Figment -FIG_MAXAPPLZONE vIndirect $2088, $0098, A7 ; Figment -FIG_SETAPPLLIMIT vIndirect $2088, $009c, A7 ; Figment -FIG_INITZONETRAP vIndirect $2088, $00a0, A7 ; Figment -c_InitZone vIndirect $2088, $00a4, A7 ; Figment -c_SetApplLimit vIndirect $2088, $00a8, A7 ; Figment -c_MaxApplZone vIndirect $2088, $00ac, A7 ; Figment -c_MoreMasters vIndirect $2088, $00b0, A7 ; Figment -c_GetZone vIndirect $2088, $00b4, A7 ; Figment -c_SetZone vIndirect $2088, $00b8, A7 ; Figment -c_NewHandle vIndirect $2088, $00bc, A7 ; Figment -c_NewEmptyHandle vIndirect $2088, $00c0, A7 ; Figment -c_NewHandleHi vIndirect $2088, $00c4, A7 ; Figment -c_DisposeHandle vIndirect $2088, $00c8, A7 ; Figment -c_GetHandleSize vIndirect $2088, $00cc, A7 ; Figment -c_SetHandleSize vIndirect $2088, $00d0, A7 ; Figment -c_HandleZone vIndirect $2088, $00d4, A7 ; Figment -c_RecoverHandle vIndirect $2088, $00d8, A7 ; Figment -c_ReallocHandle vIndirect $2088, $00dc, A7 ; Figment -c_NewPtr vIndirect $2088, $00e0, A7 ; Figment -c_DisposePtr vIndirect $2088, $00e4, A7 ; Figment -c_GetPtrSize vIndirect $2088, $00e8, A7 ; Figment -c_SetPtrSize vIndirect $2088, $00ec, A7 ; Figment -c_PtrZone vIndirect $2088, $00f0, A7 ; Figment -c_FreeMem vIndirect $2088, $00f4, A7 ; Figment -c_MaxMem vIndirect $2088, $00f8, A7 ; Figment -c_CompactMem vIndirect $2088, $00fc, A7 ; Figment -c_ReserveMem vIndirect $2088, $0100, A7 ; Figment -c_PurgeMem vIndirect $2088, $0104, A7 ; Figment -c_EmptyHandle vIndirect $2088, $0108, A7 ; Figment -c_HLock vIndirect $2088, $010c, A7 ; Figment -c_HUnlock vIndirect $2088, $0110, A7 ; Figment -c_HPurge vIndirect $2088, $0114, A7 ; Figment -c_HNoPurge vIndirect $2088, $0118, A7 ; Figment -c_SetGrowZone vIndirect $2088, $011c, A7 ; Figment -c_MoveHHi vIndirect $2088, $0120, A7 ; Figment -c_MoveHLow vIndirect $2088, $0124, A7 ; Figment -c_MaxBlock vIndirect $2088, $0128, A7 ; Figment -c_PurgeSpace vIndirect $2088, $012c, A7 ; Figment -c_StackSpace vIndirect $2088, $00130, A7 ; Figment -c_HSetRBit vIndirect $2088, $0134, A7 ; Figment -c_HClrRBit vIndirect $2088, $0138, A7 ; Figment -c_HGetState vIndirect $2088, $013c, A7 ; Figment -c_HSetState vIndirect $2088, $0140, A7 ; Figment -c_GetNextBlockInHeap vIndirect $2088, $0144, A7 ; Figment -c_DisposeZone vIndirect $2088, $0148, A7 ; Figment -c_SetZoneCompatibilityFlags vIndirect $2088, $014c, A7 ; Figment -c_GetZoneCompatibilityFlags vIndirect $2088, $0150, A7 ; Figment -c_RegisterDisposeProc vIndirect $2088, $0154, A7 ; Figment -GetZoneFromNilMP vIndirect $2088, $0158, A7 ; Figment -WalkUpFindNewLowRemoveable vIndirect $2088, $015c, A7 ; Figment -FixedBlockInRange vIndirect $2088, $0160, A7 ; Figment -CompactHeap vIndirect $2088, $0164, A7 ; Figment -CalcMaxBlockSize vIndirect $2088, $0168, A7 ; Figment -ExtendHeapLimit vIndirect $2088, $016c, A7 ; Figment -ExtendApplLimit vIndirect $2088, $0170, A7 ; Figment -MakeSpaceLow vIndirect $2088, $0174, A7 ; Figment -MakeSpaceHigh vIndirect $2088, $0178, A7 ; Figment -ShrinkHeapLimit vIndirect $2088, $017c, A7 ; Figment -NewBlock vIndirect $2088, $0180, A7 ; Figment -NewBlockFast vIndirect $2088, $0184, A7 ; Figment -MarkBlockAsPrivate vIndirect $2088, $0188, A7 ; Figment -AllocateMoreMasters vIndirect $2088, $018c, A7 ; Figment -KillBlock vIndirect $2088, $0190, A7 ; Figment -SetBlockSize vIndirect $2088, $0194, A7 ; Figment -CalcFreeSpaceAndFindRegionTop vIndirect $2088, $0198, A7 ; Figment -MoveBlockHigh vIndirect $2088, $019c, A7 ; Figment -MoveBlockLow vIndirect $2088, $01a0, A7 ; Figment -CalcLargestPurgeRegion vIndirect $2088, $01a4, A7 ; Figment -PurgeBlock vIndirect $2088, $01a8, A7 ; Figment -DoEmpty vIndirect $2088, $01ac, A7 ; Figment -LocatePurgePtr vIndirect $2088, $01b0, A7 ; Figment -PurgeAndMakeSpace vIndirect $2088, $01b4, A7 ; Figment -PurgeAndCompactHeap vIndirect $2088, $01b8, A7 ; Figment -FindHeap vIndirect $2088, $01bc, A7 ; Figment -FindBlockInHeap vIndirect $2088, $01c0, A7 ; Figment -IsValidBlockInHeap vIndirect $2088, $01c4, A7 ; Figment -CreateNewHeap vIndirect $2088, $01c8, A7 ; Figment -MoveHeapHeaderHigh vIndirect $2088, $01cc, A7 ; Figment -RemoveHeap vIndirect $2088, $01d0, A7 ; Figment -GrowHeap vIndirect $2088, $01d4, A7 ; Figment -ShrinkHeap vIndirect $2088, $01d8, A7 ; Figment -CLEARBYTES vIndirect $2088, $01dc, A7 ; Figment -FillBytes vIndirect $2088, $01e0, A7 ; Figment -c_InitProcessMgrHeap vIndirect $2088, $01e4, A7 ; Figment -c_ShrinkSysHeap vIndirect $2088, $01e8, A7 ; Figment -c_LowerProcessMgrZoneBottom vIndirect $2088, $01ec, A7 ; Figment -c_ShrinkProcessMgrZone vIndirect $2088, $01f0, A7 ; Figment -c_ExtendSystemZone vIndirect $2088, $01f4, A7 ; Figment -c_ReclaimSpaceIfSysHeapLow vIndirect $2088, $01f8, A7 ; Figment -c_StraddleBlockSize vIndirect $2088, $01fc, A7 ; Figment -c_ProcessMgrMaxBlock vIndirect $2088, $0200, A7 ; Figment -c_GetProcessMgrLoFreeBytes vIndirect $2088, $0204, A7 ; Figment -c_GetSystemHiFreeBytes vIndirect $2088, $0208, A7 ; Figment -GetSystemHiPurgeBytes vIndirect $2088, $020c, A7 ; Figment -FIG_VIAZPOSTINIT vIndirect $2088, $0210, A7 ; Figment -FIG_VIAZINIT vIndirect $2088, $0214, A7 ; Figment -FIG_INITAPPLZONE vIndirect $2088, $0218, A7 ; Figment -FIG_SETAPPLBASE vIndirect $2088, $021c, A7 ; Figment -FIG___STRIPADDRESS vIndirect $2088, $0220, A7 ; Figment -MOVEBYTES020 vIndirect $2088, $0224, A7 ; Figment -MOVEBYTES040 vIndirect $2088, $0228, A7 ; Figment -INITQTMEMORY vIndirect $2088, $022c, A7 ; Figment -addTrashMemoryProc vIndirect $2088, $0230, A7 ; Figment -removeTrashMemoryProc vIndirect $2088, $0234, A7 ; Figment -c_RegisterHandleTrashNotification vIndirect $2088, $0238, A7 ; Figment -c_UnregisterHandleTrashNotification vIndirect $2088, $023c, A7 ; Figment -c_TrashZone vIndirect $2088, $0240, A7 ; Figment -c_TrashProcess vIndirect $2088, $0244, A7 ; Figment -c_TrashMemoryArea vIndirect $2088, $0248, A7 ; Figment -c_NewHandleSystemSafe vIndirect $2088, $024c, A7 ; Figment -c_NewPtrSystemSafe vIndirect $2088, $0250, A7 ; Figment -c_EnoughSystemHeapSlop vIndirect $2088, $0254, A7 ; Figment -OLD_INITMEMMGR vIndirect $2088, $0258, A7 ; Figment -OLD_INITMEMVECT vIndirect $2088, $025c, A7 ; Figment -OLD_AFTERBOOTSETAPPLBASE vIndirect $2088, $0260, A7 ; Figment +;============================== End Expansion Bus Manager Vectors -;============================== End Figment Memory Manager Vectors ; ; The following list of entrypoints are not currently vectorized. @@ -6092,8 +4828,8 @@ PC1TBL vNoVector ADBPROC vNoVector INITADB vNoVector GETRIDOFPOWERMGRINFREEZETIME vNoVector -INSTALLTIMEMGRPLUSSEII vNoVector -INSTALLTIMEMGRPORTABLEIICI vNoVector +;INSTALLTIMEMGRPLUSSEII vNoVector +;INSTALLTIMEMGRPORTABLEIICI vNoVector RMVTIMENEWFREEZETIME vNoVector PRIMETIMENEWFREEZETIME vNoVector TIMER2INTNEWFREEZETIME vNoVector @@ -6179,75 +4915,3 @@ PARTIALFONTZONEGROWZONEPROCEDURE vNoVector INITIALIZEPARTIALFONTS vNoVector SetCurrentFragment vNoVector Assert vNoVector -AssertCharacter vNoVector -AssertInteger vNoVector -AssertUnsignedInteger vNoVector -AssertPointer vNoVector -NewZonePtr vNoVector -GetZoneHandleSize vNoVector -ResizeZoneHandle vNoVector -MoveZoneHandleHigh vNoVector -INITIALIZEDISKCACHE vNoVector -DISKCACHERESOURCEMANAGERPURGEPROCEDURE vNoVector -DISKCACHESHUTDOWNPROCEDURE vNoVector -GetFontCacheFileSize vNoVector -SetFontCacheFileSize vNoVector -GetFontCacheFileStatus vNoVector -SetFontCacheFileStatus vNoVector -FontCacheFileExists vNoVector -LoadDiskCacheMap vNoVector -NEWGESTALT vNoVector -PPCOPEN vNoVector -PPCINFORM vNoVector -PPCACCEPT vNoVector -PPCREJECT vNoVector -PPCWRITE vNoVector -PPCREAD vNoVector -PPCEND vNoVector -PPCCLOSE vNoVector -IPCLISTPORTS vNoVector -NAN vNoVector -TESTHALT vNoVector -GETPRECISION vNoVector -SETPRECISION vNoVector -GETROUND vNoVector -SETROUND vNoVector -SETHALT vNoVector -SETEXCEPTION vNoVector -TESTEXCEPTION vNoVector -COMPOUND vNoVector -ANNUITY vNoVector -REMAINDER vNoVector -COPYSIGN vNoVector -LOGB vNoVector -RINT vNoVector -NEXTEXTENDED vNoVector -SCALB vNoVector -SETENVIRONMENT vNoVector -GETENVIRONMENT vNoVector -PROCEXIT vNoVector -PROCENTRY vNoVector -NUM2DEC vNoVector -DEC2NUM vNoVector -RELATION vNoVector -RANDOMX vNoVector -NEXTDOUBLE vNoVector -CLASSEXTENDED vNoVector -CLASSCOMP vNoVector -CLASSDOUBLE vNoVector -LOG2 vNoVector -TAN vNoVector -EXP1 vNoVector -EXP2 vNoVector -LN1 vNoVector -SIGNNUM vNoVector -GETHALTVECTOR vNoVector -SETHALTVECTOR vNoVector -X96TOX80 vNoVector -X80TOX96 vNoVector -TJUMP vNoVector -GetCTEGlobals vNoVector -SIZESOUNDBUFFER vNoVector -HMCMERGE vNoVector -HHEADMERGE vNoVector -DICTIONARYDISPATCH vNoVector diff --git a/Misc/GoNativeROMLib.o b/Misc/GoNativeROMLib.o index a32c1b6927fbc2eefd9f413402bd73a9b3d293c0..47d96f4af8d86f4dcdb5b493c3ca677693afb516 100644 GIT binary patch literal 35526 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 pz#Tlpe3R5~JpLh4H6gSZ>XNI>0&b=1F` ag - move.l #((UsrActivity<<16)|\ ; set for user activity - (IdleUpdateDisp<<0)),d0 ; idle update selector - _PowerDispatch ; call power manager - move.l (sp)+,d0 ; restore d0 ag -@continue move.l a1,d1 ; test to see if handler address is valid beq.s @noHandler ; if not, don't call it BTST #fDBInit,FDBFlag(A3) ; is ADB initialization in progress? BNE.S @JustDoIt ; -> yes, calling the handler now is allowed + MOVE.L D0,D2 + AND #$F,D2 + CMP.B #$C,D2 + BNE @justDoIt + ; jump thru the ProductInfo table to check if a keyswitch is in the secure position

MOVEA.L UnivInfoPtr,A1 ; point to the ProductInfo table

ADDA.L ProductInfo.ADBDebugUtilPtr(A1),A1 ; and get the address of its ADB table

MOVE.L 4*adbKeySwSecure(A1),D2 ; get the offset to the keyswitch code

- BEQ.S @JustDoIt ; -> no keyswitch check, so just call the handler

+ BEQ.S @MaybeDoIt ; -> no keyswitch check, so just call the handler

MOVEM.L D0/D1/A0/A2,-(SP) ;

ADDA.L D2,A1 ; calculate the routine's address

JSR (A1) ; and call it

MOVEM.L (SP)+,D0/D1/A0/A2 ;

BEQ.S @noHandler ; -> the keyswitch is secure, so don't call the handler +@MaybeDoIt BTST.B #3,$240A + BEQ.S @JustDoIt + + MOVE.L PmgrBase,A1 + CMP.L #sleepConst,PmgrRec.SleepSaveFlag(A1) + BEQ.S @noHandler + + BTST.B #2,PmgrRec.PmgrFlags2(A1) + BNE.B @noHandler + @JustDoIt MOVEA.L D1,A1 ; get the handler's address

jsr (a1) ; call the handler @@ -602,7 +639,7 @@ RequestDone move.l a0,-(sp) ; copy buffer address to A0 save area on stack Title 'KbdADB - ADB Manager - Initialization' ;______________________________________________________________________ ; -; ADBReInit - ReInitialize the Front Desk Bus +; ADBReInit 2b5aa - ReInitialize the Front Desk Bus ; ;______________________________________________________________________ @@ -638,7 +675,7 @@ iLocalData EQU iDeviceTy ;______________________________________________________________________ ; -; ADBProc - this routine lives in the JADBProc vector and is called +; ADBProc 2b5d0 - this routine lives in the JADBProc vector and is called ; by ADBReInit before and after initialization ; ;______________________________________________________________________ @@ -695,6 +732,7 @@ ADBProc ;______________________________________________________________________ PostInit ; rb +; 2b610 WITH ExpandMemRec,KybdDriverData ; rb _CountADBs ; Get the number of ADB devices @@ -728,14 +766,14 @@ PostInit ; rb ENDWITH ; rb ;______________________________________________________________________ ; -; InitADBDrvr - this routine bring in all appropriate 'ADBS' resources and +; InitADBDrvr 2b64c - this routine bring in all appropriate 'ADBS' resources and ; execute the initialization routines. ; ;______________________________________________________________________ InitADBDrvr _CountADBs ; get the number of valid ADB entries Move D0,D3 ; save it in D3 - BEQ.S DoneSrv ; If none, nothing to do + BEQ DoneSrv ; If none, nothing to do MoveQ #1,D4 ; start at first entry Link A6,#iLocalData ; reserve stack frame FSrvLoop @@ -759,9 +797,7 @@ FSrvLoop _DetachResource ; detach it Move.L D1,A0 ; put handle in A0 - Move.L (A0),D0 ; dereference handle - _StripAddress ; make it a 24-bit address - Move.L D0,A0 ; put it in A0 + Move.L (A0),A0 ; dereference handle Move.B iADBAddr(A6),D0 ; put ADB Address in D0 Move.B iDeviceTy(A6),D1 ; put device type in D1 JSR (A0) ; execute the service routine @@ -777,7 +813,7 @@ DoneSrv ;_______________________________________________________________________ ; -; InitADB - Initialize state variables +; InitADB 2b69c - Initialize state variables ; ;_______________________________________________________________________ @@ -796,6 +832,50 @@ InitADB MOVE.L #FDBDSize,D0 ; get local data area length LEA FDBTask,A0 ; setup the FDB VBL task MOVE.L A0,JKybdTask ; lomem vector + BTst.B #$2, ($2408) + BEQ.B @dontHitExpandMem + import IOPR_ADB + Lea.L IOPR_ADB, A0 + Move.L A0, ([ExpandMem],$294) +@dontHitExpandMem + + Move.L UnivROMFlags, D0 + + AndI.L #$E, D0 + BEQ.B @escape + + CmpI.L #$A, D0 + BEQ.B @escape + + CmpI.L #$C, D0 + BEQ.B @second + + CmpI.L #$8, D0 + BEQ.B @fourth + + CmpI.L #$2, D0 + BNE.B @third + +@first Lea.L ($FFFDB592).L, A0 + Lea.L @first(A0.L), A0 + Bra.B @done + +@second Lea.L ($FFFDB5A2).L, A0 + Lea.L @second(A0.L), A0 + Bra.B @done + +@third Lea.L ($FFFDB5CE).L, A0 + Lea.L @third(A0.L), A0 + Bra.B @done + +@fourth Lea.L ($FFFDB5DE).L, A0 + Lea.L @fourth(A0.L), A0 + +@done MoveA.L (UnivInfoPtr), A1 + SubA.L A1, A0 + Move.L A0, $48(A1) +@escape + ; jump thru the ProductInfo table to call the hardware-dependent initialization code MOVEA.L UnivInfoPtr,A0 ; point to the ProductInfo table

@@ -838,7 +918,7 @@ ReInit ori.w #HiIntMask,sr ; mask out interrupts ;_______________________________________________________________________ ; -; InitDevT - Initialize the Device Table +; InitDevT 2b7a0 - Initialize the Device Table ; ; NOTE: everything after BusReset below is part of an ADB completion ; routine, and thus is run at interrupt level 1. No calls @@ -853,17 +933,19 @@ InitDevT bsr BusReset ; reset all devices on the bus @PollNext move.b d0,InitAddr(a3) ; save device address bsr TalkR3 ; issue a Talk R3 command (asynchronously) move.b InitAddr(a3),d0 ; restore poll address - tst.b (a0)+ ; test reply length, see if device returned data + tst.b (a0) ; test reply length, see if device returned data beq.s @NoDevice ; no, nothing to install ; there is a response from the device in the address, so update the ; device table according to the device +@whoaGoBack moveq.l #0,d1 ; zero extend for indexing move.b DevTOffset(a3),d1 ; get offset to devicetable - move.b 1(a0),FDBDevTy(a3,d1.w) ; copy device handler ID into table + move.b 2(a0),FDBDevTy(a3,d1.w) ; copy device handler ID into table move.b d0,FDBOAddr(a3,d1.w); save device address move.b d0,FDBAddr(a3,d1.w) ; save device address + move.b d0,FDBOAddr(a3,d1.w); save device address cmpi.b #KbdAddr,d0 ; is it a keyboard type device? bne.s @notKbd ; no, branch @@ -878,10 +960,29 @@ InitDevT bsr BusReset ; reset all devices on the bus move.w HasDev(a3),d2 ; get value in HasDev bset.l d0,d2 ; remember which address has device move.w d2,HasDev(A3) ; save it + Bra @skipNewNoDeviceCode @NoDevice + + BTst.B #$2, ($2408) + BEQ.B @skipNewNoDeviceCode + + Tst.L ([$2B6],$29C) + BEQ.B @skipNewNoDeviceCode + + MoveM.L D0/A0-A3, -(A7) + MoveA.L ([$2B6],$29C), A1 + MoveA.L A0, A2 + AndI #$FF, D0 + OrI #$200, D0 + Jsr (A1) + MoveM.L (A7)+, D0/A0-A3 + Tst.B (A0) + BNE.B @whoaGoBack +@skipNewNoDeviceCode + addq.b #1,d0 ; advance device address cmpi.b #NumFDBAdr,d0 ; has it polled all addresses yet? - bne.s @PollNext ; no, go to poll next device + bne @PollNext ; no, go to poll next device ; ChgAddr - check the device address to identify multiple devices on ; the same address @@ -922,7 +1023,7 @@ ChgNext ; to the old address by issuing a Listen R3. Move.B InitAddr(A3),D0 ; get address - BSR.s TalkR3 ; issue a Talk R3 command <1.6> + BSR TalkR3 ; issue a Talk R3 command <1.6> ; MovBack - A Talk R3 has just been issued, a timeout in S1 indicates no ; more device in original address, we want to move the device back to @@ -931,21 +1032,40 @@ ChgNext tst.b (a0) ; did the device return data beq.S @1 ; no, branch ; no timeout indication, - BSR.S CopyEntry ; copy entry into device table +@whoaGoBack + BSR CopyEntry ; copy entry into device table Move.B FDBByte1(A3),FDBDevTy(A3,D1.W) ; get new handle ID into table BRA.S ChgNext ; go to change next device ; there is timeout indication @1 + BTst.B #$2, ($2408) + BEQ.B @skipNewTimeoutCode + + Move.B $16F(A3), D0 + Tst.L ([$2B6],$29C) + BEQ.B @skipNewTimeoutCode + + MoveM.L D0/A1-A2, -(A7) + MoveA.L ([$2B6],$29C), A1 + MoveA.L A0, A2 + AndI #$FF, D0 + OrI #$300, D0 + Jsr (A1) + MoveM.L (A7)+, D0/A1-A2 + Tst.B (A0) + BNE.B @whoaGoBack +@skipNewTimeoutCode + Move.B InitAddr(A3),D1 ; get address to change back to Move.B NewAddr(A3),D0 ; get address to talk to - bsr.s ListenR3 ; send a listen R3 command <1.6> + bsr ListenR3 ; send a listen R3 command <1.6> ; CKNewAdr - check the new address by issuing a Talk R3, to see if ; there is still any device left. If yes, add entry into device ; table, but if not, just go to change next device address Move.B NewAddr(A3),D0 ; get address - BSR.S TalkR3 ; issue a talk R3 <1.6> + BSR TalkR3 ; issue a talk R3 <1.6> ; AddEntry - a Talk R3 command has just been issed to the new address, ; if there is no timeout in S1, one or more device is still in that @@ -964,7 +1084,7 @@ ExitEntry ;_______________________________________________________________________ ; -; CopyEntry - copy the device entry from the original address to the +; CopyEntry 2b8ea - copy the device entry from the original address to the ; new address, a Talk R3 had just been issued ; ; Called by: MoveBack and AddEntry @@ -1003,7 +1123,7 @@ CopyEntry ;_______________________________________________________________________ ; -; BusReset - issue a Reset command +; BusReset 2b930 - issue a Reset command ; ; On entry, (SP) has completion routine address <1.6> ; @@ -1017,7 +1137,7 @@ BusReset moveq.l #0,d0 ; address zero ;_______________________________________________________________________ ; -; Talk R3 - issue a Talk R3 command +; Talk R3 2b938 - issue a Talk R3 command ; ; On entry, D0 has device address ; (SP) has completion routine address <1.6> @@ -1031,7 +1151,7 @@ TalkR3 moveq.l #talkCmd+3,d1 ; talk command, register 3 ;_______________________________________________________________________ ; -; ListenR3 - issue a listen R3 command +; ListenR3 2b93e - issue a listen R3 command ; ; On entry, D0 has device address to send the command ; D1 has new device address to change to @@ -1058,7 +1178,7 @@ MakeAsyncRequest ;_______________________________________________________________________ ; -; GNextAddr - get next address to change +; GNextAddr 2b964 - get next address to change ; ;_______________________________________________________________________ @@ -1081,7 +1201,7 @@ GNextAddr MoveQ #0,D0 ;_______________________________________________________________________ ; -; GEmptyAddr - get empty address space +; GEmptyAddr 2b986 - get empty address space ; ; on return: ; D0 = empty address or @@ -1100,7 +1220,7 @@ GEmptyAddr MoveQ #0,D1 ;_______________________________________________________________________ ; -; FDBTask - FDB VBL Task +; FDBTask 2b998 - FDB VBL Task ; ;_______________________________________________________________________ @@ -1119,7 +1239,7 @@ KbdDRTS RTS ;______________________________________________________________________ ; -; DefaultDev - check mouse and keyboard in the device table, if they +; DefaultDev 2b9ac - check mouse and keyboard in the device table, if they ; are not there, set them up as default device anyway. ; ;______________________________________________________________________ @@ -1143,7 +1263,7 @@ ChkMouse moveq #1,d0 ; post processing

;______________________________________________________________________ ; -; Routine: flushkbds +; Routine: flushkbds 2b9de ; Arguments: none ; Output: none ; Function: this routine finds all kbd devices, and sends a flush command to them @@ -1167,6 +1287,7 @@ waitForKeys equ (4+4) ; add 100% margin @type cmp.b #kbdAddr,origADBAddr(a0); is this a keyboard bne.s @next ; not a keyboard, next device bsr.s sendFlush ; send a flush command to kbd + bsr.s newAdbFunc bra.s @next ; next device @done movea.l #waitForKeys,a0 ; wait for keys @@ -1176,9 +1297,34 @@ waitForKeys equ (4+4) ; add 100% margin movem.l (sp)+,@saved ; restore registers rts + ;______________________________________________________________________ ; -; Routine: sendFlush +; Routine: newAdbFunc 2ba12 +; Arguments: a0 +; Output: none +; Function: +; Note: +;______________________________________________________________________ + +newAdbFunc +@saved reg d0/d1/a0 + + movem.l @saved,-(sp) + + move.l 6(a0),a0 + addq.l #4,a0 + clr.l (a0)+ + clr.l (a0) + bsr RSetKmap + + movem.l (sp)+,@saved ; restore registers + rts + + +;______________________________________________________________________ +; +; Routine: sendFlush 2ba2a ; Arguments: d0.b adb id ; Output: none ; Function: this routine sends a "flush" command to the adb device at d0.b @@ -1225,7 +1371,7 @@ CompleteFlush Title 'KbdADB - ADB KeyBoard Driver' ;______________________________________________________________________ ; -; Routine: KbdDrvr +; Routine: KbdDrvr 2ba72 ; Arguments: D0.B ADB Command ; A0 ADB Buffer address ; A1 ADB Completion Routine Address (= KbdServ) @@ -1288,7 +1434,7 @@ KbdDrvr ;______________________________________________________________________ ; -; Routine: KeyIn +; Routine: KeyIn 2ba9e ; Arguments: D0.B Raw Keycode ; D3.L Device Type, Orig Addr, ADB Addr, Unused ; A2 Private data area @@ -1373,7 +1519,7 @@ NextWord ;______________________________________________________________________ ; -; Routine: PostIt +; Routine: PostIt 2bb2c ; Arguments: D0.W ASCII Code ; D3.W ADB Address in high byte and raw keycode in low byte ; Output: None @@ -1415,7 +1561,7 @@ PostKeyUp ;______________________________________________________________________ ; -; FoundEx +; FoundEx 2bb64 ; An exception exists for this particular keystroke. Process it appropriately. ;______________________________________________________________________ FoundEx @@ -1491,7 +1637,7 @@ FoundEx ;______________________________________________________________________ ; -; Routine: KbdListen +; Routine: KbdListen 2bbee ; Arguments: D0.B ADB Command ; D1.L DeviceType, OrigAddr, ADBAddr, Unused (byte order) ; A0 ADB Buffer Address @@ -1553,7 +1699,7 @@ KbdListen ;______________________________________________________________________ ; -; Routine: KbdBufFree +; Routine: KbdBufFree 2bc36 ; Arguments: D0.B ADB Command ; D1.L DeviceType, OrigAddr, ADBAddr, Unused (byte order) ; A0 ADB Buffer Address @@ -1573,7 +1719,7 @@ KbdBufFree ;______________________________________________________________________ ; -; KbdInstall - allocate memory for keyboard information and put in ADB record, +; KbdInstall 2bc3c - allocate memory for keyboard information and put in ADB record, ; loading resources as necessary. ; ;______________________________________________________________________ @@ -1606,6 +1752,13 @@ FirstInstall MOVE.L D0, A0 MOVE.L (A0), KCHRPtr(A2) ; Dereference and put away + MOVE.L A1, -(SP) + MOVE.L ExpandMem, A1 + TST.L ExpandMemRec.emKeyCache(A1) + BNE.S @no + MOVE.L (A0), ExpandMemRec.emKeyCache(A1) +@no MOVE.L (SP)+, A1 + SUBQ.L #4, SP ; Make room for result MOVE.L #'KMAP', -(SP) ; ResType = KCHR CLR.W -(SP) ; theID = 0 @@ -1718,6 +1871,7 @@ kchrTableNoLink equ kchrTable-return ; kchrTable offset before link r endr KeyTrans +; 2bcb8 ;------------------------------------------------------------------------------ with ktFrame,SMgrRecord ; if SMgr not initialized or no itlk, skip @@ -1909,7 +2063,7 @@ KeyTrans ; Macintosh keyboard mapping hook, which relies on the new KeyTrans trap. ; ----------------------------------------------------------------------------- -KeyHook PROC +KeyHook PROC EXPORT with ExpandMemRec bra.s SkipHeader ; skip the header. diff --git a/OS/Beep/Beep.make b/OS/Beep/Beep.make new file mode 100644 index 0000000..e69de29 diff --git a/OS/Clock.a b/OS/Clock.a index 17b208f..0f5d2ba 100644 --- a/OS/Clock.a +++ b/OS/Clock.a @@ -129,7 +129,7 @@ Clock PROC EXPORT IF NOT BlackBirdDebug THEN ;_______________________________________________________________________ <1.3> ; -; Routine: OneSecInt +; Routine: OneSecInt 8180 ; ; Arguments: A1 (input) -- Address of VIA1 ; @@ -151,7 +151,7 @@ Clock PROC EXPORT ;_______________________________________________________________________ OneSecInt MOVE.B #1< - ADDQ.L #1,Time ; count the second + NOP BCLR #5,AlarmState ; flag GNEFilter to flash if enabled TST.B SPVolCtl ; bit 7 is alarm enable @@ -210,7 +210,7 @@ OneSecInt MOVEA.l A1, A0 ; ;________________________________________________________________________________________ ; -; Routine: PramIO +; Routine: PramIO 81a8 ; ; Inputs: A0 - pointer to table of base addresses ; A1 - pointer to ProductInfo record for this machine @@ -239,7 +239,7 @@ PramIO MOVEM.L D0-D2/A0-A2,-(SP) ;

;________________________________________________________________________________________ ; -; Routine: ReadXPRAM, WriteXPRAM +; Routine: ReadXPRAM 81c2, WriteXPRAM 81cc ; ; Inputs: A0 - pointer to caller's buffer ; D0 - [number of bytes to transfer][starting PRAM address] @@ -277,7 +277,7 @@ rwXCommon BTST.B #hwCbClock-8,HWCfgFlags ; do we have a new clock chip (256 PRAM ;________________________________________________________________________________________

; -; Routine: ValidatePRAM +; Routine: ValidatePRAM 81f8 ; ; Inputs: A6 - return address ; A0 - pointer to table of base addresses @@ -322,14 +322,16 @@ ValidatePRAM (8<<0),D3 ; starting at PRAM address 8

BSR PramIO ; write out the last 4 bytes of original PRAM

+ LEA @other,A3 + MOVE.L #(1<<31)|\ ; write + (1<<16)|\ ; 1 byte + (16<<0),D3 ; starting at PRAM address 16 + BSR PramIO + @CheckXPRAM LEA @XPRAMSig,A3 ;

MOVE.L 12(SP),D3 ; are the extended PRAM signature bytes valid?

CMP.L (A3),D3 ;

BEQ.S @Done ; -> yes, we're done

- MOVE.L #(1<<31)|\ ; write

- (4<<16)|\ ; 4 bytes

- (12<<0),D3 ; starting at PRAM address 12

- BSR PramIO ; write out the correct extended PRAM signature bytes

MOVEA.L SP,A3 ; point to our stack buffer

MOVEQ #(256-32)/4-1,D3 ; and zero each byte

@@ -337,8 +339,11 @@ ValidatePRAM DBRA D3,@ClearBuf ;

BIGLEA PRAMInitTbl,A2 ; point to the table of default extended PRAM values

+ BIGLEA *+$373c,A3 + SUB.L A2,A3 + MOVE.L A3,D3 + SUB.L #1,D3 LEA $76-32(SP),A3 ; and where they'll go in the buffer

- MOVEQ #$89-$76,D3 ; copy them into the buffer

@CopyXDefs MOVE.B (A2)+,(A3)+ ;

DBRA D3,@CopyXDefs ;

@@ -348,11 +353,19 @@ ValidatePRAM (32<<0),D3 ; starting at PRAM address 32

BSR PramIO ;

+ LEA @XPRAMSig,A3 + MOVE.L #(1<<31)|\ ; write + (4<<16)|\ ; 4 bytes + (12<<0),D3 ; starting at PRAM address 12 + BSR PramIO + @Done LEA 256(SP),SP ; clean up the stack

MOVEM.L (SP)+,D0-D3/A0-A3 ; restore regs from StartINIT <8.6> RTS ;

+@other DC.W $A800 + @XPRAMSig DC.L 'NuMc' ; extended PRAM validity bytes (slot-based machines)

diff --git a/OS/CrsrDev.a b/OS/CrsrDev.a index db769c9..e390b54 100644 --- a/OS/CrsrDev.a +++ b/OS/CrsrDev.a @@ -100,7 +100,7 @@ _FixDiv OPWORD $A84D CrsrDev PROC EXPORT InitCrsrDev,CrsrDevDispatch - IMPORT CrsrVBLTask + IMPORT CrsrVBLTask,vDrawCursor,vEraseCursor WITH CrsrDevGlobals, CrsrDevRec, CrsrDevSegment, CrsrDataRec WITH ADBDeviceEntry, ADBVars, ExpandMemRec @@ -108,7 +108,7 @@ CrsrDev PROC _______________________________________________________________________ ; -; Routine: CrsrDevDispatch (trap # $AADB) +; Routine: CrsrDevDispatch 82b0 (trap # $AADB) ; ; Inputs: d0.w - selector ; 4(sp) - last parameter @@ -177,7 +177,7 @@ paramBase equ * ; ptr to base of parameters ;==================================================================== ; -; Routine: CrsrDevMoveTrap +; Routine: CrsrDevMoveTrap 82ec ; ; Inputs: 8(a6).l - delta Y ; 12(a6).l - delta X @@ -207,7 +207,7 @@ CrsrDevMoveTrap ;==================================================================== ; -; Routine: CrsrDevMoveToTrap +; Routine: CrsrDevMoveToTrap 8306 ; ; Inputs: 8(a6).l - V ; 12(a6).l - H @@ -248,7 +248,7 @@ CrsrDevMoveToTrap ;==================================================================== ; -; Routine: CrsrDevFlushTrap +; Routine: CrsrDevFlushTrap 8334 ; ; Inputs: 8(a6).l - pointer to CrsrDevRec for this device ; @@ -282,7 +282,7 @@ CrsrDevFlushTrap ;==================================================================== ; -; Routine: CrsrDevButtonsTrap +; Routine: CrsrDevButtonsTrap 8360 ; ; Inputs: 8(a6).w - new button states (1 = down, 0 = up) ; 10(a6).l - pointer to CrsrDevRec for this device @@ -312,7 +312,7 @@ CrsrDevButtonsTrap ;==================================================================== ; -; Routine: CrsrDevButtonDownTrap +; Routine: CrsrDevButtonDownTrap 8376 ; ; Inputs: 8(a6).l - pointer to CrsrDevRec for this device ; @@ -335,7 +335,7 @@ CrsrDevButtonDownTrap ;==================================================================== ; -; Routine: CrsrDevButtonUpTrap +; Routine: CrsrDevButtonUpTrap 8388 ; ; Inputs: 8(a6).l - pointer to CrsrDevRec for this device ; @@ -358,7 +358,7 @@ CrsrDevButtonUpTrap ;==================================================================== ; -; Routine: CrsrDevButtonOpTrap +; Routine: CrsrDevButtonOpTrap 839a ; ; Inputs: 8(a6).l - Operation specific data ; 12(a6).w - Operation code @@ -388,7 +388,7 @@ CrsrDevButtonOpTrap ;==================================================================== ; -; Routine: CrsrDevSetButtonsTrap +; Routine: CrsrDevSetButtonsTrap 83ba ; ; Inputs: 8(a6).w - # buttons for this device ; 10(a6).l - pointer to CrsrDevRec for this device @@ -413,7 +413,7 @@ CrsrDevSetButtonsTrap ;==================================================================== ; -; Routine: CrsrDevSetAccelTrap +; Routine: CrsrDevSetAccelTrap 83ce ; ; Inputs: 8(a6).l - acceleration (Fixed) ; 12(a6).l - pointer to CrsrDevRec for this device @@ -440,7 +440,7 @@ CrsrDevSetAccelTrap ;==================================================================== ; -; Routine: CrsrDevDoubleTimeTrap +; Routine: CrsrDevDoubleTimeTrap 83e4 ; ; Inputs: 8(a6).l - duration (ticks) ; 12(a6).l - pointer to CrsrDevRec for this device @@ -468,7 +468,7 @@ CrsrDevDoubleTimeTrap ;==================================================================== ; -; Routine: CrsrDevSetUnitsPerInchTrap +; Routine: CrsrDevSetUnitsPerInchTrap 83f8 ; ; Inputs: 8(a6).l - resolution (fixed) ; 12(a6).l - pointer to CrsrDevRec for this device @@ -500,7 +500,7 @@ CrsrDevSetUnitsPerInchTrap ;==================================================================== ; -; Routine: CrsrDevNextDeviceTrap +; Routine: CrsrDevNextDeviceTrap 8414 ; ; Inputs: 8(a6).l - VAR ptr to CrsrDevRec ; @@ -539,7 +539,7 @@ CrsrDevNextDeviceTrap ;==================================================================== ; -; Routine: CrsrDevNewDeviceTrap +; Routine: CrsrDevNewDeviceTrap 843c ; ; Inputs: 8(a6).l - VAR pointer to CrsrDevRec ; @@ -566,7 +566,7 @@ CrsrDevNewDeviceTrap ;==================================================================== ; -; Routine: CrsrDevDisposeDevTrap +; Routine: CrsrDevDisposeDevTrap 8450 ; ; Inputs: 8(a6).l - pointer to CrsrDevRec for this device ; @@ -594,7 +594,7 @@ CrsrDevDisposeDevTrap ;_______________________________________________________________________ ; -; Routine: CrsrDevHandleADB +; Routine: CrsrDevHandleADB 8462 ; ; Inputs: a0 - pointer to mouse data ; a2 - pointer to CrsrDevRec for this device @@ -741,7 +741,7 @@ CrsrDevHandleADB ;_______________________________________________________________________ ; -; Routine: CrsrDevMove +; Routine: CrsrDevMove 854e ; ; Inputs: d0.l - delta X ; d1.l - delta Y @@ -843,7 +843,7 @@ CrsrDevMove ;_______________________________________________________________________ ; -; Routine: CrsrDevButtons +; Routine: CrsrDevButtons 85ee ; ; Inputs: d0.b - new button states (1 = down, 0 = up) ; a2 - pointer to CrsrDevRec for this device @@ -934,20 +934,20 @@ doDouble ;--------------------------------------------------------- doClickLock - tst.b buttonData(a2,d3.w) ; is this the 1st time? + tst.b buttonData(a2,d2.w) ; is this the 1st time? bne.s @secondHit ; no, skip btst.b d3,buttons(a2) ; are we down? beq.s @firstUp ; no, skip bsr.s CrsrDevButtonDown ; yes, generate button down event bra.s @done -@firstUp st.b buttonData(a2,d3.w) ; first up, mark it +@firstUp st.b buttonData(a2,d2.w) ; first up, mark it bra.s @done @secondHit btst.b d3,buttons(a2) ; are we up (2nd time)? bne.s @done ; no, do nothing... bsr.s CrsrDevButtonUp ; yes, post up event - clr.b buttonData(a2,d3.w) ; mark that we're really up + clr.b buttonData(a2,d2.w) ; mark that we're really up @done rts @@ -963,13 +963,13 @@ doAppleScript ;--------------------------------------------------------- doCustom - pea buttonData(a2) ; push our custom routine address + move.l buttonData(a2,d2.w),-(sp) ; push our custom routine address rts ; and call it. ;_______________________________________________________________________ ; -; Routine: CrsrDevButtonDown +; Routine: CrsrDevButtonDown 86a4 ; ; Inputs: a2 - pointer to CrsrDevRec for this device ; @@ -1009,7 +1009,7 @@ CrsrDevButtonDown ;_______________________________________________________________________ ; -; Routine: CrsrDevButtonUp +; Routine: CrsrDevButtonUp 86e4 ; ; Inputs: a2 - pointer to CrsrDevRec for this device ; @@ -1051,7 +1051,7 @@ CrsrDevButtonUp ;_______________________________________________________________________ ; -; Routine: CrsrDevSetAccel +; Routine: CrsrDevSetAccel 8720 ; ; Inputs: a2 - pointer to CrsrDevRec for device we want to set ; d0 - acceleration to set (0-1, fixed point) @@ -1102,7 +1102,21 @@ CrsrDevSetAccel ; first find the two tables which enclose the desired acceleration ;---------------------------------------------- -@foundIt move.l acceleration(a2),d3 ; get new acceleration in d3 +@foundIt Move.B $85(A2), D3 + BEQ.B @endofthing + Clr -(SP) + Move.L #'accl', -(A7) + Move #$FFFF, (ROMMapInsert) + _CountResources + Move (SP)+, D3 + Move.L #'USB*', D4 + Bsr FindResource + BEQ.B @endofthing + MoveQ.L #$0, D4 + Bsr FindResource +@endofthing + + move.l acceleration(a2),d3 ; get new acceleration in d3 move.w (a0)+,d2 ; get # of acceleration tables in resource move.l a0,a1 ; keep ptr to 'low' accel table in a1 @@ -1316,7 +1330,7 @@ CrsrDevSetAccel ;------------------------------------------------ ; -; Routine: FindResource +; Routine: FindResource 8906 ; ; Inputs: d3 - # of 'accl' resources to search ; d4 - 'accl' resource tag we're looking for @@ -1353,7 +1367,7 @@ FindResource ;------------------------------------------------ ; -; Routine: Interpolate +; Routine: Interpolate 892e ; ; Inputs: 18(sp) - x1 ; 14(sp) - y1 @@ -1437,7 +1451,7 @@ Interpolate ;_______________________________________________________________________ ; -; Routine: CrsrDevHandleVBL +; Routine: CrsrDevHandleVBL 8992 ; ; Inputs: - ; @@ -1456,6 +1470,9 @@ CrsrDevHandleVBL movea.l ExpandMem,a3 ; get ptr to expandmem rec movea.l emCursorGlobals(a3),a3 ; get cursory global ptr + tst.l a3 + beq @exit + move.l firstCrsrDev(a3),d0 ; get ptr to 1st CrsrDevRec beq @exit ; if not even 1 device, just exit move.l d0,a2 ; ptr in a2 @@ -1664,7 +1681,7 @@ CrsrDevHandleVBL ;_______________________________________________________________________ ; -; Routine: DrawCursor +; Routine: DrawCursor 8b38 ; ; Inputs: a3 - ptr to CrsrDevGlobals ; @@ -1691,6 +1708,7 @@ DrawCursor movea.l firstCrsrData(a3),a4 ; get ptr to main CrsrDataRec bne.s @exit ; yesÉ exit lea CrsrPin,a0 ; it's ok to update cursor, get bounding rect + move.l d0,-(sp) BSR.L CrsrVBLTask ; pin and draw the cursor move.l Mouse,d0 ; has cursor been pinned? @@ -1730,7 +1748,7 @@ DrawCursor movea.l firstCrsrData(a3),a4 ; get ptr to main CrsrDataRec ;_______________________________________________________________________ ; -; Routine: CrsrDevNewDevice +; Routine: CrsrDevNewDevice 8bb8 ; ; Inputs: ... ; @@ -1827,7 +1845,7 @@ CrsrDevNewDevice ;_______________________________________________________________________ ; -; Routine: CrsrDevDisposeDev +; Routine: CrsrDevDisposeDev 8c6e ; ; Inputs: a2 - pointer to CrsrDevRec for device we want to remove ; @@ -1850,6 +1868,7 @@ CrsrDevDisposeDev @loop cmpa.l a1,a2 ; is this the linked list element we want? beq.s @gotIt ; yes, handle it move.l a1,d1 ; no, prev := next + beq.s @exit move.l nextCrsrDev(a1),d0 ; get next->nextCrsrDev beq.s @exit ; exit if NIL (we never found it) move.l d0,a1 ; next := next->nextCrsrDev @@ -1859,8 +1878,10 @@ CrsrDevDisposeDev tst.l d1 ; was it the first one? beq.s @firstOne ; yes, handle special case + move.l a2,d0 move.l d1,a2 move.l a1,nextCrsrDev(a2) ; else, delete our element from middle of list + move.l d0,a2 bra.s @dispose @firstOne move.l a1,firstCrsrDev(a0) @@ -1879,7 +1900,7 @@ CrsrDevDisposeDev ;_______________________________________________________________________ ; -; Routine: CrsrDevReInit +; Routine: CrsrDevReInit 8cae ; ; Inputs: d0 - 0 = pre-init, 1=post-init ; @@ -1912,6 +1933,7 @@ CrsrDevReInit ; movem.l d0-d3/a0-a3,-(sp) link a6,#adbPBSize ; Make a stack frame for our param block + tst d0 bne.s @PostInit ; Skip if post-processing ;--------------------- @@ -2106,7 +2128,7 @@ CrsrDevReInit ; ;_______________________________________________________________________ ; -; Routine: syncADBTalk +; Routine: syncADBTalk 8e7c ; ; Inputs: d0 - address/command byte ; a0 - ptr to receive buffer @@ -2120,7 +2142,9 @@ CrsrDevReInit ; ;_______________________________________________________________________ syncADBTalk +@restart move.l a0,-(sp) ; save ptr to our buffer + move.l d0,-(sp) clr.w -(sp) ; our 'sync' flag move.l sp,a1 ; keep pointer to globals for later @@ -2129,18 +2153,23 @@ syncADBTalk move.l a0,-(sp) ; push pointer to our reply buffer move.l sp,a0 _ADBOp + bmi.s @weird @spin tst.b (a1) ; have we completed? beq.s @spin ; no, keep waiting - lea 14(sp),sp ; dump locals + lea 18(sp),sp ; dump locals move.l (sp)+,a0 ; restore a0 rts +@weird lea.l $e(sp),sp + move.l (sp)+,d0 + move.l (sp)+,a0 + bra.s @restart ;_______________________________________________________________________ ; -; Routine: syncADBListen +; Routine: syncADBListen 8ea8 ; ; Inputs: d0 - address/command byte ; a0 - ptr to transmit buffer @@ -2154,6 +2183,8 @@ syncADBTalk ;_______________________________________________________________________ syncADBListen +@restart + movem.l d0/a0,-(sp) clr.w -(sp) ; our 'sync' flag move.l sp,a1 ; keep pointer to data area for later move.l sp,-(sp) ; push pointer to data area @@ -2161,17 +2192,21 @@ syncADBListen move.l a0,-(sp) ; push ptr to data to send move.l sp,a0 _ADBOp + bmi.s @weird @spin tst.b (a1) ; have we completed? beq.s @spin ; no, keep waiting - lea 14(sp),sp ; dump locals + lea 22(sp),sp ; dump locals rts - + +@weird lea.l $e(sp),sp + movem.l (sp)+,d0/a0 + bra.s @restart ;_______________________________________________________________________ ; -; Routine: syncComp +; Routine: syncComp 8ed2 ; ; Inputs: d0 - ADB command byte ; a0 - ptr to data (pascal string) @@ -2192,7 +2227,7 @@ syncComp st.b (a2) ; set our complete flag ;_______________________________________________________________________ ; -; Routine: InitCrsrDev +; Routine: InitCrsrDev 8ed6 ; ; Inputs: - ; @@ -2246,7 +2281,7 @@ InitCrsrDev ;______________________________________________________________________________ ; -; Routine: SetCrsrDelay +; Routine: SetCrsrDelay 8f22 ; ; Inputs: a1 contains the ptr to the cursor gDevice being setup ; @@ -2278,7 +2313,7 @@ SetCrsrDelay ;______________________________________________________________________________ ; -; Routine: SetCrsrDelCore +; Routine: SetCrsrDelCore 8f3c ; ; Inputs: a1 contains the ptr to the cursor gDevice being setup ; @@ -2296,6 +2331,22 @@ SetCrsrDelCore rts ; just a hook for now +NewCrsrFunction +; 8f3e + Move.L (DeviceList), D0 +@loop BEQ.B @done + MoveA.L D0, A0 + CmpA.L D1, A0 + BNE.B @moredone + MoveA.L (A0), A0 + Move.L $1E(A0), D0 + Bra.B @loop +@done SubA.L A0, A0 +@moredone Move.L A0, D1 + Rts + + + ;_____________________________________________________________________________________________ ; VDrawCursor - default DrawCursor routine ; @@ -2304,23 +2355,10 @@ SetCrsrDelCore ; the routine InitCrsrVects. ; - EXPORT VDrawCursor - IMPORT BLITCURSOR ;from ccrsrcore.a -VDrawCursor - MOVE.B #1,CRSRBUSY ;MARK CHANGE IN PROGRESS - - TST CRSRSTATE - BMI.S DoneSho ;QUIT IF STILL HIDDEN - CLR CRSRSTATE ;DON'T LET CRSRSTATE GET > 0 - TST.B CRSRVIS ;IS CURSOR ALREADY VISIBLE? - BNE.S DoneSho ;YES, DON'T TRY TO REDRAW - TST.B CrsrObscure ;Skip if obscured - BNE.S DoneSho +VDrawCursor PROC EXPORT - BSR.L BLITCURSOR ;Do the real work: put pixels up - -DoneSho CLR.B CRSRBUSY ;CHANGE COMPLETE - RTS + IMPORT QD_DRAWCURSOR + BRA.L QD_DRAWCURSOR ;______________________________________________________________________________________________ @@ -2331,16 +2369,9 @@ DoneSho CLR.B CRSRBUSY ;CHANGE COMPLETE ; the routine InitCrsrVects. ; - EXPORT VEraseCursor - IMPORT UNBLITCURSOR ;from ccrsrcore.a -VEraseCursor - MOVE.B #1,CRSRBUSY ;MARK CHANGE IN PROGRESS - TST.B CRSRVIS ;IS CURSOR VISIBLE? - BEQ.S DoneHid ;NO, DON'T TRY TO REMOVE IT - - BSR.L UNBLITCURSOR ;Zap Pixels +VEraseCursor PROC EXPORT -DoneHid CLR.B CRSRBUSY ;CHANGE COMPLETE - RTS + IMPORT QD_ERASECURSOR + BRA.L QD_ERASECURSOR END \ No newline at end of file diff --git a/OS/CudaMgr.a b/OS/CudaMgr.a index cc82f94..b8b51ab 100644 --- a/OS/CudaMgr.a +++ b/OS/CudaMgr.a @@ -208,7 +208,7 @@ ErrCudaInit equ $0030 ; TEMPORARY definition of error equate defined in STEQ WITH EgretGlobals,EgretPB,RespHeader eject ; { With ;________________________________________________________________________________________________ -; Routine: CudaDispatch +; Routine: CudaDispatch 8f90 ; ; Function: This is the Cuda manager trap routine. It waits for Cuda to be idle, sends ; the first byte of the command packet. If Cuda didn't abort, then it sets up @@ -271,6 +271,48 @@ CudaDispatch bra @done @CudaRestart + CmpI #$10C, (A0) + BEQ.B @L4 + CmpI #$107, (A0) + BNE.B @endChicanery + Tst.B $64(A2) + BEQ @endChicanery + +@L4 CmpI #$100, $2(A0) + BLT.B @L5 + Move #$FFCE, $E(A0) + Bra @done + +@L5 Lea.L $66(A2), A2 + Move $6(A0), D1 + BEQ @L9 + SubQ #$1, D1 + MoveQ.L #$0, D2 + Move $2(A0), D2 + MoveA.L $8(A0), A1 + +@L6 CmpI.B #$7, $1(A0) + BEQ.B @L7 + Move.B (A1)+, $0(A2,D2.W) + Bra.B @L8 + +@L7 Move.B $0(A2,D2.W), (A1)+ + +@L8 AddQ #$1, D2 + AndI #$FF, D2 + DBF D1, @L6 + +@L9 MoveA.L ($DE0), A2 + MoveA.L ($1D4), A1 + CmpI.B #$C, $1(A0) + BEQ.B @endChicanery + Tst.L $10(A0) + BEQ @done + MoveA.L $10(A0), A1 + Jsr (A1) + Bra @done + +@endChicanery move.w sr,-(sp) ; save SR ori.w #hiIntMask,sr ; mask interrupts @@ -285,17 +327,21 @@ CudaDispatch @abort move.w (sp)+,sr ; we were busy, enable interrupts jsr pollByte ; poll shift reg, calling handler if interrupts masked - bra.s @CudaRestart ; and keep waiting for busy to go away... + bra.s @endChicanery ; and keep waiting for busy to go away... @sendPackType ; interrupts masked here eieioSTP bset.b #SRdir,vACR(a1) ; switch to output, Define direction FROM System + nop eieioSTP move.b pbCmdType(a0),vSR(a1) ; send command packet to shift reg + nop eieioSTP bset.b #vByteAck,vBufB(a1) ; make sure state is idle before transaction + nop eieioSTP bclr.b #TIP,vBufB(a1) ; assert TIP (we're starting command packet) + nop eieioSTP ; @@ -303,7 +349,7 @@ CudaDispatch ; When the shift register irq comes in call the PollProc ; then process the shift register irq data ; - movem.l d0/d1/a0-a4/a6,-(sp) ; save some registers + movem.l d0-d3/a0-a4/a6,-(sp) ; save some registers move.l PollStack,-(sp) ; save previous poll stack lea @zero, a3 move.l sp,PollStack ; Pointer to buffer for polled bytes @@ -323,6 +369,7 @@ CudaDispatch beq.s @2 move.b (a6),-(sp) ; Push the data on the stack @2 + bsr.l otherDelay eieioSTP btst.b #vShift,vIFR(a1) ; now wait for shift reg IRQ eieioSTP @@ -341,7 +388,7 @@ CudaDispatch @NoSCCData move.l (sp)+,PollStack ; restore previous poll stack - movem.l (sp)+,d0/d1/a0-a4/a6 ; restore work registers + movem.l (sp)+,d0-d3/a0-a4/a6 ; restore work registers eieioSTP btst.b #TReq,vBufB(a1) ; did CUDA abort? eieioSTP @@ -353,22 +400,24 @@ CudaDispatch ; of CB1. Delay long enough for the edge to occur before acknowledging the shift ; register interrupt. (R. Montagne 1/11/93) ;________________________________________________________________________________________________ - moveq #10,d0 ; delay for 10µS min. + move $d00,d0 + divu #$50,d0 @mode7delay - eieioSTP - tst.b vBufB(a1) ; 1.2µS per access - eieioSTP dbra d0,@mode7delay eieioSTP bclr.b #SRdir,vACR(a1) ; yes, switch back to input + nop eieioSTP tst.b vSR(a1) ; clear pending shift register interrupt + nop eieioSTP ori.b #((1< - movea.l EgretBase,a2 ; get ptr to globals <13> - bset.b #busy,flags(a2) ; make sure we're marked as busy - - eieioSTP - btst.b #SRdir,vACR(a1) ; see if VIA direction is output - eieioSTP - beq.s @input ; no, then we're receiving.. + + btst.b #vShift,vIFR(a1) + bne.s @output + + move.w d3,sr ; restore interrupts + rts + ;________________________________________________________________________________________________ ; When outputing from the VIA to Cuda, the interrupt will occur prior to the rising edge ; of CB1. Delay long enough for the edge to occur before acknowledging the shift ; register interrupt. (R. Montagne 1/11/93) ;________________________________________________________________________________________________ - moveq #10,d0 ; delay for 10µS min. + +@output + movea.l EgretBase,a2 ; get ptr to globals <13> + bset.b #busy,flags(a2) ; make sure we're marked as busy + + btst.b #$4, $1600(A1) + beq.s * + $60 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; + + move $d00,d0 + divu #$50,d0 @mode7delay - eieioSTP - tst.b vBufB(a1) ; 1.2µS per access - eieioSTP dbra d0,@mode7delay ; eieioSTP tst.b vSR(a1) ; clear the shift reg interrupt + nop eieioSTP tst.w sendHdrCnt(a2) ; any bytes left in header? ble.s @ckSendData ; no, see if any send bytes left... @@ -535,6 +594,7 @@ CudaShiftRegIRQ @CmdFinished eieioSTP bclr.b #SRdir,vACR(a1) ; now switch to input + nop eieioSTP ;________________________________________________________________________________________________ ; When changing VIA direction, a clock can be generated to the VIA bit counter. An @@ -548,12 +608,14 @@ CudaShiftRegIRQ eieioSTP ori.b #((1< (rbm) @waitIdleAck ; (rbm) eieioSTP + bsr.l otherDelay btst.b #ifSR,vIFR(a1) ; wait for idle state acknowledgement (rbm) eieioSTP beq.s @waitIdleAck ; (rbm) eieioSTP tst.b vSR(a1) ; clear the shift reg interrupt (rbm) + nop eieioSTP ;--------------------------------------------------------------------------- @@ -806,7 +873,7 @@ CudaShiftRegIRQ Eject ;________________________________________________________________________________________________ -; Routine: SetTransferParams +; Routine: SetTransferParams 93e0 ; ; Function: This routine sets up transmit/receive ptrs (globals) for the packet pointed to by A0, ; for use by the Shift Reg interrupt handler. @@ -850,7 +917,9 @@ SetTransferParams clr.l sendDataPtr(a2) ; no extended data ptr <12> bra @rcvParams -@notDFAC cmp.b #RdWrIIC,pbCmd(a0) ; check for IIC transaction +@notDFAC cmp.b #$25,pbCmd(a0) + beq @dontjump + cmp.b #RdWrIIC,pbCmd(a0) ; check for IIC transaction bne.s @notRdWrIIC ; use the table if not RdWrIIC * * Here is how the transfer globals are set up for IIC transactionsÉ @@ -885,21 +954,30 @@ SetTransferParams * RespData ¥ RespData ¥ * curPB CudaPB curPB CudaPB * +@dontjump move.w pbByteCnt(a0),d1 ; RdWrIIC uses byte count for send portion addq.w #1,d1 ; include the packet byte already sent move.w d1,sendHdrCnt(a2) ; set up header byte count move.w #4,rcvHdrCnt(a2) ; 4 byte header default clr.w rcvHdrIndex(a2) ; reset index into header buffer move.l pbBufPtr(a0),a1 ; get address of data buffer - btst.b #0,pbParam(a0) ; is this a read or write IIC operation? - bne.s @doIICread ; + + cmp.b #RdWrIIC,pbCmd(a0) + beq.s @doIICwrite + + btst.b #0,4(a0) + bne.s @doIICread @doIICwrite ; + btst.b #0,pbParam(a0) + bne.s @doIICread + moveq #0,d1 ; data phase count must be 1 to 256 move.b (a1),d1 ; bne.s @wrCntOK ; move.w #$0100,d1 ; @wrCntOK ; move.w d1,sendDataCnt(a2) ; number of extended data bytes to send +@newlbl adda.l #1,a1 ; move.l a1,sendDataPtr(a2) ; extended data ptr clr.w rcvDataCnt(a2) ; no data to receive on IIC write @@ -1001,7 +1079,7 @@ CheckCudaPacket ;________________________________________________________________________________________________ -; Routine: CudaTickHandler +; Routine: CudaTickHandler 9566 ; ; Function: This is the completion routine for tick response packets. ; @@ -1063,7 +1141,7 @@ CudaTickHandler ENDWITH ; } ;========================================================================= -; Routine: CudaInit +; Routine: CudaInit 9584 ; ; This routine sends a NOP/WarmStart command to Cuda. This routine is ; called early during rom Startup to stop autopoll and 1 sec irq. Also, @@ -1118,6 +1196,7 @@ CudaInit eieioSTP ori.b #((1< (1< + nop eieioSTP move.l #hw4msDelay,d4 ; we want to delay 4 millisecs for ADB reset to complete @killtime @@ -1139,10 +1218,12 @@ CudaInit @noX eieioSTP tst.b vSR(a2) ; clear the pending interrupt + nop eieioSTP move.l #hw10msDelay,d4 ; Timeout values must exceed duration of maximum ADB auto poll. <7> eieioSTP bclr.b #vByteAck,vBufB(a2) ; issue a sync state (TIP = negated, ByteAck = asserted) + nop eieioSTP @waitSync eieioSTP @@ -1161,6 +1242,7 @@ CudaInit @haveSync move.l #hw10msDelay,d4 ; number of retries before giving up with Cuda eieioSTP bset.b #vByteAck,vBufB(a2) ; terminate the sync cycle + nop eieioSTP @syncTerm eieioSTP @@ -1172,6 +1254,7 @@ CudaInit @haveTerm eieioSTP tst.b vSR(a2) ; clear the pending interrupt + nop eieioSTP move.l #hw10msDelay,d4 ; number of retries before giving up with Cuda @waitIdle2 @@ -1185,15 +1268,17 @@ CudaInit eieioSTP ori.b #((1< + nop eieioSTP tst.b vSR(a2) ; clear the pending interrupt + nop eieioSTP @exit rts6 ; setup the return to caller of CudaInit eject ************************************************************************************************************ -* SendCudaCmd: This register based routine will send up to four bytes of data to +* SendCudaCmd 9630: This register based routine will send up to four bytes of data to * Cuda. The packet type, command, byte count and data are passed in * registers. The routine will return with d0.w = $0000 if it sent the * command successfully. A value of $FFFF signifies that the command did @@ -1236,14 +1321,17 @@ SendCudaCmd eieioSTP ori.b #((1< move.l #0001,d6 ; d6.l must be nonzero - bigjmp Error1Handler,a3 ; Play death chimes + bra.s * VsrIrq - move.b #10,d4 ; mode 7 interrupt occurs at falling edge CB1 -@m7dly ; use d4 since retry count not required anymore - eieioSTP - tst.b vBufB(a1) ; hardware access is 1.2µS - eieioSTP - sub.b #1,d4 ; can only trash low byte - bne.s @m7dly ; wait long enough for CB1 to rise (10µS delay) - + move.l d4,-(sp) + move $d00,d4 + divu #10,d4 + dbra.w d4,* + move.l (sp)+,d4 + eieioSTP tst.b vSR(a1) ; clear the interrupt + nop eieioSTP btst.b #TReq,vBufB(a1) ; exit with abort status + nop eieioSTP AbortReq rts5 ;-------------------------------------------------------------------------- -; DumpAbort This routine will read all the data for an abort transaction and +; DumpAbort 9774 This routine will read all the data for an abort transaction and ; discard it. When done it will jump back to SendNopCmd entry point ; to retry our command. This command will eventually complete... @@ -1383,14 +1483,18 @@ AbortReq rts5 RealAbort eieioSTP bclr.b #SRdir,vACR(a1) ; shift in + nop eieioSTP ori.b #((1< -@m7dly - eieioSTP - tst.b vBufB(a1) ; hardware access is 1.2µS - eieioSTP - sub.b #1,d0 ; can only trash low byte - bne.s @m7dly ; wait long enough for CB1 to rise (10µS delay) - + move.l d0,-(sp) + move $d00,d0 + divu #10,d0 + dbra.w d0,* + move.l (sp)+,d0 eieioSTP tst.b vSR(a1) ; clear the interrupt + nop eieioSTP rts5 ;-------------------------------------------------------------------------- ; Export readByte readByte + bsr.l otherDelay eieioSTP btst.b #ifSR,vIFR(a1) ; wait for shift to complete eieioSTP beq.s readByte eieioSTP move.b vSR(a1),d0 ; read the byte + nop eieioSTP eori.b #1< BT: Second OS table macro for Figment. This is temporary -; until figment is fully approved. -;------------------------------------------------------------------------------ - macro - OS2 &num,&name,&cond - if (*-SecondOS)/4 <> &Eval(&num) then - aerror 'Trap Number out of sequence' - endif - if &name = '' then - dc.l 0 ; unused - elseif &cond = '' then - import &name - dc.l &name-BaseOfRom - elseif &Eval(&cond) then - import &name - dc.l &name-BaseOfRom - else - dc.l 0 ; not used in this configuration - endif - endm -;------------------------------------------------------------------------------ -; BT: End second OS table macro -;------------------------------------------------------------------------------ - endif - EXPORT DispTable IMPORT BaseofRom @@ -353,13 +326,13 @@ DispTable FirstTool ToolBox $000 ; toolbox trap $000 (ALWAYS LEAVE AS ZERO) rb - ToolBox $001,__SNDDISPOSECHANNEL ; toolbox trap $001 - ToolBox $002,__SNDADDMODIFIER ; toolbox trap $002 - ToolBox $003,__SNDDOCOMMAND ; toolbox trap $003 - ToolBox $004,__SNDDOIMMEDIATE ; toolbox trap $004 - ToolBox $005,__SNDPLAY ; toolbox trap $005 - ToolBox $006,__SNDCONTROL ; toolbox trap $006 - ToolBox $007,__SNDNEWCHANNEL ; toolbox trap $007 + ToolBox $001 ;,__SNDDISPOSECHANNEL ; toolbox trap $001 + ToolBox $002 ;,__SNDADDMODIFIER ; toolbox trap $002 + ToolBox $003 ;,__SNDDOCOMMAND ; toolbox trap $003 + ToolBox $004 ;,__SNDDOIMMEDIATE ; toolbox trap $004 + ToolBox $005 ;,__SNDPLAY ; toolbox trap $005 + ToolBox $006 ;,__SNDCONTROL ; toolbox trap $006 + ToolBox $007 ;,__SNDNEWCHANNEL ; toolbox trap $007 ToolBox $008,InitProcMenu ; toolbox trap $008 (new menu mgr) ToolBox $009,GetCVariant ; toolbox trap $009 ToolBox $00A,GetWVariant ; toolbox trap $00A @@ -374,8 +347,8 @@ FirstTool ToolBox $013,TEAutoView ; toolbox trap $013 ToolBox $014,SetFractEnable ; toolbox trap $014 (font mgr) ; ToolBox $015,SCSIMgr ; toolbox trap $015 - ToolBox $015,SCSIDispatchCommon ; toolbox trap $015 - ToolBox $016,Pack8 ; toolbox trap $016 + ToolBox $015, ;SCSIDispatchCommon ; toolbox trap $015 + ToolBox $016, ;Pack8 ; toolbox trap $016 ToolBox $017,CopyMask ; toolbox trap $017 ToolBox $018,FixAtan2 ; toolbox trap $018 ToolBox $019,XMunger ; toolbox trap $019 @@ -396,13 +369,13 @@ FirstTool ToolBox $028,ShowDItem ; toolbox trap $028 ToolBox $029,LayerDispatch ; toolbox trap $029 (LayerDispatch) (v1.1) ToolBox $02A,MainComponent ; toolbox trap $02A (ComponentDispatch) (v1.1) - ToolBox $02B,Pack9 ; toolbox trap $02B + ToolBox $02B ;,Pack9 ; toolbox trap $02B ToolBox $02C,Pack10 ; toolbox trap $02C - ToolBox $02D,Pack11 ; toolbox trap $02D + ToolBox $02D ;,Pack11 ; toolbox trap $02D ToolBox $02E,Pack12 ; toolbox trap $02E ToolBox $02F,Pack13 ; toolbox trap $02F - ToolBox $030,Pack14Entry ; toolbox trap $030 - ToolBox $031,Pack15 ; toolbox trap $031 + ToolBox $030 ;,Pack14Entry ; toolbox trap $030 + ToolBox $031 ;,Pack15 ; toolbox trap $031 ToolBox $032 ; toolbox trap $032 (unimplemented) (v1.1) ToolBox $033,ScrnBitMap ; toolbox trap $033 ToolBox $034,SetFScaleDisable ; toolbox trap $034 @@ -819,7 +792,7 @@ FirstTool ToolBox $1C5,RsrcMapEntry ; toolbox trap $1C5 ToolBox $1C6,Secs2Date ; toolbox trap $1C6 ToolBox $1C7,Date2Secs ; toolbox trap $1C7 - ToolBox $1C8,__SYSBEEP ; toolbox trap $1C8 + ToolBox $1C8 ;,__SYSBEEP ; toolbox trap $1C8 ToolBox $1C9,SystemError ; toolbox trap $1C9 ToolBox $1CA,PutIcon ; toolbox trap $1CA ToolBox $1CB,TEGetText ; toolbox trap $1CB @@ -958,11 +931,11 @@ FirstTool ToolBox $250,SeedCFill ; toolbox trap $250 <31Jan89 BAL> ToolBox $251,KopyMask ; toolbox trap $251 ToolBox $252,HighLevelFSDispatch ; toolbox trap $252 (unknown) - ToolBox $253,DictionaryDispatch ; toolbox trap $253 (DictionaryDispatch) CSS - ToolBox $254,TSMDispatch ; toolbox trap $254 (TMSDispatch) + ToolBox $253 ;,DictionaryDispatch ; toolbox trap $253 (DictionaryDispatch) CSS + ToolBox $254 ;,TSMDispatch ; toolbox trap $254 (TMSDispatch) ToolBox $255 ; toolbox trap $255 (unknown) ToolBox $256 ; toolbox trap $256 (unknown) - ToolBox $257,DockingDispatch ; toolbox trap $257 (unknown) + ToolBox $257 ;,DockingDispatch ; toolbox trap $257 (unknown) ToolBox $258 ; toolbox trap $258 (unknown) ToolBox $259 ; toolbox trap $259 (unknown) ToolBox $25A ; toolbox trap $25A (unknown) @@ -983,13 +956,14 @@ FirstTool ToolBox $268,DialogMgrDispatch ; toolbox trap $268 ToolBox $269 ; toolbox trap $269 (unknown) - ToolBox $26A ; toolbox trap $26A (unknown) + ToolBox $26A,__AA6A ToolBox $26B ; toolbox trap $26B (unknown) ToolBox $26C ; toolbox trap $26C (unknown) ToolBox $26D ; toolbox trap $26D (unknown) ToolBox $26E ; toolbox trap $26E (unknown) ToolBox $26F ; toolbox trap $26F (unknown) - DCB.L 16,0 ; toolbox trap $270-$27F (unknown) + DCB.L 15,0 ; toolbox trap $270-$27E (unknown) + ToolBox $27F,NKLog DCB.L 16,0 ; toolbox trap $280-$28F (unknown) ToolBox $290,InitPalettes ; toolbox trap $290 <02Jun87 DAF> ToolBox $291,NewPalette ; toolbox trap $291 <02Jun87 DAF> @@ -1045,7 +1019,7 @@ FirstTool DCB.L 16,0 ; toolbox trap $2E0-$2EF (unknown) ToolBox $2F0 ; toolbox trap $2AF (unknown) - ToolBox $2F1 ; toolbox trap $2AF (unknown) + ToolBox $2F1,ATAManager ToolBox $2F2 ; toolbox trap $2AF (unknown) ToolBox $2F3,ExpansionBusDispatch ; toolbox trap $2F3 (Expansion Bus Mgr) ToolBox $2F4 ; toolbox trap $2AF (unknown) @@ -1262,7 +1236,7 @@ FirstTool ToolBox $3C6 ; quickdraw hook $3C6 ToolBox $3C7 ; quickdraw hook $3C7 ToolBox $3C8 ; quickdraw2 hook $3C8 - ToolBox $3C9,IconDispatch ; quickdraw _IconDispatch $3C9 + ToolBox $3C9 ;,IconDispatch ; quickdraw _IconDispatch $3C9 ToolBox $3CA,DeviceLoop ; quickdraw _DeviceLoop <20> PN ToolBox $3CB ; quickdraw hook $3CB ToolBox $3CC ; quickdraw hook $3CC @@ -1270,7 +1244,8 @@ FirstTool ToolBox $3CE ; quickdraw hook $3CE ToolBox $3CF ; quickdraw hook $3CF DCB.L 16,0 ; toolbox trap $3D0-$3DF (unknown) - DCB.L 11,0 ; toolbox trap $3E0-$3EA (unknown) + ToolBox $3E0,QDExtensions2 + DCB.L 10,0 ; toolbox trap $3E1-$3EA (unknown) IF hasDisplayMgr THEN ; Only install if we have we are flagged ToolBox $3EB,DisplayDispatch ; toolbox trap $3EB (DisplayManager) (IH) ELSE @@ -1278,7 +1253,7 @@ FirstTool ENDIF DCB.L 4,0 ; toolbox trap $3EC-$3EF (unknown) ToolBox $3F0 ; toolbox trap $3F0 (unknown) - ToolBox $3F1 ; toolbox trap $3F1 (unknown) + ToolBox $3F1,GestaltValueDispatch ToolBox $3F2 ; toolbox trap $3F2 (unknown) ToolBox $3F3 ; toolbox trap $3F3 (unknown) ToolBox $3F4 ; toolbox trap $3F4 (unknown) @@ -1384,14 +1359,14 @@ FirstOS OS $50,RelStringTrap ; OS trap $50 OS $51,ReadXPRam ; OS trap $51 OS $52,WriteXPRam ; OS trap $52 - OS $53,ClkNoMem ; OS trap $53 + OS $53 ;,ClkNoMem ; OS trap $53 OS $54,UprStringTrap ; OS trap $54 OS $55,__StripAddress ; OS trap $55 (new memory mgr) OS $56,NewLwrString ; OS trap $56 ;in-ROM script manager OS $57,SetApplBase ; OS trap $57 - OS $58,__InsTime ; OS trap $58 - OS $59,__RmvTime ; OS trap $59 - OS $5A,__PrimeTime ; OS trap $5A + OS $58 ;,__InsTime ; OS trap $58 + OS $59 ;,__RmvTime ; OS trap $59 + OS $5A ;,__PrimeTime ; OS trap $5A OS $5B,PowerOff ; OS trap $5B (poweroff trap) <11apr86>/ OS $5C,MemoryDispatch,hasMMU ; OS trap $5C (MemoryDispatch trap) OS $5D ; OS trap $5D (MMU trap, set up later) <2.7> @@ -1408,7 +1383,7 @@ FirstOS OS $68,HNoRSRC ; OS trap $68 OS $69,HGetFlags ; OS trap $69 OS $6A,HSetFlags ; OS trap $6A - OS $6B,TestManager ; OS trap $6B (test trap) + OS $6B ;,TestManager ; OS trap $6B (test trap) OS $6C,InitFS ; OS trap $6C OS $6D,InitEvents ; OS trap $6D OS $6E,SlotManager,hasSlotMgr ; OS trap $6E @@ -1434,13 +1409,13 @@ FirstOS OS $82,DTInstallTrap ; OS trap $82 (deferred task) OS $83,SetOSDefault,hasSlotMgr ; OS trap $83 (which os to use) OS $84,GetOSDefault,hasSlotMgr ; OS trap $84 (which os to use) - OS $85,PmgrOp,hasPwrControls|PwrMgrADB|hasPwrMgrClock ; OS trap $85 + OS $85 ;,PmgrOp,hasPwrControls|PwrMgrADB|hasPwrMgrClock ; OS trap $85 OS $86,IOPInfoAccess,hasIopScc|hasIopSwim ; OS trap $086 <1.3> OS $87,IOPMsgRequest,hasIopScc|hasIopSwim ; OS trap $087 <1.3> OS $88,IOPMoveData,hasIopScc|hasIopSwim ; OS trap $088 <1.3> OS $89,NewSCSITrap,0 ; os trap $89 (async SCSI Mgr) <3.0> OS $8A,GoToSleep,hasPwrControls|PwrMgrADB|hasPwrMgrClock ; OS trap $8A - OS $8B,COMMTOOLBOXDISPATCHER ; os trap $8B (CommToolBoxTrap) + OS $8B ;,COMMTOOLBOXDISPATCHER ; os trap $8B (CommToolBoxTrap) OS $8C ; os trap $8C (unknown) <1.5> OS $8D,DebugUtil ; os trap $8D <1.5> OS $8E,ExtBTreeDispatch ; os trap $8E (BTreeDispatch) <2.0> @@ -1448,7 +1423,7 @@ FirstOS OS $90,SysEnvironsTrap ; OS trap $90 OS $91,Translate24To32 ; os trap $91 (unknown) <2.9> BAL OS $92,EgretDispatch,hasEgret ; os trap $92 <4> - OS $93,__Microseconds ; os trap $93 <9> + OS $93 ;,__Microseconds ; os trap $93 <9> OS $94 ; os trap $94 (unknown) OS $95 ; os trap $95 (unknown) OS $96 ; os trap $96 (unknown) @@ -1459,8 +1434,8 @@ FirstOS OS $9B ; os trap $9B (unknown) OS $9C ; os trap $9C (unknown) OS $9D,MoveHLow ; os trap $9D MoveHLow tcn - OS $9E,PowerMgrDispatch,hasPwrControls ; os trap $9E (PowerMgrDispatch Trap) - OS $9F,PowerDispatch,hasPwrControls ; os trap $9F (PwrControls Traps) <17> rb + OS $9E ;,PowerMgrDispatch,hasPwrControls ; os trap $9E (PowerMgrDispatch Trap) + OS $9F ;,PowerDispatch,hasPwrControls ; os trap $9F (PwrControls Traps) <17> rb OS $A0 ; os trap $A0 (unknown) OS $A1 ; os trap $A1 (unknown) OS $A2 ; os trap $A2 (unknown) @@ -1493,7 +1468,7 @@ FirstOS OS $B6,vWaitUntil ; vector $B6 (iocore) OS $B7,vSyncWait ; vector $B7 (iocore) - OS $B8,__SNDAPPDEAD ; vector $B8 + OS $B8 ;,__SNDAPPDEAD ; vector $B8 OS $B9,vDisPtch ; vector $B9 (deferred task) <2.2> OS $BA,vIAZInit ; vector $BA <16jun87 CSL> OS $BB,vIAZPostInit ; vector $BB <16jun87 CSL> @@ -1530,7 +1505,7 @@ FirstOS OS $DA,vExtendFile ; vector $DA OS $DB,vTruncateFile ; vector $DB OS $DC,vCMSetUp ; vector $DC - OS $DD,vppcDispatcher ; vector $DD (PPCDispatcher) + OS $DD ;,vppcDispatcher ; vector $DD (PPCDispatcher) OS $DE,vDtrmV1 ; vector $DE OS $DF,vBlkAlloc ; vector $DF OS $E0,vBlkDeAlloc ; vector $E0 @@ -1570,285 +1545,5 @@ FirstOS ; end of vectors ;------------------------------------------------------------------------------ - - if hasNewHeapMgr Then -;------------------------------------------------------------------------------ -; BT: Second OS table for Figment. This is temporary -; until figment is fully approved. -;------------------------------------------------------------------------------ -; WARNING -- DO NOT CHANGE THIS TABLE UNLESS YOU CHANGE THE CORRESPONDING OS TABLE! (ABOVE) -;------------------------------------------------------------------------------ - -SecondOS - OS2 $00,Open ; OS trap $00 - OS2 $01,Close ; OS trap $01 - OS2 $02,Read ; OS trap $02 - OS2 $03,Write ; OS trap $03 - OS2 $04,ControlTrap ; OS trap $04 - OS2 $05,StatusTrap ; OS trap $05 - OS2 $06,KillIOTrap ; OS trap $06 - OS2 $07,GetVolInfo ; OS trap $07 - OS2 $08,FileCreate ; OS trap $08 - OS2 $09,FileDelete ; OS trap $09 - OS2 $0A,OpenRFTrap ; OS trap $0A - OS2 $0B,RenameTrap ; OS trap $0B - OS2 $0C,GetFileInfo ; OS trap $0C - OS2 $0D,SetFileInfo ; OS trap $0D - OS2 $0E,UnmountVolTrap ; OS trap $0E - OS2 $0F,MountVol ; OS trap $0F - OS2 $10,FileAlloc ; OS trap $10 - OS2 $11,GetEOFTrap ; OS trap $11 - OS2 $12,SetEOFTrap ; OS trap $12 - OS2 $13,FlushVolTrap ; OS trap $13 - OS2 $14,GetVolTrap ; OS trap $14 - OS2 $15,SetVolTrap ; OS trap $15 - OS2 $16,FInitQueue ; OS trap $16 - OS2 $17,EjectTrap ; OS trap $17 - OS2 $18,GetFPosTrap ; OS trap $18 - OS2 $19,Fig_InitZoneTrap ; OS trap $19 - OS2 $1A,Fig_GetZone ; OS trap $1A - OS2 $1B,Fig_SetZone ; OS trap $1B - OS2 $1C,Fig_FreeMem ; OS trap $1C - OS2 $1D,Fig_MaxMemTrap ; OS trap $1D - OS2 $1E,Fig_NewPtrTrap ; OS trap $1E - OS2 $1F,Fig_DisposePtr ; OS trap $1F - OS2 $20,Fig_SetPtrSizeTrap ; OS trap $20 - OS2 $21,Fig_GetPtrSizeTrap ; OS trap $21 - OS2 $22,Fig_NwHandle ; OS trap $22 - OS2 $23,Fig_DsposeHandle ; OS trap $23 - OS2 $24,Fig_SetHandleSizeTrap ; OS trap $24 - OS2 $25,Fig___GetHandleSize ; OS trap $25 - OS2 $26,Fig_HandleZoneTrap ; OS trap $26 - OS2 $27,Fig_ReallocHandleTrap ; OS trap $27 - OS2 $28,Fig_RecoverHandleTrap ; OS trap $28 - OS2 $29,Fig_HLock ; OS trap $29 - OS2 $2A,Fig_HUnlock ; OS trap $2A - OS2 $2B,Fig_EmptyHandle ; OS trap $2B - OS2 $2C,Fig_InitApplZone ; OS trap $2C - OS2 $2D,Fig_SetApplLimit ; OS trap $2D - OS2 $2E,__BlockMove ; OS trap $2E - OS2 $2F,PostEventTrap ; OS trap $2F - OS2 $30,OSEventAvailTrap ; OS trap $30 rb - OS2 $31,GetOSEventTrap ; OS trap $31 - OS2 $32,FlushEvents ; OS trap $32 - OS2 $33,VInstall ; OS trap $33 - OS2 $34,VRemove ; OS trap $34 - OS2 $35,OffLine ; OS trap $35 - OS2 $36,Fig_MoreMasters ; OS trap $36 - OS2 $37,ReadParam ; OS trap $37 - OS2 $38,WriteParamTrap ; OS trap $38 - OS2 $39,ReadDateTimeTrap ; OS trap $39 - OS2 $3A,SetDateTimeTrap ; OS trap $3A - OS2 $3B,DelayTrap ; OS trap $3B - OS2 $3C,CmpString ; OS trap $3C - OS2 $3D,DrvrInstall ; OS trap $3D - OS2 $3E,DrvrRemove ; OS trap $3E - OS2 $3F,InitUtil ; OS trap $3F - OS2 $40,Fig_ResrvMem ; OS trap $40 - OS2 $41,SetFilLock ; OS trap $41 new from extensionHFS - OS2 $42,RstFilLock ; OS trap $42 new from extensionHFS - OS2 $43,SetFilType ; OS trap $43 - OS2 $44,SetFPosTrap ; OS trap $44 - OS2 $45,FlushFile ; OS trap $45 - OS2 $46,GetTrapAddressTrap ; OS trap $46 - OS2 $47,SetTrapAddressTrap ; OS trap $47 - OS2 $48,Fig_PtrZoneTrap ; OS trap $48 - OS2 $49,Fig_HPurge ; OS trap $49 - OS2 $4A,Fig_HNoPurge ; OS trap $4A - OS2 $4B,Fig_SetGrowZone ; OS trap $4B - OS2 $4C,Fig_CompactMemTrap ; OS trap $4C - OS2 $4D,Fig_PurgeMem ; OS trap $4D - OS2 $4E,AddDriveTrap ; OS trap $4E - OS2 $4F,InstallRDrivers ; OS trap $4F - OS2 $50,RelStringTrap ; OS trap $50 - OS2 $51,ReadXPRam ; OS trap $51 - OS2 $52,WriteXPRam ; OS trap $52 - OS2 $53,ClkNoMem ; OS trap $53 - OS2 $54,UprStringTrap ; OS trap $54 - OS2 $55,__StripAddress ; OS trap $55 (new memory mgr) - OS2 $56,NewLwrString ; OS trap $56 ;in-ROM script manager - OS2 $57,Fig_SetApplBase ; OS trap $57 - OS2 $58,__InsTime ; OS trap $58 - OS2 $59,__RmvTime ; OS trap $59 - OS2 $5A,__PrimeTime ; OS trap $5A - OS2 $5B,PowerOff ; OS trap $5B (poweroff trap) <11apr86>/ - OS2 $5C,MemoryDispatch,hasMMU ; OS trap $5C (MemoryDispatch trap) - OS2 $5D ; OS trap $5D (MMU trap, set up later) <2.7> - OS2 $5E,__NMINSTALL ; OS trap $5E (v1.1) tcn - OS2 $5F,__NMREMOVE ; OS trap $5F (v1.1) tcn - OS2 $60,TFSDispatch ; OS trap $60 - OS2 $61,Fig_MaxBlockTrap ; OS trap $61 - OS2 $62,Fig_PurgeSpaceTrap ; OS trap $62 - OS2 $63,Fig_MaxApplZone ; OS trap $63 - OS2 $64,Fig_MoveHHi ; OS trap $64 - OS2 $65,Fig_StackSpaceTrap ; OS trap $65 - OS2 $66,Fig_NewEmptyHandleTrap ; OS trap $66 - OS2 $67,Fig_HRSRC ; OS trap $67 - OS2 $68,Fig_HNoRSRC ; OS trap $68 - OS2 $69,Fig_HGetFlags ; OS trap $69 - OS2 $6A,Fig_HSetFlags ; OS trap $6A - OS2 $6B,TestManager ; OS trap $6B (test trap) - OS2 $6C,InitFS ; OS trap $6C - OS2 $6D,InitEvents ; OS trap $6D - OS2 $6E,SlotManager,hasSlotMgr ; OS trap $6E - OS2 $6F,SlotVInstall,hasSlotMgr ; os trap $6F (Slot Manager) - OS2 $70,SlotVRemove,hasSlotMgr ; os trap $70 (Slot Manager) - OS2 $71,AttachVBL,hasSlotMgr ; os trap $71 (VBL Manager) - OS2 $72,DoVBLTask,hasSlotMgr ; os trap $72 (VBL Manager) - OS2 $73 ; OS trap $73 (reserved for twitcher??) - OS2 $74,CacheTrap ; os trap $74 - OS2 $75,SIntInstall,hasSlotMgr ; OS trap $75 - OS2 $76,SIntRemove,hasSlotMgr ; OS trap $76 - OS2 $77,CountADBs ; OS trap $77 (fdb manager) - OS2 $78,GetIndADBTrap ; OS trap $78 (fdb manager) - OS2 $79,GetADBInfoTrap ; OS trap $79 (fdb manager) - OS2 $7A,SetADBInfoTrap ; OS trap $7A (fdb manager) - OS2 $7B,ADBReinit ; OS trap $7B (fdb manager) - OS2 $7C,ADBOpTrap ; OS trap $7C (fdb manager) - OS2 $7D,GetDefaultStartup ; OS trap $7D (start manager) - OS2 $7E,SetDefaultStartup ; OS trap $7E (start manager) - OS2 $7F,InternalWait ; os trap $7F (start manager) - OS2 $80,GetVideoDefault,hasSlotMgr ; OS trap $80 (start manager) - OS2 $81,SetVideoDefault,hasSlotMgr ; OS trap $81 (start manager) - OS2 $82,DTInstallTrap ; OS trap $82 (deferred task) - OS2 $83,SetOSDefault,hasSlotMgr ; OS trap $83 (which os to use) - OS2 $84,GetOSDefault,hasSlotMgr ; OS trap $84 (which os to use) - OS2 $85,PmgrOp,hasPwrControls|PwrMgrADB|hasPwrMgrClock ; OS trap $85 - OS2 $86,IOPInfoAccess,hasIopScc|hasIopSwim ; OS trap $086 <1.3> - OS2 $87,IOPMsgRequest,hasIopScc|hasIopSwim ; OS trap $087 <1.3> - OS2 $88,IOPMoveData,hasIopScc|hasIopSwim ; OS trap $088 <1.3> - OS2 $89,NewSCSITrap,0 ; os trap $89 (async SCSI Mgr) <3.0> - OS2 $8A,GoToSleep,hasPwrControls|PwrMgrADB|hasPwrMgrClock ; OS trap $8A - OS2 $8B,COMMTOOLBOXDISPATCHER ; os trap $8B (CommToolBoxTrap) - OS2 $8C ; os trap $8C (unknown) <1.5> - OS2 $8D,DebugUtil ; os trap $8D <1.5> - OS2 $8E,ExtBTreeDispatch ; os trap $8E (BTreeDispatch) <2.0> - OS2 $8F,NonVMDeferUserFn ; os trap $8F (DeferUserFn) PN - OS2 $90,SysEnvironsTrap ; OS trap $90 - OS2 $91,Translate24To32 ; os trap $91 (unknown) <2.9> BAL - OS2 $92,EgretDispatch,hasEgret ; os trap $92 <4> - OS2 $93,__Microseconds ; os trap $93 <9> - OS2 $94 ; os trap $94 (unknown) - OS2 $95 ; os trap $95 (unknown) - OS2 $96 ; os trap $96 (unknown) - OS2 $97 ; os trap $97 (unknown) - OS2 $98,HwPriv,Cpu³020 ; OS trap $98 <1.6> - OS2 $99 ; os trap $99 (unknown) - OS2 $9A,ProcHelper ; os trap $9A ProcHelper <19> rb - OS2 $9B ; os trap $9B (unknown) - OS2 $9C ; os trap $9C (unknown) - OS2 $9D,Fig_MoveHLow ; os trap $9D MoveHLow tcn - OS2 $9E,PowerMgrDispatch,hasPwrControls ; os trap $9E (PowerMgrDispatch Trap) - OS2 $9F,PowerDispatch,hasPwrControls ; os trap $9F (PwrControls Traps) <17> rb - OS2 $A0 ; os trap $A0 (unknown) - OS2 $A1 ; os trap $A1 (unknown) - OS2 $A2 ; os trap $A2 (unknown) - OS2 $A3 ; os trap $A3 (unknown) - OS2 $A4,HeapDispatch ; os trap $A4 (unknown) - OS2 $A5,VisRgnChanged ; os trap $A5 <26MAR90 KON> - OS2 $A6,vRMgrStdEntry ; vector $A6 (StdEntry in rmgr)<3.2> - OS2 $A7,vRMgrStdExit ; vector $A7 (StdExit in rmgr) <3.2> - OS2 $A8 ; os trap $A8 (unknown) - OS2 $A9 ; os trap $A9 (unknown) - OS2 $AA ; os trap $AA (unknown) - OS2 $AB ; os trap $AB (unknown) - OS2 $AC ; os trap $AC (unknown) - OS2 $AD,GestaltTrap ; os trap $AD (Gestalt) <1.9> - OS2 $AE ; os trap $AE (unknown) - -;------------------------------------------------------------------------------ -; end of OS traps, start of vectors -;------------------------------------------------------------------------------ -; WARNING -- DO NOT CHANGE THIS TABLE UNLESS YOU CHANGE THE CORRESPONDING OS TABLE! (ABOVE) -;------------------------------------------------------------------------------ - - OS2 $AF,vMtCheck ; vector $AF (HFS) - OS2 $B0,vCheckReMount ; vector $B0 (HFS) - OS2 $B1,vDtrmV2 ; vector $B1 (HFS) - OS2 $B2,vFindDrive ; vector $B2 (HFS) - OS2 $B3,vFClose ; vector $B3 (HFS) - OS2 $B4,vFlushMDB ; vector $B4 (HFS) - OS2 $B5,vGoDriver ; vector $B5 (iocore) - OS2 $B6,vWaitUntil ; vector $B6 (iocore) - OS2 $B7,vSyncWait ; vector $B7 (iocore) - - OS2 $B8,__SNDAPPDEAD ; vector $B8 - OS2 $B9,vDisPtch ; vector $B9 (deferred task) <2.2> - OS2 $BA,vIAZInit ; vector $BA <16jun87 CSL> - OS2 $BB,vIAZPostInit ; vector $BB <16jun87 CSL> - OS2 $BC,vLaunchInit ; vector $BC <16jun87 CSL> - OS2 $BD,vCacheFlush ; vector $BD <1.2> - OS2 $BE,AsyncPatch ; vector $BE - OS2 $BF,vLg2Phys ; vector $BF - OS2 $C0,vFLushCache ; vector $C0 - OS2 $C1,vGetBlock ; vector $C1 - OS2 $C2,vMarkBlock ; vector $C2 - OS2 $C3,vRelBlock ; vector $C3 - OS2 $C4,vTrashBlocks ; vector $C4 - OS2 $C5,vTrashVBlks ; vector $C5 - OS2 $C6,vCacheWrIP ; vector $C6 - OS2 $C7,vCacheRdIP ; vector $C7 - OS2 $C8,vBasicIO ; vector $C8 - OS2 $C9,vRdBlocks ; vector $C9 - OS2 $CA,vWrBlocks ; vector $CA - OS2 $CB,vSetUpTags ; vector $CB - OS2 $CC,vBTClose ; vector $CC - OS2 $CD,vBTDelete ; vector $CD - OS2 $CE,vBTFlush ; vector $CE - OS2 $CF,vBTGetRecord ; vector $CF - OS2 $D0,VBTINSERT ; vector $D0 - OS2 $D1,vBTOpen ; vector $D1 - OS2 $D2,vBTSEARCH ; vector $D2 - OS2 $D3,vBTUpdate ; vector $D3 - OS2 $D4,vGetNode ; vector $D4 - OS2 $D5,vRelNode ; vector $D5 - OS2 $D6,vAllocNode ; vector $D6 - OS2 $D7,vFreeNode ; vector $D7 - OS2 $D8,vExtBTFile ; vector $D8 - OS2 $D9,vDeallocFile ; vector $D9 - OS2 $DA,vExtendFile ; vector $DA - OS2 $DB,vTruncateFile ; vector $DB - OS2 $DC,vCMSetUp ; vector $DC - OS2 $DD,vppcDispatcher ; vector $DD (PPCDispatcher) - OS2 $DE,vDtrmV1 ; vector $DE - OS2 $DF,vBlkAlloc ; vector $DF - OS2 $E0,vBlkDeAlloc ; vector $E0 - OS2 $E1,vFileOpen ; vector $E1 - OS2 $E2,vPermssnChk ; vector $E2 - OS2 $E3,vFndFilName ; vector $E3 - OS2 $E4,vRfNCall ; vector $E4 - OS2 $E5,vAdjEOF ; vector $E5 - OS2 $E6,vPixel2Char ; vector $E6 - OS2 $E7,vChar2Pixel ; vector $E7 - OS2 $E8 ; vector $E8 (unknown) - OS2 $E9,vFileClose ; vector $E9 (dnf v2.6) - OS2 $EA,vFileRead ; vector $EA (dnf v2.6) - OS2 $EB,vFileWrite ; vector $EB (dnf v2.6) - OS2 $EC,DispatchHelper ; OS Trap $EC DispatchHelper <19> rb - OS2 $ED,VUPDALTMDB ; vector $ED <3.1> - OS2 $EE,vCkExtFS ; vector $EE - OS2 $EF,vDTrmV3 ; vector $EF - OS2 $F0,vBMChk ; vector $F0 - OS2 $F1,vTstMod ; vector $F1 - OS2 $F2,vLocCRec ; vector $F2 - OS2 $F3,vTreeSearch ; vector $F3 - OS2 $F4,vMapFBlock ; vector $F4 - OS2 $F5,vXFSearch ; vector $F5 - OS2 $F6,vReadBM ; vector $F6 - OS2 $F7,vDoEject ; vector $F7 - OS2 $F8,vSegStack ; vector $F8 - OS2 $F9,vSuperLoad ; vector $F9 - OS2 $FA,vCmpFrm ; vector $FA - OS2 $FB,vNewMap ; vector $FB - OS2 $FC,vCheckLoad ; vector $FC - OS2 $FD,XTrimMeasure ; vector $FD - OS2 $FE,XFindWord ; vector $FE - OS2 $FF,XFindLine ; vector $FF - -;------------------------------------------------------------------------------ -; BT: End second OS table macro -;------------------------------------------------------------------------------ - endif - END diff --git a/OS/EgretMgr.a b/OS/EgretMgr.a index 9d457f5..fbfdd62 100644 --- a/OS/EgretMgr.a +++ b/OS/EgretMgr.a @@ -231,7 +231,7 @@ ErrEgretInit equ $0030 ; TEMPORARY definition of error equate defined in STEQ WITH EgretGlobals,EgretPB,RespHeader ; <60> rb ;=============================================================================================== -; Routine: InitEgret +; Routine: InitEgret 9bb0 ; ; Function: Allocates globals, sets vACR to shift in mode, sets up globals for an auto-response ; packet (ADB/Ticks). @@ -243,7 +243,7 @@ ErrEgretInit equ $0030 ; TEMPORARY definition of error equate defined in STEQ ; Destroys: a0-a2, d0-d2 ;________________________________________________________________________________________________ InitEgretOrCuda - moveq.l #EgretGlobSize,D0 ; get size of globals + move.l #EgretGlobSize,D0 ; get size of globals _NewPtr ,SYS,CLEAR ; allocate space on heap and clear move.l a0,EgretBase ; save ptr to it @@ -264,16 +264,19 @@ InitEgretOrCuda movea.l VIA,a1 ; point to the VIA eieioSTP bclr.b #SRdir,vACR(a1) ; shift reg direction = input + nop eieioSTP move.b #(1< Rolled in from PatchIIciROM.a @@ -356,7 +363,7 @@ EgretDispatch ; When the shift register irq comes in call the PollProc ; then process the shift register irq data ; - movem.l d0/d1/a0-a4/a6,-(sp) ; save some registers + movem.l d0-d3/a0-a4/a6,-(sp) ; save some registers move.l sp,PollStack ; Pointer to buffer for polled bytes @@ -403,7 +410,7 @@ EgretDispatch beq.s @NoPollWait -@NoSCCData movem.l (sp)+,d0/d1/a0-a4/a6 ; restore work registers +@NoSCCData movem.l (sp)+,d0-d3/a0-a4/a6 ; restore work registers @VsrIrq eieioSTP @@ -411,8 +418,10 @@ EgretDispatch eieioSTP bne.s @accepted ; no, then it will accept our packet bclr.b #SRdir,vACR(a1) ; yes, switch back to input + nop eieioSTP bclr.b #sysSes,vBufB(a1) ; ack the abort + nop eieioSTP bsr CallShiftRegIRQ ; handle it eieioSTP @@ -460,6 +469,7 @@ EgretDispatch _________________________________________________________________________________________________ CheckPacket +; 9ce2 cmp.b #SpecialPkt,pbCmdType(a0) ; could be an ADB initialization packet beq.s @OkExit @@ -503,7 +513,7 @@ CheckPacket ; Destroys: d0,d1 ;________________________________________________________________________________________________ PollByte - +; 9d26 move.w sr,d0 ; get 68xxx interrupt mask andi.w #hiIntMask,d0 ; are we at interrupt level? beq.s @exit ; no, just exit @@ -529,19 +539,24 @@ PollByte ; Destroys: d1 ;________________________________________________________________________________________________ SendByte +; 9d3a eieioSTP bclr.b #viaFull,vBufB(a1) ; negate via full + nop eieioSTP bsr.s Delay100 ; give Egret time to see it eieioSTP move.b d0,vSR(a1) ; send the byte to the shift reg + nop eieioSTP bset.b #viaFull,vBufB(a1) ; let Egret know it's there + nop eieioSTP rts ;________________________________________________________________________________________________ CallShiftRegIRQ +; 9d50 movem.l a0-a3/d0-d3,-(sp) ; save regs like interrupt handler does movea.l Lvl1DT+8,a0 ; get the shift reg IRQ handler jsr (a0) ; call it @@ -550,15 +565,43 @@ CallShiftRegIRQ ;________________________________________________________________________________________________ viaFullAck +; 9d60 eieioSTP bset.b #viaFull,vBufB(a1) ; acknowlege the byte + nop eieioSTP bsr.s Delay100 ; give Egret time to see it eieioSTP rts ; gets cleared on exit from IRQ handler ;________________________________________________________________________________________________ +NewDelay100 +; 9d6a + tst.l $13e + beq.s Delay100 + + btst.b #0, $bfe + beq.s Delay100 + + MoveM.L D0-D3/A0-A4/A6, -(SP) + Move.L SP, (PollStack) + MoveA.L (SCCRd), A3 + Move (TimeSCCDB), D1 + LsR #$3, D1 + BTst.B #$0, $2(A3) + BEQ.B (* + $6) + Move.B $6(A3), -(SP) + DBF D1, (* + -$C) + Nop + CmpA.L (PollStack), SP + BEQ.B (* + $C) + Lea.L $6(A3), A6 + Jsr ([$13E]) + MoveM.L (SP)+, D0-D3/A0-A4/A6 + Rts + Delay100 +; 9db2 move.l d1,-(sp) ; save d1 move.w timeViaDB,d1 ; 1 ms loop count lsr.w #3,d1 ; / 8 = 125 us @@ -575,7 +618,7 @@ Delay100 rts ;________________________________________________________________________________________________ -; Routine: ShiftRegIRQ +; Routine: ShiftRegIRQ 9dc8 ; ; Function: This routine is called in response to a VIA shift reg interrupt. It will transfer ; the next byte in the current packet. When the packet is complete, the globals are @@ -598,10 +641,12 @@ ShiftRegIRQ eieioSTP btst.b #SRdir,vACR(a1) ; see if VIA direction is output + nop eieioSTP beq.s @input ; no, then we're receiving.. tst.b vSR(a1) ; clear the shift reg interrupt + nop eieioSTP tst.w sendHdrCnt(a2) ; any bytes left in header? ble.s @ckSendData ; no, see if any send bytes left... @@ -627,10 +672,12 @@ ShiftRegIRQ eieioSTP bclr.b #SRdir,vACR(a1) ; now switch to input + nop @sendCmd eieioSTP andi.b #~((1< @@ -639,6 +686,7 @@ ShiftRegIRQ @input ;----------------------------------------------------------------------------- eieioSTP move.b vSR(a1),d0 ; read the byte from shift reg into D0 + nop eieioSTP tst.w rcvHdrCnt(a2) ; any bytes left in response packet header? ble.s @ckRcvData ; if not then must be data byte @@ -663,6 +711,7 @@ ShiftRegIRQ eieioSTP bne.s @done ; yes, we're through... bset.b #sysSes,vBufB(a1) ; make sure System Session is asserted <5> + nop eieioSTP bra @exitRd ; not done with header yet... exit @@ -679,6 +728,7 @@ ShiftRegIRQ bsr.s viaFullAck ; acknowlege the byte using via full <8> eieioSTP bclr.b #sysSes,vBufB(a1) ; yes, let Egret know we don't want more <8> + nop @wait eieioSTP btst.b #xcvrSes,vBufB(a1) ; wait for egret to acknowledge termination <8> @@ -717,10 +767,12 @@ ShiftRegIRQ @done eieioSTP bclr.b #viaFull,vBufB(a1) ; make sure via full is low + nop eieioSTP bclr.b #sysSes,vBufB(a1) ; let Egret know we're done + nop eieioSTP - bsr delay100 ; Give Egret time to see transitions & Poll SCC <13> + bsr newdelay100 ; Give Egret time to see transitions & Poll SCC <13> movea.l curPb(a2),a0 ; a0 points to current param block lea rcvHeader(a2),a1 ; a1 points to header buffer <11> @@ -864,6 +916,7 @@ ShiftRegIRQ @exitRd eieioSTP bclr.b #viaFull,vBufB(a1) ; make sure via full is low + nop eieioSTP move.w d3,sr ; restore interrupts @exit rts @@ -872,7 +925,7 @@ ShiftRegIRQ ;________________________________________________________________________________________________ -; Routine: SetTransferParams +; Routine: SetTransferParams 9fee ; ; Function: This routine sets up transmit/receive ptrs (globals) for the packet pointed to by A0, ; for use by the Shift Reg interrupt handler. @@ -984,7 +1037,7 @@ SetTransferParams rts ;________________________________________________________________________________________________ -; Routine: SetResponseParams +; Routine: SetResponseParams a0ac ; ; Function: This routine sets up transmit/receive ptrs (globals) for an auto response packet ; (e.g. ticks, ADB autopoll data), for use by the Shift Reg interrupt handler. @@ -1015,7 +1068,7 @@ SetResponseParams ; put back function banner ;________________________________________________________________________________________________ -; Routine: tickHandler +; Routine: tickHandler a0da ; ; Function: This is the completion routine for tick response packets. ; @@ -1093,6 +1146,7 @@ TickHandler ;________________________________________________________________________________________________ PseudoCntTable +; a0f8 dc.b $00, $00 ; 00 NoOperation send 0 bytes, receive 0 data bytes dc.b $01, $00 ; 01 StartStopAutopoll send 1 byte, receive 0 data bytes dc.b $02, $FF ; 02 Read6805 send 2 bytes, receive n data bytes @@ -1132,9 +1186,12 @@ PseudoCntTable dc.b $00, $00 ; 22 RdWrIIC send n bytes, receive n data bytes [rbm] dc.b $01, $00 ; 23 Set WakeUpMode send 1 bytes, receive 0 data bytes rb dc.b $01, $00 ; 24 Tickle PDM Timer send 1 bytes, receive 0 data bytes rb + dc.b $00, $00 + dc.b $01, $00 ADBCntTable +; a142 dc.b $00, $00 ; 0000 SendReset send 0 bytes, receive 0 data bytes dc.b $00, $00 ; 0001 Flush send 0 bytes, receive 0 data bytes dc.b $00, $00 ; 0010 send 0 bytes, receive 0 data bytes @@ -1158,669 +1215,8 @@ ADBCntTable Eject -;========================================================================= -; Routines: EgretInit -; -; This routine sends a NOP/WarmStart command to Egret. This routine is -; called early during rom Startup to stop autopoll and 1 sec irq. Also, -; the routine will issue a Send DFAC command to Egret to initialize the -; the DFAC hardware to a known state. The routine does not use ANY -; memory it is register driven only. -; -; NOTE: This routine actually sends a STOP AUTO POLL, SET ONE SECOND -; INTERRUPT MODE 0 call and a SEND DFAC command to Egret. -; The Stop Autopoll and set one second interrupt modes calls will -; be changed to a single NOP/WarmStart when Egret 3 becomes -; available (S/B 4/6/90). -; -; Inputs: NONE -; -; Outputs: NONE -; -; Destroys: D0, D1, D2, D3, A1, A5, A6, A4 (Egret 2 implementation) -; Destroys: D0, D3, A1, A5, A6 (Egret 3 implementation) -; -; NOTE: This routine is called via a BSR6 and returns via a RTS6 -;------------------------------------------------------------------------- - EXPORT EgretInit - -EgretInit movea.l DecoderInfo.VIA1Addr(a0),a1 ; get VIA 1 base address - eieioSTP - bclr.b #vSyssesbit,vBufB(a1) ; kill any pending transactions <8> <13> - eieioSTP - bclr.b #vViafullbit,vBufB(a1) ; <8> <13> - eieioSTP - moveq #$28,d0 ; we want to delay 4 millisecs -@killtime bsr5 delay100us ; in 100 usec increments - dbra d0,@killtime - move.l a6,a4 ; save the return address - - if rayFix then -; -; Send the Stop autopoll pseudo command -; - move.l #(APoll << 16) + PseudoPkt,d0 ; first command to send is Stop Auto Poll - moveq #0,d1 ; sending one byte of data $00 = stop autopoll - moveq #1,d2 - bsr6 SendEgretCmd ; send the command to Egret - tst.w d0 ; check for an error - bne.s @exit ; failed to send the command (hang timeout expired) -; -; Send the mode 0 1 second interrupt pseudo command -; - move.l #(Wr1SecMode << 16) + PseudoPkt,d0 ; mode 0 1 sec interrupts (stop 1 second irq) - moveq #0,d1 ; sending one byte of data - moveq #1,d2 - bsr6 SendEgretCmd ; send the command to Egret - tst.w d0 ; negative if error - bne.s @exit ; failed to send the command (hang timeout expired) - - else -; -; Send the NOP/WarmStart command -; - move.w #NopCmd,d0 ; Nop/WarmStart stops autopoll and 1 sec irq - swap d0 ; packet type Pseudo - move.w #pseudopkt,d0 - moveq #0,d2 ; no data to send - bsr6 SendEgretCmd ; send the command to Egret - tst.w d0 ; nonzero if error - bne.s @exit ; failed to send the command (hang timeout expired) - - endif - -; -; Send Elsie/Erickson initial DFAC setting -; - with ProductInfo - - moveq #0,d2 ; force full scan of hardware features <10> - bsr6 GetHardwareInfo ; get the ProductInfo Record <9> - btst.b #v8chipbit,ExtValid+3(a1) ; See if system has a VISA chip (bit7)<9><10> - beq.s @Erickson ; 0 = No Visa (Erickson) 1 = Visa (Elsie) <9> - - move.l #ElsieDFAC,d1 ; Assume running on Erickson (Not Elsie) <9> - bra.s @sendit - -@Erickson move.l #EricksonDFAC,d1 ; Erickson DFAC setting <9> -@sendit move.l #(WrDFAC << 16) + PseudoPkt,d0 ; Send DFAC command - moveq #1,d2 ; One byte to send - bsr6 SendEgretCmd ; send the command to Egret - tst.w d0 ; negative if error -@exit move.l a4,a6 ; restore return address - rts6 ; return to the caller - - endwith - - eject -************************************************************************************************************ -* SendEgretCmd: This register based routine will send up to four bytes of data to Egret. The -* packet type, command, byte count and data are passed in registers. The routine -* will return with d0.w = $0000 if it sent the command successfully. A value of -* $FFFF signifies that the command did not get through. The system and Egret hung -* and the system aborted the transaction. -* -* WARNING: This routine will not error check the transaction requested. It is the responsibility of -* WARNING: the caller to make sure that the packet type, command, data and data byte count are valid -* WARNING: for the transaction requested. Failure to follow the rules will make this routine fail and -* WARNING: CRASH the system. -* -* Input: -* a0.l Pointer to Base address table -* -* d0.l = High word PACKET Command -* Low word PACKET Type -* -* d1.l = Up to four bytes of data to send -* Long word data byte assigment = byte 4, byte 3, byte 2, byte 1 -* Byte 1 sent out first -* -* d2.l = Byte count to send. (0-4 bytes) -* Byte count > 4 will send four bytes only -* -* Output: d0.w $0000 if call succeeded, Nonzero if failed -* -* d1.l high word = flags, low word packet type returned by Egret -* -* Destroys: D2.l, D3.l, D4.l, A5.l, A4.l, A1.l -* -************************************************************************************************************ - - Export SendEgretCmd -SendEgretCmd - movea.l DecoderInfo.VIA1Addr(a0),a1 ; get VIA 1 base address rb, start - move.l #((MaxTout<<16) OR MaxRetries),d4 ; number of retries before giving up with Egret <13> - bsr5 Delay100us - eieioSTP - btst.b #vsysSesBit,vBufB(a1) ; check for a transaction in progress - eieioSTP - beq.s @AllOK - -@Timeout - eieioSTP - bclr.b #vsysSesBit,vBufB(a1) ; kill the rest of the transaction <8> - eieioSTP - bclr.b #vViaFullBit,vBufB(a1) ; <8> - eieioSTP - bsr5 Delay100us ; in progretss <8> - bsr5 Delay100us ; <8> - -@AllOK swap.w d4 ; timeout in low word of d4 Retry count in high word <13> - eieioSTP - btst.b #vxcvrSesBit,vBufB(a1) ; check for abort pending - eieioSTP - beq IrqMissed ; MIssed Vsr Irq because of INITVIAS - bset #vsysSesBit,vBufB(a1) ; assert sysSesBit - eieioSTP - bsr5 @SendPtype ; send the packet type - beq RealAbort ; Discard Aborting transaction rb, end -; -; If not abort transaction in progress then send the command byte -; - swap d0 - bsr5 sendByte1 ; send the command byte - bsr5 delay100us ; give Egret time to see viaEmpty -; -; Now send number of bytes contained in d1 based on -; byte count contained in d2.w -; - move.l d1,d0 ; get the data to send - subq #1,d2 ; adjust for DBRA - cmp.w #3,d2 ; if count out of range quit - bhi.s @EndCmd ; if count valid then adjust for dbra -@sendloop bsr5 sendByte1 - bsr5 delay100us - lsr.l #8,d0 ; move data byte to low byte of register -@loopEntry dbra d2,@sendloop ; decrement byte count -; -; Wait for the response packet header -; -@EndCmd - eieioSTP - bclr.b #SRdir,vACR(a1) ; shift in - eieioSTP - bclr.b #vSyssesbit,vBufB(a1) ; negate vSyssesbit - eieioSTP - bsr5 Delay100us -; -; Now receive the Standard Response packet Header -; - bsr5 readAttn ; get the Attention byte - eieioSTP - bsr5 Delay100us - eieioSTP - bset.b #vSyssesbit,vBufB(a1) ; assert vSyssesbit - eieioSTP - bsr5 readByte ; get the packet type - and #$00FF,d0 ; keep low byte only - swap d0 ; save the packet type - bsr5 readByte ; get the flags byte - and.w #$00FF,d0 ; keep low byte only - swap d0 ; keep the flags byte as an error code - exg d0,d1 ; save the packet type and flags returned - bsr5 readByte ; get the command - eieioSTP - bclr.b #vSyssesbit,vBufB(a1) ; negate vSyssesbit - eieioSTP - bsr5 Delay100us -; -; Check for an error packet returned by Egret -; - move.l d1,d0 ; save the packet type and flags - cmp.b #errorpkt,d0 ; check for error packet - beq.s @Exit ; error pkt then just exit - sub.w d0,d0 ; zero for success -@exit rts6 - ;-------------------------------------------------------------------------- -@SendPtype ; <2> - eieioSTP - bset.b #SRdir,vACR(a1) ; shift out - eieioSTP - btst.b #vXcvrsesbit,vbufB(a1) ; check for abort - eieioSTP - beq.s @AbortReq ; go away if abort requested - move.b d0,vSR(a1) ; load byte into shift reg - eieioSTP - bset.b #vViafullbit,vBufB(a1) ; indicate shift reg is full - eieioSTP -; -; Check Vsr Irq until timeout. If timeout then check the retry count -; and Call Death Chimes if Retry count exausted. -; -@PollDelay - eieioSTP - btst.b #ifSR,vIFR(a1) ; wait for shift to complete - eieioSTP - bne.s @VsrIrq ; Go service Shift register Irq <13> - dbra.w d4,@PollDelay ; try again if timed out <13> rb - move.w #MaxTout,d4 ; Reset the Timeout <13> rb - swap.w d4 ; get the Retry count <13> rb - subq.w #1,d4 ; Try again if Retry count not Exausted <13> rb - beq.s @Timeout ; <13> - -@DeadEgret move.w #ErrEgretInit,d7 ; Egret failed <13> - move.l #0001,d6 ; d6.l must be nonzero <13> - bigjmp Error1Handler,a3 ; Play death chimes <13> - -@VsrIrq - eieioSTP - tst.b vSR(a1) ; clear the interrupt - eieioSTP - bclr.b #vViafullbit,vBufB(a1) ; now indicate shift reg empty - eieioSTP -; -; Delay 100 usec -; - move.w #DelayCnt,d3 -@wait20 - eieioSTP - tst.b (a1) ; sync to VIA clock - eieioSTP - dbra d3,@wait20 ; delay at least 100 us (very rough) - eieioSTP - btst.b #vXcvrsesbit,vbufB(a1) ; check for abort - eieioSTP -@AbortReq rts5 - -;-------------------------------------------------------------------------- -; DumpAbort This routine will read all the data for an abort transaction and -; discard it. When done it will jump back to SendNopCmd entry point -; to retry our command. This command will eventually complete... - -RealAbort - eieioSTP - bclr.b #vSyssesbit,vBufB(a1) ; deassert system session - eieioSTP -IrqMissed bsr5 Delay100us ; Let Egret see SysSes. ³ 125µsec - eieioSTP - bclr.b #SRdir,vACR(a1) ; shift in - eieioSTP - tst.b vSR(a1) ; discard the byte - eieioSTP - bset #vSyssesbit,vBufB(a1) ; assert vSyssesbit - eieioSTP - -DumpAbort - - eieioSTP - bclr #vViafullbit,vBufB(a1) ; then negate VIA full bit - eieioSTP - -@loop - eieioSTP - btst.b #ifSR,vIFR(a1) ; wait for shift to complete - eieioSTP - beq.s @loop - bset.b #vViafullbit,vBufB(a1) ; acknowlege byte - eieioSTP - tst.b vSR(a1) ; discard the byte - eieioSTP -; -; Delay 100 usec -; - move.w #DelayCnt,d3 -@wait - eieioSTP - tst.b (a1) ; sync to VIA clock - dbra d3,@wait ; delay at least 100 us (very rough) - eieioSTP - btst.b #vXcvrsesbit,vBufB(a1) ; check for last byte - eieioSTP - beq.s DumpAbort ; Clock Tick Packets only 2 bytes -; -; Last byte was read -; - bclr #vViafullbit,vBufB(a1) ; then negate VIA full bit - eieioSTP - bclr.b #vSyssesbit,vBufB(a1) ; negate vSyssesbit - eieioSTP - bsr5 Delay100us ; delay 200 usec - bra.s SendEgretCmd ; go try sending our command again - -;-------------------------------------------------------------------------- -sendByte1 ; <2> - eieioSTP - bset.b #SRdir,vACR(a1) ; shift out - eieioSTP - move.b d0,vSR(a1) ; load byte into shift reg - eieioSTP - bset.b #vViafullbit,vBufB(a1) ; indicate shift reg is full - eieioSTP -@poll - eieioSTP - btst.b #ifSR,vIFR(a1) ; wait for shift to complete - eieioSTP - beq.s @poll - tst.b vSR(a1) ; clear the interrupt - eieioSTP - bclr.b #vViafullbit,vBufB(a1) ; now indicate shift reg empty - eieioSTP - rts5 - -;-------------------------------------------------------------------------- -readByte - eieioSTP - btst.b #ifSR,vIFR(a1) ; wait for shift to complete - eieioSTP - beq.s readByte - bset.b #vViafullbit,vBufB(a1) ; Tell Egret we saw the byte - eieioSTP - move.b vSR(a1),d0 ; read the byte -; -; Delay 100 usec -; - eieioSTP - move.w #DelayCnt,d3 -@wait - eieioSTP - tst.b (a1) ; sync to VIA clock - eieioSTP - dbra d3,@wait ; delay at least 100 us (very rough) - eieioSTP - bclr #vViafullbit,vBufB(a1) ; then negate VIA full bit - eieioSTP - rts5 - -;-------------------------------------------------------------------------- -readAttn - eieioSTP - - btst.b #ifSR,vIFR(a1) ; wait for shift to complete - eieioSTP - beq.s readAttn - eieioSTP - tst.b vSR(a1) ; clear the interrupt - eieioSTP - rts5 - -;-------------------------------------------------------------------------- -delay100us - move.w #DelayCnt,d3 -; add.w d3,d3 ; let's make it even rougher -@wait - eieioSTP - tst.b (a1) ; sync to VIA clock - eieioSTP - dbra d3,@wait ; delay at least 100 us (very rough) - eieioSTP - rts5 - -;_______________________________________________________________________ -; -; Routine: EclipsePDMPatch -; -; Desc: Patch for ECLIPSE PowerDown Messsage Handler Install -; and PowerDown Message Enable -;_______________________________________________________________________ - - EXPORT EclipsePDMPatch -EclipsePDMPatch - WITH EgretPB -; -; Initialize the Eclipse PowerDown Message handler. -; - movem.l a0-a1,-(sp) ; work registers - suba.l #EgretPbSize,sp ; make room for PB - move.l sp,a0 ; point a0 to pbBuffer - move.w #(PDMVectPkt << 8),pbCmdType(a0); InitPDM Vector Packet (Cmd ignored) - clr.l pbCompletion(a0) ; No Completion - lea KeySwitchHandler,a1 ; address of keyswitch sense handling - move.l a1,PbParam(a0) - _EgretDispatch - -; ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ -; We don't want to enable messages where we set up the Power Down Message Handler. This is because -; up until the time a system is located to boot from, when the user turns the keyswitch OFF, there -; are no files to flush, no volumes to unmount and Caboose can safely turn the machine off with us -; getting in the way. Once we get a system loaded, we'll enable Power Down Messages with the other -; routine, EclipsePDEPatch() (see below). -; ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ - -; We need to allocate a TimeMgr TMTask record that we can use once we enable power down messages so -; we can power the machine down even if UnMounts fail or hang. ExpandMemRec has JUST been initialized -; when this patch gets called, so this is safe to do. - - WITH ExpandMemRec - - movea.l expandMem,a1 ; get base of ExpandMemRec - moveq.l #(tmQSize+dtQElSize),d0 ; request a TimeMgr TMTask+Deferred Task-sized record in SysHeap - _NewPtr ,SYS,CLEAR ; - move.l a0,emKeyTMTaskPtr(a1) ; save pointer to TMTask record in ExpandMemRec - ENDWITH - adda.l #EgretPbSize,sp ; discard the parameter block - movem.l (sp)+,a0-a1 ; restore registers -@EgretDone - - rts ; Return to Caller - -;_______________________________________________________________________ -; -; Eclipse Keyswitch Handler -; ------------------------- -; -; This routines either -; (1) turns off Eclipse, or -; (2) catches and ignores keyswitch changes interrupts -; from Caboose, since we look directly at the keyswitch -; position values on VIA2[PB][v2Keyswitch] or [v2PowerOff]. -; -; As of DVT hardware, the values of these keyswitch positions -; should be available on VIA2 and no longer need to be maintained -; in SW. -;_______________________________________________________________________ -; -; PowerDown Message Handler -; - export KeySwitchHandler ; - import EgretPowerOff ; from EgretPatches.a - -KeySwitchHandler ; Handler of Power Down / Keyswitch Sense messages - -; Caboose sends a message whenever the keyswitch sense changes. thru next -; -; Input: D0.B Keyswitch position -; -; 0 OFF -; 1 Secure -; 2 Insecure or ON ("normal") -; - - tst.b d0 ; check for PowerOff message - bne.s @rts ; IF Message == PowerDOWN THEN - - movem.l a0-a1,-(sp) ; save A0, A1 thru next - -; First, install a time manager task that will forcefull shut us down in 5 seconds. That way, -; in case something goes wrong with the deferred task, we will shut off anyway. - - WITH ExpandMemRec - - movea.l expandMem,a1 ; get base address of ExpandMemRec - movea.l emKeyTMTaskPtr(a1),a0 ; retrieve "final" Time Mgr queue element - movea.l a0,a1 ; use A1 to clear the record - moveq.l #((tmQSize+dtQElSize)/2)-1,d0 ; clear the TimeMgr+DeferredTask queue elements -@clrRec clr.w (a1)+ ; just in case someone has crapped them up - dbra d0,@clrRec - lea PullThePlug,a1 ; get address of where to go when timer expires - move.l a1,tmAddr(a0) ; tell the TimeMgr about it - _InsTime ; go install the Turn Off The Power Time Mgr task - move.l #(5*1000),d0 ; set timeout to be 5 SECONDS - _PrimeTime ; activate the task - -; Now install the Deferred Task that will attempt to unmount all mounted volumes. -; -; The ExpandMemRec Ptr points at an area that is tmQSize+dtQSize bytes big. -; -; Initialize the Deferred Task queue element to point at our Unmount Volumes Deferred Task. - - adda.w #tmQSize,a0 ; move A0 to point at the Deferred Task Queue Element - move.w #dtQType,dtType(a0) ; and initialize the record - lea EclipseAdios,a1 - move.l a1,dtAddr(a0) - jsr ([jDTInstall]) ; go install our Unmount and Shutdown deferred task - movem.l (sp)+,a0-a1 ; restore A0, A1 - tst.w d0 ; see whether or not deferred task install was done - bne.s PullThePlug ; if it failed, shut down RIGHT NOW -@rts rts ; if it was successful, return to the int. handler - - ENDWITH - -;_______________________________________________________________________ -; -; Routine: EclipseAdios -; -; Desc: Deferred Task installed when the keyswitch is turned -; to the OFF position. This attempts to Unmount all -; volumes. Once that attempt has been made, the system -; is powered down. -; -; Inputs: None. -; Returns: None. -; Trashes: The System. Power to Eclipse is turned off. G'night. -; -;_______________________________________________________________________ - -EclipseAdios - -; Try and unmount any mounted volumes before we power down. - - move.l VCBQHdr+qHead,a1 ; Start at the head of the VCBQ - bra.s @checkVCB ; Check if valid -@UMloop - tst.w vcbFSID(a1) ; Make sure itÕs FSID = 0 - bne.s @nextQEntry ; ... i.e. not a server - -; Try to unmount the volume. - - sub.w #ioQElSize,a7 ; get an I/O param block - movea.l a7,a0 - - move.w vcbVRefNum(a1),ioVRefNum(a0) ; stuff VCB VRefNum into PB - move.l #0,ioFileName(a0) - move.l #0,ioCompletion(a0) ; no completion routine - move.l a1,-(sp) ; save A1 (queue link ptr) - _HUnmountVol ; attempt to forcefully unmount volume - movea.l (sp)+,a1 ; restore A1 - adda.w #ioQElSize,a7 ; get rid of PB. we'll reallocate the PB if needed - -@nextQEntry movea.l qLink(a1),a1 ; get next queue entry -@checkVCB move.l a1,d0 ; at EOQ yet? - bne.s @UMloop ; nope, try this one - -PullThePlug ; ENDIF - bsr.l EgretPowerOff ; power junkies go into sudden withdrawl - bra.s PullThePlug ; with no hope of recovery - -;_______________________________________________________________________ -; -; Routine: EclipseDFACPatch -; -; Desc: Patch for ECLIPSE send default DFAC Messsage -;_______________________________________________________________________ - EXPORT EclipseDFACPatch - -EclipseDFACPatch -; -; Build a Parameter block for the default DFAC message -; - movem.l a0-a1,-(sp) ; work register - suba.l #EgretPbSize,sp ; make room for PB - move.l sp,a0 ; point a0 to pbBuffer - move.w #(pseudoPkt << 8) \ - + SetDefDFAC,pbCmdType(a0) ; InitPDM Vector Packet (Cmd ignored) - clr.l pbCompletion(a0) ; No Completion -; -; Build the DFAC message issue the call and clean up -; - move.w #$0100,-(sp) ; byte count and one DFAC byte in buffer - move.l sp,pbBufPtr(a0) ; Buffer pointer - move.w #$0002,pbByteCnt(a0) ; byte count includes the byte count byte in the buffer - _EgretDispatch - adda.l #EgretPbSize+2,sp ; discard the parameter block and data buffer - movem.l (sp)+,a0-a1 -@EgretDone - rts ; Return to Caller - -;_______________________________________________________________________ thru next -; -; Routine: DebugUtilRunKbdPatch -; -; Desc: Checks to see if the machine we're running on has a -; keyswitch, and if so, if it's in the OFF position. -; If so, then we probably don't have any choice as to -; whether volumes can be flushed and unmounted, so we -; go directly to the PowerOff routine. Do not pass Go, -; do not collect $200. (is that 200 hex dollars?) -; -; NOTE: This handles both the DebugEnter _and_ DebugPoll cases. -;_______________________________________________________________________ - - EXPORT DebugUtilRunKbdPatch ; provide address to InterruptHandlers.and anyone else -DebugUtilRunKbdPatch - - TestFor KeyswCabooseBit ; do we have a caboose? <21> - beq.s @justDoIt ; nope <21> - -; If you made it here, you're a Caboose-flavor keyswitch. -; -; VIA2 has v2PowerOff and v2Keyswitch (SECURE mode) wired, with 0=TRUE. - - move.l a1,-(sp) ; save A1 temporarily - movea.l VIA2RBV,a1 ; retrieve address of VIA2 - eieioSTP - btst.b #v2PowerOff,VBufB(a1) ; is the keyswitch OFF? - eieioSTP - move.l (sp)+,a1 ; restore A1 - beq.s @powerOff ; IF Keyswitch != OFF THEN -@justDoIt - bra DebugPwrMgrADBPatch2 ; check for PowerMgr stuff -@powerOff ; ELSE - bra.s PullThePlug ; administer the death blow - -DebugPwrMgrADBPatch2 - TestFor hwCbPwrMgr ; see if we have a power manager - beq.s @noPmgrADB ; if not, skip it - - movea.l VIA,a1 ; point to the VIA - movea.l Lvl1DT+(ifCB1*4),a0 ; get the handler address - jsr (a0) ; call the interrupt handler - addq.l #4,SP ; clean up stack from bsr - movem.l (sp)+,d3/a3 ; restore registers - rts -@noPmgrADB - rts - -;_______________________________________________________________________ -; -; Routine: EgretDFACandPDM formerly: EclipseEgretPatches -; -; Desc: Calls egret patches for Eclipse with Caboose, keyswitch -; Calls Egret patches for Anyone with Cuda, SoftPower Off -;_______________________________________________________________________ - - EXPORT EgretDFACandPDM - IMPORT CudaPDMPatch - -EgretDFACandPDM - - move.l #EgretFWMask, d0 ; get productInfo record mask for Egret FW - and.l UnivRomFlags,d0 ; isolate the field - sub.l #Caboose,d0 ; Do we have an Egret/Caboose? - bne.s @Done ; -> Nope. Don't do nothing! - - ; Instead of calling EclipseDFACPatch, this should more generally initialize DFAC - ; for all machines that care about it (or even if we don't but it needs it anyway). - ; -- bg/djw, 12/6/90 - -@EgretCaboose - bsr EclipseDFACPatch ; call the Eclipse DFAC control patch - bsr EclipsePDMPatch ; call the Eclipse keyswitch/PowerDown Msgs patch -@Done rts ; Return to Caller - - -;-------------------------------------------------------------------------- -;ChkFirmware +;ChkFirmware a166 ; ; This routine will determine if the Egret Chip is using Egret 8 or Caboose ; firmware or the new Cuda firmware. Based on this result, the IRQ handler, @@ -1837,16 +1233,6 @@ EgretDFACandPDM ChkFirmware ; movem.l a2/d0-d2, -(sp) ; preserve used regs - move.l #EgretFWMask,d0 ; mask for EgretFW - and.l UnivRomFlags,d0 ; isolate the field - sub.l #Egret8,d0 ; see if we have EgretFW - beq.s @haveEgret ; set Zero flag, exit - - ; If we dont have Egret FW, we still might have an Caboose FW - - sub.l #Egret8,d0 ; see if we have CabooseFW - beq.s @haveCaboose ; if we do, chk for Cuda - @haveCuda ; biglea CudaDispatch, a0 ; Cuda FW dispatcher move.l #$92,d0 ; set $92 trap @@ -1854,210 +1240,80 @@ ChkFirmware ; biglea CudaShiftRegIRQ,a0 ; stuff Cuda IRQ handler in biglea CudaTickHandler,a1 ; stuff Cuda tick handler in - bra.s @chkDone ; -@haveEgret -@haveCaboose - lea EgretDispatch, a0 ; Egret FW dispatcher - move.l #$92,d0 ; set $92 trap - _SetTrapAddress ,NEWOS ; - ; - lea ShiftRegIRQ,a0 ; stuff Egret IRQ handler in - lea tickHandler,a1 ; stuff Egret tick handler in @chkDone movem.l (sp)+, a2/d0-d2 ; restore used regs rts - -;-------------------------------------------------------------------------- -;SendEgretCmdPatch -; -; This routine will determine if the Egret Chip is using Egret 8 or Caboose -; firmware or the new Cuda firmware. From the firmware type, determine what -; routine to use, SendEgretCmd for Egret or Caboose, and SendCudaCmd for Cuda -; -; NOTE: This routine is REGISTER based, there isn't a stack -; SendEgretCmd is called via BSR6, so must Preserve A6, as the return address -; SendEgretCmdPatch is called via a BSR5 return is in A5 -; Input: -; a0.l Pointer to Base address table -; -; d0.l = High word PACKET Command -; Low word PACKET Type -; -; d1.l = Up to four bytes of data to send -; Long word data byte assigment = byte 4, byte 3, byte 2, byte 1 -; Byte 1 sent out first -; -; d2.l = Byte count to send. (0-4 bytes) -; Byte count > 4 will send four bytes only -; -;-------------------------------------------------------------------------- - -SendEgretCmdPatch - move.l a5, a3 ; preserve patch return addr - move.l a6, a4 ; preserve EgretInit rtn addr - bigbsr6 GetHardwareInfo,a1 ; - move.l a4, a6 ; restore EgretInitrtn addr - move.l a3, a5 ; restore patch rtn addr - moveq.l #ProductInfo.ADBMask,d0 ;mask for ADB kind <23> - and.l d1,d0 ;isolate the field <23> - subq.l #ProductInfo.ADBEgret,d0 ;see if we have Egret ADB <23> - - and.l #EgretFWMask,d4 ; isolate the field - sub.l #Egret8,d4 ; see if we have Egret8 FW - beq.s @patchdone ; if we do, zero flag set -; -; If we dont have Egret FW, we still might have an Caboose -; - sub.l #Egret8,d1 ; see if we have Caboose FW -@haveEgret ; if we do, zero flag set - beq.s @patchdone ; its Egret or Caboose, just exit... -@haveCuda ; - bigjmp SendCudaCmd,a3 ; jump to Cuda Send routine -@patchdone ; - movea.l DecoderInfo.VIA1Addr(a0),a1 ; get VIA 1 base address - move.l #((MaxTout<<16) OR MaxRetries),d4 ; number of retries before giving up with Egret <13> - rts5 - -;-------------------------------------------------------------------------- -;EgretInitPatch -; -; This routine will determine if the Egret Chip is using Egret 8 or Caboose -; firmware or the new Cuda firmware. From the firmware type, determine what -; routine to use, EgretInit for Egret or Caboose, and CudaInit for Cuda -; -; NOTE: This routine is REGISTER based, there isn't a stack -; EgretInit is called via BSR6, so must Preserve A6, as the return address -; EgretInitPatch is called via a BSR5 return is in A5 -; -EgretInitPatch ; - move.l a5, a3 ; preserve patch return addr - move.l a6, a4 ; preserve EgretInit rtn addr - bigbsr6 GetHardwareInfo,a1 ; - move.l a4, a6 ; restore EgretInitrtn addr - move.l a3, a5 ; restore patch rtn addr - - and.l #EgretFWMask,d1 ; isolate the field - sub.l #Egret8,d1 ; see if we have Egret8 FW - beq.s @patchdone ; if we do, zero flag set -; -; If we dont have Egret FW, we still might have an Caboose -; - sub.l #Egret8,d1 ; see if we have Caboose FW -@haveEgret ; if we do, zero flag set - beq.s @patchdone ; its Egret or Caboose, just exit... -@haveCuda ; - bigjmp CudaInit,a3 ; jump to CudaInit routine in CudaMgr.a -@patchdone ; - movea.l DecoderInfo.VIA1Addr(a0),a1 ; get VIA 1 base address - eieioSTP - bclr.b #vsysSesBit,vBufB(a1) ; kill any pending transactions <8> <13> - eieioSTP - bclr.b #vViaFullBit,vBufB(a1) ; <8> <13> - eieioSTP - rts5 - -TerrorEgret - - IMPORT ExplicitRequestDone, ImplicitRequestDone -;_______________________________________________________________________ -; -; Routine: StartReqEgret -; Inputs: D2 - length of transmit buffer data -; D3 - command byte / implicit flag (bit 31) -; A2 - pointer to buffer containing transmit data -; A3 - pointer to ADBBase -; -; Outputs: A3 - pointer to ADBBase -; -; Destroys: A0-A2/D0-D2 -; Calls: exits through _EgretDispatch -; -; Function: Sends an ADB request to the Egret, and asynchronously waits for a reply. -; -;_______________________________________________________________________ - - with ADBVars,EgretPB - - -jEgretDispatch equ OSTable+($92*4) ; OS trap table entry for _EgretDispatch - -StartReqEgret - tst.l d3 ; see if explicit/implicit - bmi.s @implicit ; if implicit, we generally don't need to do anything - -;_______________________________________________________________________ -; Process Explicit Requests - -@explicit bset.b #fDBExpRunning,fDBAuFlag(a3); explicit command starting, exclude new ones - bne.s @ignoreExplicit ; if already in progress, don't run it twice - move.b d3,ExplicitEPB.pbCmd(a3) ; setup the ADB command - move.w d2,ExplicitEPB.pbByteCnt(a3); setup byte count - move.l a2,ExplicitEPB.pbBufPtr(a3) ; setup buffer pointer - - bset.b #fDBExpInited,fDBAuFlag(a3) ; see if explicit command initialization has occured - bne.s @expInited ; if already inited, no need to change anything - - lea @ExplicitCompleted,a0 ; explicit request completion routine address - move.l a0,ExplicitEPB.pbCompletion(a3) ; setup buffer pointer - - lea ImplicitEPB(a3),a0 ; point to the param block used to wait for autopoll data - clr.l pbCompletion(a0) ; remove the handler - bsr.s @SendToEgret ; remove the auto poll handler - - move.l #(pseudoPkt<<24)\ ; pcCmdType := pseudoPkt - +(aPoll<<16)\ ; pbCmd := aPoll - +($00<<8),d0 ; pbParam := $00 (only high byte is used) - bsr.s @syncReq ; send command to stop auto polling -@expInited - - lea ExplicitEPB(a3),a0 ; point to the param block -@SendToEgret - moveq.l #0,d1 ; zero the trapword flag bits (in case they ever get used) - movea.l jEgretDispatch,a2 ; get the OSTrap table entry - jmp (a2) ; _EgretDispatch, issue the request (asynchronously), return - - -;_______________________________________________________________________ -; Process Implicit Requests - -@implicit btst.b #fDBInit,fDBFlag(a3); see if initialization is happening - bne.s @impDone ; if so, implicit commands are ignored - bset.b #fDBImpInited,fDBAuFlag(a3) ; see if implicit command initialization has occured - beq.s @InitImplicit ; if not inited, do initialization to allow autopolling -@ignoreExplicit -@impDone rts ; auto-polling/srq data will arrive unsolicited from now on - -@InitImplicit - lea ImplicitEPB(a3),a0 ; point to the param block used to wait for autopoll data - lea @ImplicitCompleted,a1 ; handler address - move.l a1,pbCompletion(a0) ; install the handler - bsr.s @SendToEgret ; install the auto poll handler - - move.l #(pseudoPkt<<24)\ ; pcCmdType := pseudoPkt - +(wrDevList<<16),d0 ; pbCmd := wrDevList - move.w DevMap(a3),d0 ; pbParam := DevMap (in first 2 bytes) - bsr.s @syncReq ; send command to specify auto polling addresses - - move.l #(pseudoPkt<<24)\ ; pcCmdType := pseudoPkt - +(aPoll<<16)\ ; pbCmd := aPoll - +($FF<<8),d0 ; pbParam := $FF (only high byte is used) - ; send command to start auto polling - -@syncReq suba.w #EgretPBSize,sp ; allocate a param block on the stack for a sync call - movea.l sp,a0 ; point to the param block - move.l d0,pbCmdType(a0) ; init pcCmdType, pbCmd, and high word of pbParam - clr.l pbCompletion(a0) ; no completion routine, sync call - bsr.s @SendToEgret ; call send the request off to the ADB micro - adda.w #EgretPBSize,sp ; deallocate the param block - rts ; auto-polling/srq data will arrive unsolicited from now on - Title 'KbdADB - ADB Manager - ExplicitCompleted' +NewEgretFunc +; a196 + Link A6, #-$14 + Move.L #$7000000, D0 + And.L (UnivROMFlags), D0 + CmpI.L #$3000000, D0 + BNE.B (* + $42) + MoveA.L A7, A0 + Move.B #$1, (A0) + Move.B #$2, $1(A0) + Clr.L $2(A0) + Move #$A1, $2(A0) + Move #$1, $6(A0) + Lea.L $4(A0), A1 + Move.L A1, $8(A0) + Clr $C(A0) + Clr $E(A0) + Clr.L $10(A0) + _EgretDispatch + Move.B #$8, $1(A0) + BClr.B #$5, $4(A0) + _EgretDispatch + Unlk A6 + Rts + Tst.L D3 + BMI.B (* + $44) + BSet.B #$2, $15E(A3) + BNE.B (* + $4C) + Move.B D3, $171(A3) + Move D2, $176(A3) + Move.L A2, $178(A3) + BSet.B #$0, $15E(A3) + BNE.B (* + $1C) + Lea.L @ExplicitCompleted, A0 + Move.L A0, $180(A3) + Lea.L $184(A3), A0 + Clr.L $10(A0) + Bsr.B (* + $E) + Move.L #$1010000, D0 + Bsr.B (* + $40) + Lea.L $170(A3), A0 + MoveQ.L #$0, D1 + MoveA.L ($648), A2 + Jmp (A2) + BTst.B #$5, $15D(A3) + BNE.B (* + $A) + BSet.B #$1, $15E(A3) + BEQ.B (* + $4) + Rts + Lea.L $184(A3), A0 + Lea.L (* + $9A), A1 + Move.L A1, $10(A0) + Bsr.B (* + -$26) + Move.L #$1190000, D0 + Move $14E(A3), D0 + Bsr.B (* + $8) + Move.L #$101FF00, D0 + SubA #$14, A7 + MoveA.L A7, A0 + Move.L D0, (A0) + Clr.L $10(A0) + Bsr.B (* + -$46) + Lea.L $14(A7), A7 + Rts ;_______________________________________________________________________ ; -; Routine: @ExplicitCompleted +; Routine: @ExplicitCompleted a27c ; Inputs: A0 - Pointer to the EgretPB of the Explicit Request ; ; Outputs: D2 - length of receive buffer data @@ -2072,6 +1328,10 @@ StartReqEgret ; ;_______________________________________________________________________ + with ADBVars,EgretPB + + import ExplicitRequestDone, ImplicitRequestDone + @ExplicitCompleted ; A0 := pointer to EgretPB if EgretDebug then btst.b #EgAutoPoll,pbFlags(a0) ; see if this was from auto poll @@ -2145,7 +1405,7 @@ StartReqEgret ;_______________________________________________________________________ ; -; Routine: @ImplicitCompleted +; Routine: @ImplicitCompleted a2ec ; Inputs: A0 - Pointer to the EgretPB of the Implicit Request ; D0 - Number of data bytes returned (word, 0..8) ; A1 - Pointer to Flags, Command, Data Buffer @@ -2185,6 +1445,7 @@ StartReqEgret Export DebugEnterCont DebugEnterCont +a2fc with ProductInfo move.l UnivRomFlags,d0 ; get the Universal system flags @@ -2233,6 +1494,7 @@ DebugEnterCont Export DebugExitCont DebugExitCont +; a346 with ProductInfo move.l UnivRomFlags,d0 ; get the Universal system flags diff --git a/OS/Gestalt/Gestalt.make b/OS/Gestalt/Gestalt.make index 7dabc79..8472e6d 100644 --- a/OS/Gestalt/Gestalt.make +++ b/OS/Gestalt/Gestalt.make @@ -18,8 +18,8 @@ GestaltObjs = "{ObjDir}GestaltFunction.a.o" "{ObjDir}GestaltLookup.c.o" ¶ "{ObjDir}GestaltExtensions.a.o" -"{LibDir}Gestalt.lib" Ä {GestaltObjs} - Lib {StdLibOpts} -o "{Targ}" {GestaltObjs} +# "{LibDir}Gestalt.lib" Ä {GestaltObjs} +# Lib {StdLibOpts} -o "{Targ}" {GestaltObjs} "{ObjDir}GestaltFunction.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/OS/HFS/HFS.make b/OS/HFS/HFS.make index b9c1939..e2f6042 100644 --- a/OS/HFS/HFS.make +++ b/OS/HFS/HFS.make @@ -45,8 +45,8 @@ HFSObjs = "{LibDir}BTreeMgr.lib" "{ObjDir}DiskCache.a.o" -"{LibDir}HFS.lib" Ä {HFSObjs} - Lib {StdLibOpts} -o "{Targ}" {HFSObjs} +# "{LibDir}HFS.lib" Ä {HFSObjs} +# Lib {StdLibOpts} -o "{Targ}" {HFSObjs} "{ObjDir}BTAlloc.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/OS/HwPriv.a b/OS/HwPriv.a index 46389ba..40d63da 100644 --- a/OS/HwPriv.a +++ b/OS/HwPriv.a @@ -329,18 +329,22 @@ Vects ;table of offsets to selector routines HwPrivSelector DisableExtCache ; 5 DisableExtCache HwPrivSelector FlushExtCache ; 6 FlushExtCache HwPrivSelector SwapSerialClock ; 7 SwapSerialClock - HwPrivSelector ProtectEDisk ; 8 Protect/Unprotect EDisk +; HwPrivSelector ProtectEDisk ; 8 Protect/Unprotect EDisk + dc.w $d8b8 ; HARDCODED due to unhappy linker, must remove HwPrivSelector FlushCRange ; 9 FlushCRange - HwPrivSelector WaitForSCSIDevs ; 10 WaitForSCSIDevs + HwPrivSelector ReturnErr ; 10 WaitForSCSIDevs HwPrivSelector ReturnErr ; 11 Unused HwPrivSelector SlotBlockXferCtl ; 12 - enable block xfers to a slot - HwPrivSelector GetENetID ; 13 - Get Ethernet ID from serial ROM + HwPrivSelector ReturnErr ; 13 - Get Ethernet ID from serial ROM + HwPrivSelector ReturnErr ; 14 + HwPrivSelector ReturnErr ; 15 + HwPrivSelector MakeSomethingWriteThrough ; 16 LastVec ALIGN 8 HWPrivSwitch cmpi.w #(LastVec-Vects)/HwVecSize,d0 ; check if selector in range - bhs ReturnErr ; abort if itÕs not a valid selector + bcc.s ReturnErr ; abort if itÕs not a valid selector move.w Vects(d0*HwVecSize),d0 ; get offset to selectorÕs routine jmp Vects(d0) ; go to the routine @@ -354,7 +358,6 @@ ReturnErr PROC ENTRY ENDPROC - ;---------- ; ; SwapICache (_HWPriv Selector 0) @@ -376,37 +379,6 @@ ReturnErr PROC ENTRY SwapICache PROC EXPORT - TestFor has68kEmulator ; are we on a PPC-based machine? - bnz.b @EmuFake - - cmp.b #cpu68040,CpuFlag ; are we on an 040-based machine? - bhs.s @handle040 - -@handle030 - movec CACR,d0 ; get current cache state - bfextu d0{31:1},d1 ; get cache enable bit into LSbit of d1 - bclr #CACR_EI_020_030,d0 ; assume we're disabling (clear enable flag) - move.l a0,d2 ; see what we want to do - beq.s @SetCACR ; if we want to turn it on - ori.b #((1< nope, just blow it all off - subq #4,sp ; make room for result - move.l #dockCacheControl,-(sp) ; cache control selector - move.l #dockCacheOn,-(sp) ; indicate the cache should be turned on - _DockingDispatch - addq #4,sp ; remove the result (assume success) - - IF hasMDU THEN - bra.s @extCacheDone -@noDockMgr - - movea.l UnivInfoPtr,a0 ; point to the product info - cmpi.b #DecoderKinds.MDUDecoder,\ - ProductInfo.DecoderKind(a0) ; see if we have an MDU - bne.s @noMDU ; if not, nothing to enable - -; enable the external MDU cache as follows: -; Toggle the RvCFlush bit 1 - 0 - 1, to flush the cache -; set the RvCDis bit to 0, to enable the cache (special restriction, can't access cacheable -; memory for some amount of time after enableing the cache. By executing this code in -; a loop, it will be executing out of the instruction cache, and not accessing memory) - - movea.l VIA2RBV,a0 ; get the VIA2 or RBV base address - lea vBufB|RvDataB(a0),a0 ; point to the cache register - - move.w sr,-(sp) ; save int mask - ori.w #HiIntMask,sr ; disable all interrupts - - moveq.l #~(1< nope, just blow it all off - subq #4, sp ; make room for result - move.l #dockCacheControl, -(sp) ; cache control selector - move.l #dockCacheOff, -(sp) ; indicate the cache should be turned on - _DockingDispatch - addq #4,sp ; remove the result (assume success) - - IF hasMDU THEN - bra.s @extCacheDone -@noDockMgr - - movea.l UnivInfoPtr,a0 ; point to the product info - cmpi.b #DecoderKinds.MDUDecoder,\ - ProductInfo.DecoderKind(a0) ; see if we have an MDU - bne.s @noMDU ; if not, nothing to enable - - movea.l VIA2RBV,a0 ; get the VIA2 or RBV base address - lea vBufB|RvDataB(a0),a0 ; point to the cache register - ori.b #(1< A0[7-0] = bit map of SCSI IDs to wait for -; -> A0[23-16] = bit map of SCSI IDs to search for -; -; On Exit: -; <- A0 = result (0=found wait_for drives, -1=didn't find them) -; -; Register Usage: -; D0 = temp -; D1 = bitmap of devices to wait for -; D2 = bitmap of devices to search for -; D3 = OS Type (for SCSILoad) -; D4 = Ticks at timeout -; -;---------- - -WaitForSCSIDevs PROC EXPORT - - IMPORT SCSILoad - -trashedRegs REG D2-D4/D6 - -DefaultTimeOut EQU 20 ; Number of seconds timeout if PRAM is pristine -PollDelay EQU 15 ; Delay (in ticks) between SCSILoads - - movem.l trashedRegs, -(sp) ; save registers that we're going to trash - -; Get bitmap parameters into D1 and D2 - move.l A0, D1 ; D1 = bitmap of devices to wait for - move.l D1, D2 ; - swap D2 ; D2 = bitmap of devices to search for - or.b D1, D2 ; make sure that we search for the drive(s) - ; that we are waiting for - -; SCSILoad expects OS type in high word of D3 - subq.w #2, sp ; Make room for parameters. - move.l sp, A0 ; Point to the parameter block. - _GetOSDefault ; Get info about the default device. - ; leave OS results on stack for a second - -; Get PRAM time out value and convert it to ticks and keep in D4 - _GetTimeOut ; Get the timeout parameter. - bne.s @UseGivenTime ; Branch if not using default. - moveq.l #DefaultTimeOut, D0 ; Use default timeout. -@UseGivenTime - mulu #60, D0 ; Convert timeout to ticks. - move.l D0, D4 ; Save timeout in our final reg. - - move.w (sp)+, D3 ; Get OS type off of stack - swap D3 ; put in high word (where SCSILoad expects it) - - moveq.l #0, D6 - bset #31, D6 ; tell drivers not to munge the blasted heap - -; SCSILoad polling loop ------- - -@TopO_TheLoop - move.l D2, D0 ; Try to load drivers for the "search" disks - bsr.l SCSILoad - - move.b SCSIDrvrs, D0 - and.b D1, D0 ; look only at bits we are waiting for - cmp.b D1, D0 ; if all are 1 then - beq.s @goodexit ; we got what we were waiting for - exit - -; Check for timeout, wait for PollDelay more ticks, check timeout again, then do the SCSILoad again - move.l Ticks, D0 - cmp.l D4, D0 ; is current ticks higher than our time_out ticks? - bhi @fldexit ; yes - timed out, exit - - add.l #PollDelay, D0 ; wait till Ticks+PollDelay before polling -@1 cmp.l Ticks, D0 ; if polldelay timeout is higher than current ticks, - bhi @1 ; then loop - - cmp.l D4, D0 ; is current ticks higher than our time_out ticks? - blo @TopO_TheLoop ; no - repeat SCSILoad - ; yes - timed out, exit -@fldexit - move.w #-1, A0 - bra.s @exit - -@goodexit - move.w #0, A0 -@exit - movem.l (sp)+, trashedRegs ; restore registers that we trashed - rts - - ENDPROC - - ;---------- ; ; SlotBlockXferCtl (_HWPriv Selector 12) @@ -1051,117 +637,38 @@ PollDelay EQU 15 ; Delay (in ticks) between SCSILoads SlotBlockXferCtl PROC EXPORT - MoveQ.l #paramErr, D0 ; assume don't have MUNI or bad slot value passed - Testfor BARTExists ; are we on a ColdFusion or PDM - bne.s @bart - TestFor MUNIExists ; Do we have the MUNI Nubus controller - Beq.s @exit ; No, we're done. - - MoveA.l UnivInfoPtr, A1 ; point to the product info - Add.l ProductInfo.DecoderInfoPtr(A1), A1 ; get decoder info ptr - MoveA.l DecoderInfo.MUNIAddr(A1), A1 ; get MUNI base address - - Move.l A0, D1 ; get user parm - MoveQ #0, D2 - Move.l MUNI_BlkAttmpt(A1), D2 ; get previous state of slots 1-14 - Lsl.w #1, D2 ; make bit x match slot x, bit 1 = slot 1 - MoveA.l D2, A0 ; return previous state bit mask in A0 - - MoveQ #0, D2 - Move.b D1, D2 ; Get slot # - SubQ.b #1, D2 ; adjust slot # for bit offset - Bmi.s @exit ; bad slot value, < 1 - Cmp.b #14, D2 - Bhs.s @exit ; bad slot value, > 14 - Move.l MUNI_BlkAttmpt(A1), D0 ; get current state of slots 1-14 - BTst #8, D1 ; Turn blk xfer on or off? - Bne.s @on - BClr D2, D0 ; turn if off - Bra.s @doit -@on BSet D2, D0 ; turn if on -@doit Move.l D0, MUNI_BlkAttmpt(A1) ; setup block xfers for slot # in D2 - bra.s @done - -@bart - MoveA.l UnivInfoPtr, A1 ; point to the product info - Add.l ProductInfo.DecoderInfoPtr(A1),A1 ; get decoder info ptr - MoveA.l DecoderInfo.BARTAddr(A1),A1 ; get Bart base address - - Move.l A0, D1 ; get user parm - MoveQ #0, D2 - Move.b D1, D2 ; Get slot # - SubQ.b #1, D2 ; adjust slot # for bit offset - Bmi.s @exit ; bad slot value, < 1 - Cmp.b #14, D2 - Bhs.s @exit ; bad slot value, > 14 - BTst #8, D1 ; Turn blk xfer on or off? - Bne.s @Bon - - moveq #BARTBurstRegOff, d0 - mulu.l d2, d0 - adda.l #BARTBurstReg,a1 - suba.l d0, a1 - bclr.b #BARTBurstBit, (A1) ; turn off block xfers for slot # in D2 - Bra.s @done - -@Bon moveq #BARTBurstRegOff, d0 - mulu.l d2, d0 - adda.l #BARTBurstReg,a1 - suba.l d0, a1 - bset.b #BARTBurstBit, (A1) ; turn on block xfers for slot # in D2 - -@done MoveQ #noErr,D0 ; signal all's well - -@exit Rts + moveq #paramErr,D0 + rts ENDPROC ;---------- ; -; GetENetID (_HWPriv Selector 13) -; -; This routine gets the EtherNet ID from a serial-interface EtherNet ID ROM. -; On all machines except Blackbird (so far), the Ethernet ID is in a memory-mapped -; parallel ROM. When this routine runs on those machines, a0 should already -; contain a valid address at which to read the ethernet ID, so this routine -; will just exit for those machines. If there is no address in a0, we double check -; here to make sure we are on a Blackbird (by checking for Pratt), and then -; go ahead and try to get the Ethernet ID from the serial ROM. -; -; Entry: -; -; A0.l - ENetPROM field of the EtherNet Driver (address of ID ROM, or -; zero for an ID ROM that is not memory-mapped). -; -; Exit: -; -; A0.l - non-zero pointer to EtherNet ID -; - ID = 0 if we can't get address from ID ROM -; -; Destroys: D1, D2, A1 +; MakeSomethingWriteThrough ; ;---------- -GetENetID PROC EXPORT +MakeSomethingWriteThrough PROC EXPORT - IMPORT X24c01aGetID + Move.L ([$1FF4],$8), D2 + Move.L A0, D0 + LsR.L D2, D0 + MoveA.L D0, A0 + Move.L A1, D0 + SubQ.L #$1, D0 + LsR.L D2, D0 + Move.L D0, D2 +@loop + _nkMakePageWriteThrough + Tst.L D0 + BMI.B @exit + AddQ #$1, A0 + DBF D2, @loop + MoveQ.L #$0, D0 +@exit + Rts - WITH PMgrRec, PmgrPrimitivesRec - - IF hasPratt THEN - TestFor PrattExists ; do we have a Pratt? - beq.s @exit ; no, so exit - - move.l a4, -(sp) ; save our macro register - bigjsr X24c01aGetID,a4 ; get the ID from the serial ROM - move.l (sp)+, a4 ; restore our macro register - ENDIF - -@exit moveq #noErr,d0 ; everything always fine - rts - - ENDWITH ENDPROC @@ -1210,7 +717,7 @@ MdVecSize EQU 4 ;--------------- ; -; MemoryDispatch +; MemoryDispatch a590 ; ; Provides services for Virtual Memory access to the hardware ; @@ -1228,24 +735,28 @@ Vects ;table of offset to selector routines MemDispSelector LockMemoryContiguousProc ; 4 MemDispSelector GetPhysicalProc ; 5 MemDispSelector WriteProtectProc ; 6 -LastVec MemDispSelector UnWriteProtectProc ; 7 + MemDispSelector UnWriteProtectProc ; 7 + dc.w badSelect-Vects ; 8 + dc.w badSelect-Vects ; 9 +LastVec MemDispSelector LockMemoryProc ; 10 MemoryDispatchCode cmp.w #(LastVec-Vects)/MdVecSize,d0 ; check if selector in range - bhi.s @badSelect ; abort if its not a valid selector + bhi.s badSelect ; abort if its not a valid selector move.w Vects(d0.w*MdVecSize),d0 ; get offset to selector's routine jmp Vects(d0) ; go to the routine -@badSelect move.l #hwParamErr,d0 ; abort: return error code +badSelect2 +badSelect3 +badSelect move.l #hwParamErr,d0 ; abort: return error code rts EndProc - ;----- ; -; HoldMemoryProc (_MemoryDispatch Selector 0) +; HoldMemoryProc a5c0 (_MemoryDispatch Selector 0) ; ; This routine makes the address space resident in real memory and ineligible for paging. ; @@ -1260,7 +771,7 @@ HoldMemoryProc PROC Export EndProc ;----- ; -; UnHoldMemoryProc (_MemoryDispatch Selector 1) +; UnHoldMemoryProc a5d0 (_MemoryDispatch Selector 1) ; ; This routine makes the address space eligible for paging. ; @@ -1276,7 +787,7 @@ UnHoldMemoryProc PROC Export ;----- ; -; LockMemoryProc (_MemoryDispatch Selector 2) +; LockMemoryProc a5e0 (_MemoryDispatch Selector 2) ; ; This routine makes the address space immovable in real memory and ineligible for paging. ; It also marks the corresponding page frames as non-cacheable, and increments the @@ -1301,7 +812,7 @@ LockMemoryProc PROC Export movea.l LockMemCt,a2 ; point to MemoryDispatch globals bsr GetPageRange ; check input arguments bne.s @error ; get out - lea.l mdLockTable(a2,d1*2),a1 ; point to lock counter for first page + lea.l mdLockTable(a2,d1.l*2),a1 ; point to lock counter for first page moveq.l #1,d0 ; flag to MMUSetCacheInhibit to inhibit caching @loop addq.w #1,(a1)+ ; bump the lock count @@ -1310,10 +821,6 @@ LockMemoryProc PROC Export subq.l #1,d2 ; one less page to go bhi.s @loop ; keep looping - cmpi.b #EMMU1,MMUType ; is this an Emulated MMU? - beq.s @done ; -> Yes, no need to flush anything - bsr MMUFlushATC ; flush ATC's - _FlushDataCache ; flush data cache @done moveq.l #noErr,d0 ; no error @error movem.l (sp)+,@saveRegs ; restore registers @@ -1323,7 +830,7 @@ LockMemoryProc PROC Export ;----- ; -; UnLockMemoryProc (_MemoryDispatch Selector 3) +; UnLockMemoryProc a610 (_MemoryDispatch Selector 3) ; ; This routine makes the address space movable in real memory and eligible for paging again. ; It also decrements the lock count for the corresponding page frames, and if the @@ -1342,7 +849,7 @@ UnLockMemoryProc PROC Export movea.l LockMemCt,a2 ; point to MemoryDispatch globals bsr GetPageRange ; check input arguments bne.s @error ; get out - lea.l mdLockTable(a2,d1*2),a1 ; point to lock counter for first page + lea.l mdLockTable(a2,d1.l*2),a1 ; point to lock counter for first page move.l d2,d3 ; copy of the count move.w #notLockedErr,d0 ; assume a nonlocked page @lockCheckLoop @@ -1351,7 +858,7 @@ UnLockMemoryProc PROC Export subq.l #1,d3 ; one less page to go bhi.s @lockCheckLoop ; keep looping - lea.l mdLockTable(a2,d1*2),a1 ; point to lock counter for first page + lea.l mdLockTable(a2,d1.l*2),a1 ; point to lock counter for first page move.l d2,d3 ; copy of the count moveq.l #0,d0 ; flag to MMUSetCacheInhibit to enable caching moveq.l #0,d4 ; assume ATC will not need to be cleared @@ -1380,7 +887,7 @@ UnLockMemoryProc PROC Export ;------------------------------------------------------------------- ; -; LockMemoryContiguousProc (_MemoryDispatch Selector 4) +; LockMemoryContiguousProc a660 (_MemoryDispatch Selector 4) ; ; This routine provides the service of making a virtual address range contiguous in ; physical address space. @@ -1423,7 +930,7 @@ LockMemoryContiguousProc PROC Export cmpa.l a1,a0 ; compare the results bne.s @notContigError ; range crosses a non-contiguous bank boundary - lea.l mdLockTable(a2,d1*2),a1 ; point to lock counter for first page + lea.l mdLockTable(a2,d1.l*2),a1 ; point to lock counter for first page moveq.l #1,d0 ; flag to MMUSetCacheInhibit to inhibit caching @loop addq.w #1,(a1)+ ; bump the lock count @@ -1432,10 +939,6 @@ LockMemoryContiguousProc PROC Export subq.l #1,d2 ; one less page to go bhi.s @loop ; keep looping - cmpi.b #EMMU1,MMUType ; is this an Emulated MMU? - beq.s @done ; -> Yes, no ATC or Data cache to flush - bsr MMUFlushATC ; flush ATC's - _FlushDataCache ; flush data cache @done moveq.l #noErr,d0 ; no error @error movem.l (sp)+,@saveRegs ; restore registers @@ -1449,7 +952,7 @@ LockMemoryContiguousProc PROC Export ;------------------------------------------------------------------- ; -; GetPhysicalProc (_MemoryDispatch Selector 5) +; GetPhysicalProc a6c0 (_MemoryDispatch Selector 5) ; ; This routine translates virtual addressess to corresponding physical addresses. ; @@ -1678,7 +1181,7 @@ ChkContig PROC Export ;----- ; -; WriteProtectProc (_MemoryDispatch Selector 6) +; WriteProtectProc a850 (_MemoryDispatch Selector 6) ; ; This routine protects the address space from write accesses. ; It also sets the high bit in the lock counter for each page in the range. @@ -1722,12 +1225,7 @@ WriteProtectProc Proc Export bsr GetPageRange ; check input arguments bne.s @error ; get out - cmpi.b #EMMU1,MMUType ; do we have an EMMU? - beq.s @NoFlush ; -> Yes, no need for this crap - _FlushDataCache ; flush data cache (flush data before write protecting) - _FlushInstructionCache ; flush instruction cache (just for grins) - bsr MMUFlushATC ; flush ATC's -@NoFlush lea.l mdLockTable(a2,d1*2),a1 ; point to lock counter for first page +@NoFlush lea.l mdLockTable(a2,d1.l*2),a1 ; point to lock counter for first page moveq.l #@setW,d0 ; flag to MMUSetWriteProtect to write-protect @loop ori.w #@setWMask,(a1)+ ; set the write-protect flag @@ -1745,7 +1243,7 @@ WriteProtectProc Proc Export ;----- ; -; UnWriteProtectProc (_MemoryDispatch Selector 7) +; UnWriteProtectProc a88c (_MemoryDispatch Selector 7) ; ; This routine allows write accesses to the address space. ; It also clears the high bit in the lock counter for each page in the range. @@ -1789,7 +1287,7 @@ UnWriteProtectProc Proc Export bsr GetPageRange ; check input arguments bne.s @error ; get out - lea.l mdLockTable(a2,d1*2),a1 ; point to lock counter for first page + lea.l mdLockTable(a2,d1.l*2),a1 ; point to lock counter for first page moveq.l #@clearW,d0 ; flag to MMUSetWriteProtect to clear write-protect @loop andi.w #@clearWMask,(a1)+ ; clear the write-protect flag @@ -1809,7 +1307,7 @@ UnWriteProtectProc Proc Export ;------------------------------------------------------------------- ; -; InitMemoryDispatch +; InitMemoryDispatch a8e0 ; ; This routine allocates and initializes the MemoryDispatch globals. ; @@ -1827,15 +1325,6 @@ InitMemoryDispatch Proc Export clr.l LockMemCt ; clear ptr to globals (assume failure) - cmpi.b #HMMU,MMUType ; Do we have an MMU? - bhi.s @hasMMU ; -> Yes, do the init! - - MOVE.W #@UnimplementedTrap,d0 ; _Unimplemented - _GetTrapAddress ,newTool ; Get its address - MOVE.W #@MemoryDispatchTrap,d0 ; Select MemoryDispatch trap - _SetTrapAddress ,newOS ; Set it to point to Unimplemented - bra @NoPages ; -> All done - @hasMMU move.b CPUFlag,d1 ; get the CPU type moveq.l #0,d2 ; assume no page size move.l PhysMemTop,d3 ; get actual amount of physical RAM @@ -1856,8 +1345,6 @@ InitMemoryDispatch Proc Export blo.w @noPages ; bail without allocating globals ??? (Use old code ?) cmpi.b #PMMU851,MMUType ; do we have a real MMU ? blo.w @noPages ; bail without allocating globals ??? (Use old code ?) - cmpi.b #EMMU1,MMUType ; do we have an emulated MMU? - bne.s @mustbe030 ; -> No, must be an 030 moveq #0,D1 ; clear D1 move.l ([ProcessorInfoPtr],ProcessorInfo.PageSize),D0 ; Get the Page size from the nano-k @@ -1867,8 +1354,6 @@ InitMemoryDispatch Proc Export addq #1,d1 bra.s @countBits ; Keep shifting till we find one -@mustbe030 pmove.l TC,-4(a6) ; get the '030 TC register contents - bfextu -4(a6){8,4},d1 ; get log2 of page size @gotPageSize bset.l d1,d2 ; get the page size lsr.l d1,d3 ; get number of page frames @@ -1901,7 +1386,7 @@ InitMemoryDispatch Proc Export ;------------------------------------------------------------------- -; GetPageRange - Sanity check on the logical address and count +; GetPageRange a980 - Sanity check on the logical address and count ; ; Destroys: a0/d1/d2 ; @@ -1959,7 +1444,7 @@ GetPageRange Proc Export EndProc ;------------------------------------------------------------------- -; MMUSetWriteProtect - Set W (Write Protect) bit for a page +; MMUSetWriteProtect a9c0 - Set W (Write Protect) bit for a page ; ; Destroys: none. ; @@ -1978,15 +1463,9 @@ MMUSetWriteProtect Proc Export @moreRegs REG d1/a1/a2 @wBit EQU 2 ; write protect bit in all page descriptors - cmp.b #PMMU851,MMUType ; do we have at least a 68851 PMMU ? - blo.w @noPages ; if not, no pages to write protect (020 or less) -@hasPages movem.l @saveRegs,-(sp) ; save registers move.l d0,d4 ; remember write-protect mask - CMPI.B #EMMU1,MMUType ; Do we have an EMMU? - BNE.S @RealMMU ; -> Nope, sorry - MOVE.L D1,A0 ; Put the page number in A0 _nkGetPTEntryGivenPage ; Get the 030+ PTE from the nk @@ -1997,47 +1476,6 @@ MMUSetWriteProtect Proc Export MOVE.L D1,A1 ; Put the page number in A1 _nkSetPTEntryGivenPage ; Set the 030+ PTE - BRA.S @RegDone ; -> Exit - -@RealMMU move.l mdLog2PageSize(a2),d0 ; get the log2 of the page size - asl.l d0,d1 ; turn logical page number into a logical address - - IF Supports24Bit THEN ; - cmp.l mdPages24(a2),d1 ; check if page is in the 24-bit address space - slo d3 ; if it is, be sure to whack the 24-bit table - - moveq.l #false32b,d0 ; first go to 24-bit mode - _SwapMMUMode ; go to 24-bit mode - move.l d0,d2 ; remember the caller's MMU mode - - movea.l d1,a0 ; set up logical address to get page descriptor - movem.l @moreRegs,-(sp) ; save registers that GetPageDesc destroys - bsr GetPageDescProc ; ptr to page descriptor given logical address - movem.l (sp)+,@moreRegs ; restore registers that GetPageDesc destroys - movea.l a0,a1 ; save ptr to 24-bit page descriptor - - moveq.l #true32b,d0 ; go to 32-bit mode - _SwapMMUMode ; go to 32-bit, return caller's MMU mode - ENDIF - - movea.l d1,a0 ; set up logical address to get page descriptor - movem.l @moreRegs,-(sp) ; save registers that GetPageDesc destroys - bsr GetPageDescProc ; ptr to page descriptor given logical address - movem.l (sp)+,@moreRegs ; restore registers that GetPageDesc destroys - - bclr.b #@wBit,3(a0) ; clear the W bit - or.l d4,(a0) ; clear/set the write-protect flag - - IF Supports24Bit THEN ; - tst.b d3 ; should we whack the 24-bit table ? - beq.s @exit ; if not, we're done - - bclr.b #@wBit,3(a1) ; clear the W bit - or.l d4,(a1) ; clear/set the write-protect flag -@exit - move.l d2,d0 ; caller's MMU mode - _SwapMMUMode ; restore the MMU mode - ENDIF @regDone movem.l (sp)+,@saveRegs ; restore registers @noPages rts @@ -2045,7 +1483,7 @@ MMUSetWriteProtect Proc Export EndProc ;------------------------------------------------------------------- -; MMUSetCacheInhibit - Set CI (Cache Inhibit) bit for a page +; MMUSetCacheInhibit a9e0 - Set CI (Cache Inhibit) bit for a page ; ; NOTE: On the 040, it is assumed that bit 5 of the page descriptor (CM[0]) is ; meaningful, since it is used to select write-through/copyback when @@ -2072,57 +1510,15 @@ MMUSetCacheInhibit Proc Export @saveRegs REG d0-d4/a0/a1 @moreRegs REG d1/a1/a2 - cmp.b #PMMU851,MMUType ; do we have at least a 68851 PMMU ? - blo.w @noPages ; if not, we can't control data caching (020 or less) -@hasPages movem.l @saveRegs,-(sp) ; save registers - cmpi.b #EMMU1,MMUType ; Do we have an EMMU? - bne.s @RealMMU ; -> Nope, sorry + btst.b #7,$240A + bne.s @RegDone MOVE.L D1,A0 ; Put the page number in A0 ADDI.W #mmuMakePageCacheable,D0 ; Turn the cache mode flag into a nKernel selector _KernelVMDispatch ; Set the cache status & flush the ATC - BRA.S @RegDone ; -> Exit -@RealMMU move.l d0,d4 ; remember inhibit flag - - move.l mdLog2PageSize(a2),d0 ; get the log2 of the page size - asl.l d0,d1 ; turn logical page number into a logical address - - IF Supports24Bit THEN ; - cmp.l mdPages24(a2),d1 ; check if page is in the 24-bit address space - slo d3 ; if it is, be sure to whack the 24-bit table - - moveq.l #false32b,d0 ; first go to 24-bit mode - _SwapMMUMode ; go to 24-bit mode - move.l d0,d2 ; remember the caller's MMU mode - - movea.l d1,a0 ; set up logical address to get page descriptor - movem.l @moreRegs,-(sp) ; save registers that GetPageDesc destroys - bsr GetPageDescProc ; ptr to page descriptor given logical address - movem.l (sp)+,@moreRegs ; restore registers that GetPageDesc destroys - movea.l a0,a1 ; save ptr to 24-bit page descriptor - - moveq.l #true32b,d0 ; go to 32-bit mode - _SwapMMUMode - ENDIF - movea.l d1,a0 ; set up logical address to get page descriptor - movem.l @moreRegs,-(sp) ; save registers that GetPageDesc destroys - bsr GetPageDescProc ; ptr to page descriptor given logical address - movem.l (sp)+,@moreRegs ; restore registers that GetPageDesc destroys - bsr.s MMUSetCacheMode ; go whack the page descriptor - - IF Supports24Bit THEN ; - tst.b d3 ; should we whack the 24-bit table ? - beq.s @exit ; if not, we're done - - movea.l a1,a0 ; point to the 24-bit page descriptor - bsr.s MMUSetCacheMode ; go whack the page descriptor -@exit - move.l d2,d0 ; caller's MMU mode - _SwapMMUMode ; restore the MMU mode - ENDIF @RegDone movem.l (sp)+,@saveRegs ; restore registers @noPages rts @@ -2130,60 +1526,11 @@ MMUSetCacheInhibit Proc Export EndProc ;------------------------------------------------------------------- -; MMUSetCacheMode - code to actually whack the page table entry (Called in 32-bit mode) -; -; Destroys: None. ; -; On entry: d4.l = cache inhibit flag: 0=clear cache inhibit bit(s) -; 1=set cache inhibit bit(s) -; a0.l = logical address of page descriptor -; a2.l = ptr to MemoryDispatch globals -;------------------------------------------------------------------- -MMUSetCacheMode Proc Export -@saveRegs REG d0/d1 -@cacheBit EQU 6 ; C bit for 851/030, CM[1] for 040 (CM[0] untouched) -@cm0bit EQU 5 ; CM[0] bit in 040 page descriptor - - movem.l @saveRegs,-(sp) ; save registers - tst.b d4 ; check the cache inhibit flag - beq.s @enableCaching ; if clear, enable caching for the page - move.l (a0),d1 ; get page desc (forces serialization on 040) - bset.l #@cacheBit,d1 ; inhibit caching - bclr.l #@cm0bit,d1 ; make it non-serialized - move.l d1,(a0) ; update page descriptor - bra.s @exit -@enableCaching - clr.l d1 ; clear 68040 mask - bfextu CacheFlags{31-bCopybackMode:1},d1 ; get current cache mode - lsl.l #@cm0bit,d1 ; make a mask for a 68040 page descriptor - or.l (a0),d1 ; get page descriptor (forces copyback on 040) - bclr.l #@cacheBit,d1 ; enable caching - move.l d1,(a0) ; update page descriptor -@exit - movem.l (sp)+,@saveRegs ; restore registers - rts - EndProc - - -;------------------------------------------------------------------- -; -; MMUFlushATC - Flush all entries in the MMU's Address Translation Cache +; MMUFlushATC aa00 - Flush all entries in the MMU's Address Translation Cache ; ;------------------------------------------------------------------- MMUFlushATC Proc Export - cmpi.b #EMMU1,MMUType ; do we have an Emulated MMU? - beq.s @exit ; -> Yes, do nothing - cmp.b #PMMU851,MMUType ; do we have at least a 68851 PMMU ? - blo.s @exit ; if not, we're done - cmp.b #PMMU040,MMUType ; do we have an 040 PMMU? - beq.s @handle040 ; if so, use 040 PFLUSHA - pflusha ; use 851 & 030 PFLUSHA -@exit - rts ; done -@handle040 - MACHINE MC68040 - pflusha ; flush the ATC - MACHINE MC68030 rts EndProc diff --git a/OS/IoPrimitives/IOPrimitives.make b/OS/IoPrimitives/IOPrimitives.make index 4ce64c1..d8583c8 100644 --- a/OS/IoPrimitives/IOPrimitives.make +++ b/OS/IoPrimitives/IOPrimitives.make @@ -27,8 +27,8 @@ IOPrimitivesObjs = "{ObjDir}PowerMgrPrimitives.a.o" "{ObjDir}PWM.c.o" ¶ "{ObjDir}SndPrimitives.a.o" -"{LibDir}IOPrimitives.lib" Ä {IOPrimitivesObjs} - Lib {StdLibOpts} {IOPrimitivesObjs} -o "{Targ}" +# "{LibDir}IOPrimitives.lib" Ä {IOPrimitivesObjs} +# Lib {StdLibOpts} {IOPrimitivesObjs} -o "{Targ}" "{ObjDir}ADBPrimitives.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/OS/MMU/GetReal.a b/OS/MMU/GetReal.a index 3d60783..465c13b 100644 --- a/OS/MMU/GetReal.a +++ b/OS/MMU/GetReal.a @@ -82,7 +82,7 @@ VMGlobals EQU $0B78 ; VM globals ptr VMInstalled equ $0101 ; VMInstalled offset inside VM's globals ;---------------------------------------------------------------------------------- -; GetReal - Translates a logical address into a physical address. The address +; GetReal 7c50 - Translates a logical address into a physical address. The address ; translation is performed in the MMU mode at the time of the call. ; ; input: a0.l = logical address to be translated @@ -111,14 +111,8 @@ GetRealSize equ * GetRealProc PROC EXPORT WITH GetRealVars,MemDispGlobals - EXPORT GetPageDescProc EXPORT GetMMUInfo - EXPORT checkTTRegs - ; Note: We dont support "GetPageDesc Address" - cmpi.b #EMMU1,MMUType ; Do we have an Emulated MMU? - bne.s GetRealAddr ; -> No, OSW (old slow way). - ; Do Logical to Physical Translation for machines with EMMUs. SAM MOVEM.L A2/D1/D2,-(SP) ; Save some regs @@ -147,72 +141,9 @@ GetRealProc PROC EXPORT * BRA.S @Done ; -> Exit RTS -GetRealAddr - move.w #getReal,-(sp) ; indicate we want physical address in a0 - bra.s walkTable ; go walk table - -GetPageDescProc - move.w #getpageDesc,-(sp) ; indicate we want page descriptor ptr in a0 - -walkTable movem.l GetRealRegs,-(sp) ; save working registers - link a6,#GetRealSize ; allocate some room for our locals - cmpi.b #PMMU851,MMUType ; check to see if we have an MMU - bhs.s @haveAnMMU ; IF we do not have an MMU THEN - move.w #noMMUErr,d0 ; return an error - bra.s @exitGetReal ; >>EXIT routine -@haveAnMMU ; ENDIF - move.l a0,d2 ; get logical address into d2 - jsr GetMMUInfo ; fill our globals with MMU info - IF Supports24Bit THEN - move.b MMU32Bit,-(sp) ; save current MMU mode - bne.s @in32BitMode ; IF we're in 24-bit mode THEN - moveq #true32b,d0 ; we want to go to 32 bit addressing - _SwapMMUMode ; switch the MMU mode - and.l Lo3Bytes,d2 ; clean up the 24-bit address - bra.s @doTranslation ; go do the translation - ENDIF -@in32BitMode ; ELSE - jsr checkTTRegs ; check transparent translation regs - bne.s @doTranslation ; IF we matched a TT register THEN - move.l d2,a0 ; put the original address into a0 - move.l #0,a2 ; return null for page descriptor address - moveq #noErr,d3 ; return good status - bra.s @cleanupGetReal ; >>EXIT with easy translation - ; ENDIF -@doTranslation ; ENDIF - cmp.b #PMMU040,MMUType ; check MMU type - beq.s @trans68040 ; IF we're on a 68030 THEN - jsr translate030 ; do the translation for an 851/030 - bra.s @cleanupGetReal ; ELSE -@trans68040 jsr translate040 ; do the translation for a 68040 - ; ENDIF - -;------------ -; a2.w = address of page descriptor, if any -; d3.w = result code -; a0.l = physical address if successful -;------------ -@cleanupGetReal - IF Supports24Bit THEN ; SM is always in 32 bit mode - move.b (sp)+,d0 ; get original MMU mode - bne.s @returnResult ; IF we were originally in 24-bit mode THEN - _SwapMMUMode ; swap back to it - ENDIF -@returnResult ; ENDIF - move.w d3,d0 ; return result in d0 -@exitGetReal - unlk a6 ; restore registers - movem.l (sp)+,GetRealRegs ; save working registers - cmp.w #getpageDesc,(sp)+ ; check for page getPageDesc call - bne.s @getRealDone ; IF this is the getPageDesc call THEN - move.l a2,a0 ; return page descriptor pointer -@getRealDone ; ENDIF - tst.w d3 -@done rts - ;---------------------------------------------------------------------------------- -; GetMMUInfo - Fills the global area with MMU-specific table information. +; GetMMUInfo 7c7e - Fills the global area with MMU-specific table information. ; ; input: a6.l = pointer to global area ; @@ -224,364 +155,15 @@ ISOffset equ 12 ; bit offset into 851/030 TC of IS field pageSizeBit equ 14 ; bit number of page size bit in 68040 TC GetMMUInfo - cmpi.b #EMMU1,MMUType ; Do we have an Emulated MMU - beq @VMisOn ; -> Yes, just clear the Log2Phys field & Exit - cmp.b #PMMU040,MMUType ; check MMU type - beq.s @get040Info ; IF the MMU is an 851/030 THEN - pmove crp,theCRP(a6) ; get the 64-bit CRP value - pmove tc,theTc(a6) ; get TC value - move.l theTc(a6),d4 ; put TC into d4 - move.l #ISOffset,d3 ; get offset into TC of IS field - bfextu d4{d3:4},d0 ; get IS value - move.b d0,initShift(a6) ; save IS value in globals - add.l #4,d3 ; get offset into TC of TIA field - bfextu d4{d3:4},d0 ; get TIA value - move.b d0,levelOne(a6) ; save level one index width in globals - add.l #4,d3 ; get offset into TC of TIB field - bfextu d4{d3:4},d0 ; get TIB value - move.b d0,levelTwo(a6) ; save level one index width in globals - add.l #4,d3 ; get offset into TC of TIC field - bfextu d4{d3:4},d0 ; get TIC value - move.b d0,levelThree(a6) ; save level one index width in globals - add.l #4,d3 ; get offset into TC of TID field - bfextu d4{d3:4},d0 ; get TID value - move.b d0,levelFour(a6) ; save level one index width in globals - bra.s @gotInfo ; go check for log2Phys offset -@get040Info ; ELSE - MACHINE MC68040 ; use 68040 instructions - movec srp,d0 ; get 68040 srp - move.l d0,theSRP(a6) ; save the root ptr - move.l #0,theCRP(a6) ; 68040 only has a 32-bit root pointer - move.b #7,levelOne(a6) ; 68040 always uses 7 bits for first level - move.b #7,levelTwo(a6) ; 68040 always uses 7 bits for second level - move.b #5,levelThree(a6) ; assume 5 bits for 8k pages in third level - movec tc,d0 ; get 68040 tc - move.w d0,theTC(a6) ; store it in globals - btst #pageSizeBit,d0 ; check which page size we're using - bne.s @not4kPages ; IF we're using 4k pages - move.b #6,levelThree(a6) ; use 6 bits for 4k pages in third level -@not4kPages ; ENDIF - move.b #0,levelFour(a6) ; 68040 never has a fourth level - move.b #0,initShift(a6) ; 68040 never has an initial shift - MACHINE MC68030 ; switch back to 68030 instructions -@gotInfo ; ENDIF - move.l phys2log,myPhys2Log(a6) ; get our phys2log translation offset (Assume no vm) - - IF not forROM THEN ; Supermario is always 32bit capable - cmp.l #-1,ExpandMem ; is gestalt unimplemented? - beq.s @done ; IF gestalt is implemented THEN - move.l #gestaltAddressingModeAttr,d0 ; we need to find out 32-bit cleanliness - _Gestalt ; call Gestalt - tst.w d0 ; check for errors - bne.s @VMisOn ; >>EXIT on error - move.l a0,d0 ; get response in d0 - btst #gestalt32BitCapable,d0 ; check if phys2Log globals exists - beq.s @VMisOn ; >>EXIT on error - ENDIF - - ; Some history: Since GetMMUInfo cannot be making lengthy Gestalt calls to determine if VM is on - ; we would (previously) test the lomem where VM puts its globals to see it it had been initialized. - ; A problem arises when VM has saved its globals ptr in VMGlobals but has not yet whacked the MMU - ; tables and someone (VM) calls GetPhysical. An additional flag inside the VMGlobals has been added - ; that is set at the very end of VMs initalization. We now check it to determine if the MMU world - ; has been changed on us. SAM - ; - - ; Determine if VM is installed an running - - move.l VMGlobals,d0 ; Has VM installed its globals ptr (is it installed?) - ble.s @done ; -> No. Leave with Phys2Log offset set. - - move.l d0,a0 ; Globals in. Is VM actually running yet? - tst.b VMInstalled(a0) ; VM's Gestalt inited? - beq.s @done ; -> Nope, leave the offset alone - @VMisOn clr.l myPhys2log(a6) ; VM is on. No phys2log translation @done rts ; return - -;---------------------------------------------------------------------------------- -; checkTTRegs - Checks a logical address against the MMU's transparent -; translation registers. This routine assumes that the -; instruction and data TT registers contain identical information -; on the 68040. -; -; input: d2.l = logical address to check -; -; output: ccr.z is set if the address would be transparently translated -; -; destroys: d0-d1/d3-d4 -;---------------------------------------------------------------------------------- -checkTTRegs - cmp.b #PMMU040,MMUType ; check MMU type - beq.s @get040Regs ; IF the MMU is an 851/030 THEN - subq #4,sp ; create room on stack for tt values - pmove tt0,(sp) ; get tt0 value - move.l (sp),d0 ; store in d0 - pmove tt1,(sp) ; get tt1 value - move.l (sp),d1 ; store in d1 - addq #4,sp ; restore stack - bra.s @checkTTs ; continue with check -@get040Regs ; ELSE - MACHINE MC68040 ; use 68040 instructions - movec dtt0,d0 ; store tt0 in d0 - movec dtt1,d1 ; store tt1 in d1 - MACHINE MC68030 ; switch back to 68030 -@checkTTs ; ENDIF - btst #TTEnable,d0 ; see if tt0 is on - beq.s @checkTT1 ; IF tt0 is enabled THEN - move.l d2,d3 ; make a copy of the logical address - eor.l d0,d3 ; exclusive OR to leave ones in different bits - rol.l #8,d3 ; move upper 8-bits into low byte - swap d0 ; put logical address mask in low byte - not.b d0 ; invert logical address mask - and.b d0,d3 ; isolate bits we care about - beq.s @checkDone ; >>EXIT if we found a match -@checkTT1 ; ENDIF - btst #TTEnable,d1 ; see if tt1 is on - beq.s @notEnabled ; IF tt1 is enabled THEN - move.l d2,d3 ; make a copy of the logical address - eor.l d1,d3 ; exclusive OR to leave ones in different bits - rol.l #8,d3 ; move upper 8-bits into low byte - swap d1 ; put logical address mask in low byte - not.b d1 ; invert logical address mask - and.b d1,d3 ; isolate bits we care about - bra.s @checkDone ; go exit - ; ELSE -@notEnabled andi #$fffb,sr ; clear zero bit -@checkDone ; ENDIF - rts - - -;---------------------------------------------------------------------------------- -; translate030 - Translates a logical address to its corresponding physical -; address on a 68030. -; -; input: a6.l = pointer to globals -; d2.l = logical address to translate -; -; output: a0.l = physical address -; a2.l = ptr to page descriptor for translated address -; d3.w = result code -; -; destroys: d0-d1 -;---------------------------------------------------------------------------------- -tcSRE EQU 25 ; SRP Enable in TC for 851/030 -tcFCL EQU 24 ; Function code Lookup in TC for 851/030 -tcEnable030 EQU 31 ; MMU enable bit in TC on 851/030 -pageDesc EQU 1 ; page descriptor -valid4 EQU 2 ; valid 4 byte -valid8 EQU 3 ; valid 8 byte - -transRegs REG d4-d7 - -translate030 - movem.l transRegs,-(sp) ; save working registers - move.l theSRP(a6),d1 ; get root ptr - move.l theCRP(a6),d7 ; get limit in d7 - move.b d7,d3 ; get descriptor type in d3 - and.b #3,d3 ; isolate it - move.l theTC(a6),d0 ; get a copy of the TC in d0 - btst #tcSRE,d0 ; check for SRP mode - bne @paramErr ; >>EXIT if on - btst #tcFCL,d0 ; check for FCL mode - bne @paramErr ; >>EXIT if on - btst #tcEnable030,d0 ; check if MMU is on - bne.s @startTranslate ; IF MMU is off THEN - move.l d2,a1 ; return logical address unchanged - clr.l d1 ; return null for page descriptor addr - moveq #noErr,d3 ; return good status - bra.s @xlatDone ; >>EXIT with physical address -@startTranslate ; ENDIF - clr.l d4 ; clear offset into logical address - move.b initShift(a6),d4 ; add in initial shift - lea levelOne(a6),a1 ; point a1 at width of first field - clr.l d5 ; get a clear longword - move.b (a1)+,d5 ; get width of next field - -;----------------- -; a1.l = pointer to width of next field -; d1.l = current descriptor entry -; d2.l = logical address to translate -; d3.b = descriptor type of current descriptor -; d4.l = offset into logical address of index field -; d5.l = width of index field -; d7.l = limit of current descriptor -;----------------- -@xlatLoop ; LOOP (to walk an MMU table) - cmp.b #pageDesc,d3 ; is this a page descriptor? - beq.s @getPage ; >>BREAK on page descriptor - bfextu d2{d4:d5},d6 ; get index into next table - tst.l d7 ; is there a limit for this table? - beq.s @noLimit ; IF there is a limit THEN - jsr checkLimit ; check the index against the limit - bcs.s @paramErr ; >>EXIT on a limit overflow -@noLimit ; ENDIF - and.l #$fffffff0,d1 ; remove unused bottom byte - cmp.b #valid4,d3 ; check for 4-byte descriptor - bne.s @not4byte ; IF this is a four byte descriptor THEN - add.l myPhys2Log(a6),d1 ; convert current descriptor to logical addr - move.l d1,a2 ; get pointer to next table - lsl.w #2,d6 ; multiple index by four - add.l d6,a2 ; get address of next descriptor - move.l (a2),d1 ; get next descriptor - clr.l d7 ; no limit on this descriptor - move.b d1,d3 ; get a copy of descriptor - bra.s @doNext ; look at next descriptor -@not4byte ; ELSE - cmp.b #valid8,d3 ; check for 8-byte descriptor - bne.s @paramErr ; >>EXITLOOP on invalid descriptors - add.l myPhys2Log(a6),d1 ; convert current descriptor to logical addr - move.l d1,a2 ; get pointer to next table - lsl.w #3,d6 ; multiple index by eight - add.l d6,a2 ; get address of next descriptor - move.l 4(a2),d1 ; get lower word of next descriptor - move.l 0(a2),d7 ; get upper word of next descriptor - move.b d7,d3 ; get a copy of descriptor - -@doNext ; ENDIF - add.l d5,d4 ; update d4 to contain number of bytes decoded - move.b (a1)+,d5 ; get width of next field - and.b #3,d3 ; isolate descriptor type - bra.s @xlatLoop ; ENDLOOP -@getPage - move.l #32,d5 ; total number of bits in address - sub.l d4,d5 ; get number of bits not yet decoded - bfextu d1{0:d4},d0 ; get top bits of address of physical page - bfextu d2{d4:d5},d6 ; get offset into physical page - lsl.l d5,d0 ; make a base address out of it - add.l d6,d0 ; get physical address - move.l d0,a0 ; put address into a1 - moveq #noErr,d3 ; return no error -@xlatDone - movem.l (sp)+,transRegs ; restore registers - rts - -@paramErr - move.w #paramErr,d3 - bra.s @xlatDone - - -;---------------------------------------------------------------------------------- -; translate040 - Translates a logical address to its corresponding physical -; address on a 68040. -; -; input: a6.l = pointer to globals -; d2.l = logical address to translate -; -; output: a0.l = physical address -; a2.l = ptr to page descriptor for translated address -; d3.w = result code -; -; destroys: d0-d1 -;---------------------------------------------------------------------------------- -tcEnable040 EQU 15 ; MMU enable bit in TC on 68040 -UDTResident EQU 1 ; UDT resident bit in table descriptor -PDTResident EQU 1 ; PDT field value for a resident page -PDTIndirect EQU 2 ; PDT field value for an indirect page desc - -translate040 - movem.l transRegs,-(sp) ; save working registers - move.l theSRP(a6),d1 ; get root ptr in a2 - move.w theTC(a6),d0 ; get a copy of the TC in d0 - btst #tcEnable040,d0 ; check if MMU is on - bne.s @startTranslate ; IF MMU is off THEN - move.l d2,a0 ; return logical address unchanged - clr.l d1 ; return null for page descriptor addr - moveq #noErr,d3 ; return good status - bra.s @xlatDone ; >>EXIT with physical address - ; ENDIF -@startTranslate - clr.l d4 ; clear offset into logical address - clr.w d3 ; clear level counter - clr.l d5 ; get a clear longword - lea levelOne(a6),a1 ; init pointer to field widths -;----------------- -; a1.l = pointer to field width info -; d1.l = current descriptor entry -; d2.l = logical address to translate -; d3.w = level counter -; d4.l = offset into logical address of index field -;----------------- -@walkLoop ; LOOP (to walk 68040 table) - move.b (a1)+,d5 ; get width of first index field - move.l #(32-2),d0 ; get total bits in descriptor (table pointer/4) - sub.l d5,d0 ; get number of significant bits in table ptr - bfextu d1{0:d0},d1 ; get pointer to next table - lsl.l d5,d1 ; almost make a base address out of it - lsl.l #2,d1 ; make a base address out of it - bfextu d2{d4:d5},d6 ; get index into next table - lsl.w #2,d6 ; multiple index by four - add.l d6,d1 ; get address of next descriptor - add.l myPhys2Log(a6),d1 ; convert pointer to logical addr - move.l d1,a2 ; put into an address register - move.l (a2),d1 ; get next descriptor - cmp.w #2,d3 ; is this the third level - beq.s @getPage ; >>EXITLOOP if so - btst #UDTResident,d1 ; is it resident? - beq.s @paramErr ; >>EXIT if not - add.l d5,d4 ; update d4 to contain number of bytes decoded - add.w #1,d3 ; bump level count - bra.s @walkLoop ; ENDLOOP -@getPage - move.b d1,d0 ; get a copy of the page descriptor - and.b #3,d0 ; isolate PDT field - cmp.b #PDTResident,d0 ; is this page resident? - beq.s @residentPage ; IF it is not resident THEN - cmp.b #PDTIndirect,d0 ; check for indirect pointer - bne.s @paramErr ; >>EXIT if invalid - and.l #$fffffffc,d1 ; clear PDT field from indirect descriptor - add.l myPhys2Log(a6),d1 ; convert pointer to logical addr - move.l d1,a2 ; get address of page descriptor - move.l (a2),d1 ; get page descriptor -@residentPage ; ENDIF - add.l d5,d4 ; update d4 to contain number of bytes decoded cch - move.l #32,d5 ; total number of bits in address - sub.l d4,d5 ; get number of bits not yet decoded - bfextu d1{0:d4},d0 ; get address of physical page - bfextu d2{d4:d5},d6 ; get offset into physical page - lsl.l d5,d0 ; make a base address out of it - add.l d6,d0 ; get physical address - move.l d0,a0 ; put address into a0 - moveq #noErr,d3 ; return no error -@xlatDone - movem.l (sp)+,transRegs ; restore registers - rts - -@paramErr - move.w #paramErr,d3 - bra.s @xlatDone - - -;---------------------------------------------------------------------------------- -; checkLimit - Checks an index against a limit for an 8-byte descriptor. -; -; input: d6.l = index to be checked -; d7.l = upper word of descriptor -; -; output: ccr.c set on invalid index -; ccr.c clear on valid index -; -; destroys: d7 -;---------------------------------------------------------------------------------- - -checkLimit swap d7 ; get limit into low word - btst #15,d7 ; check type of limit - bne.s @lower ; IF it is an upper limit THEN - cmp.w d6,d7 ; compare upper limit - bra.s @limitExit ; ELSE -@lower and.w #$7fff,d7 ; remove l/u bit - cmp.w d7,d6 ; compare lower limit -@limitExit ; ENDIF - rts - - ENDWITH ENDP ;---------------------------------------------------------------------------------- -; EDiskProtectPPC - Protects or unprotects the EDisk as specified for PowerPC. +; EDiskProtectPPC 7c90 - Protects or unprotects the EDisk as specified for PowerPC. ; ; input: d0[15:0] = HwPriv selector #8 ; d0[16] = set to protect specified area, clear to unprotect it @@ -602,9 +184,6 @@ ProtectRegsPPC REG d2-d4 EDiskProtectPPC PROC EXPORT WITH GetRealVars - cmp.b #EMMU1,MMUType ; check to see if we have a PowerPC MMU - bne @paramErr ; >>EXIT if not - movem.l ProtectRegsPPC,-(sp) ; save working registers ;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ @@ -641,124 +220,6 @@ EDiskProtectPPC PROC EXPORT movem.l (sp)+,ProtectRegsPPC ; restore working registers @return rts -@paramErr move.w #paramErr,d0 ; return paramErr - bra.s @return - - ENDWITH - - ENDP - - - -;---------------------------------------------------------------------------------- -; EDiskProtect - Protects or unprotects the EDisk as specified. -; -; NOTE: This algorithm assumes that the Edisk space is the only space -; mapped by it's 1st level descriptor. -; -; input: d0.w = HwPriv selector #8 -; a0.l = 32-bit base address of EDisk -; a1.w = flag to protect or unprotect Edisk (1=protect) -; -; output: a0.l = pointer to the 1st-level table descriptor for the eDisk -; d0.w = result code -; -; destroys: d1/a1 -;---------------------------------------------------------------------------------- -ProtectRegs REG d2-d4/a2 - -EDiskProtect PROC EXPORT - IMPORT GetMMUInfo - IMPORT checkTTRegs - WITH GetRealVars - - cmp.b #PMMU851,MMUType ; check to see if we have an MMU - blo @bailNoMMU ; >>EXIT if not - - movem.l ProtectRegs,-(sp) ; save working registers - link a6,#GetRealSize ; allocate some room for our locals - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; 68K EDisk Write Protect Code -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -@noEMMU move.l a0,d2 ; get base address of Edisk - move.w a1,a2 ; save protect flag in a2 - - Move SR,D0 ; Get and save the SR. - Btst #13,D0 ; Are we in Supervisor mode? - Bne.s @noVM ; Yes? Then don't call _EnterSupervisorMode. - _EnterSupervisorMode ; Must be in supervisor mode (SR returned in D0). -@noVM - move.w d0,-(sp) ; save status register value - IF Supports24Bit THEN - move.b MMU32Bit,-(sp) ; save current MMU mode - bne.s @in32BitMode ; IF we're in 24-bit mode THEN - moveq #true32b,d0 ; we want to go to 32 bit addressing - _SwapMMUMode ; switch the MMU mode - bra.s @doTranslation ; go do the translation -@in32BitMode ; ELSE - ENDIF - jsr checkTTRegs ; check transparent translation regs - bne.s @doTranslation ; IF we matched a TT register THEN - move.l d2,a0 ; put the original address into a0 - moveq #paramErr,d3 ; return bad status - bra.s @cleanup ; >>EXIT with easy translation - ; ENDIF -@doTranslation ; ENDIF - jsr GetMMUInfo ; set up globals - clr.l d0 ; clear starting bit value - clr.l d1 ; clear bit field length - move.b initShift(a6),d0 ; get bit to start at, with initial shift, if any - move.b levelOne(a6),d1 ; get bit field length - bfextu d2{d0:d1},d0 ; get index into 1st-level table - lsl.l #2,d0 ; convert to a 4-byte entry pointer index - btst.b #0,theCRP+3(a6) ; is this an 8-byte table? - beq.s @is4Byte ; IF this is a 8-byte entry table THEN - lsl.l #1,d0 ; convert to an 8-byte entry pointer index -@is4Byte ; ENDIF - add.l theSRP(a6),d0 ; get the physical address of the 1st-level entry - add.l myPhys2Log(a6),d0 ; convert to a logical address - move.l d0,a0 ; save in a0 - -;------------ -; Change RAM disk protection -;------------ - - move.w #noErr,d3 ; return good result if we get here.

- bset #writeProtectBit,3(a0) ; set the write-protect bit - tst.w a2 ; check if protect flag is set - bne.s @protect ; IF we want to unprotect THEN - bclr #writeProtectBit,3(a0) ; clear the write-protect bit -@protect ; ENDIF - cmp.b #cpu68040,CPUFlag ; check for processor type - bne.s @not040 ; IF on a 68040 THEN - MACHINE MC68040 ; - pflusha ; flush the ATC regs - bra.s @cleanup ; ELSE - MACHINE MC68030 ; -@not040 jsr ([jCacheFlush]) ; flush caches since they're logical

- pflusha ; flush the ATC regs - ; ENDIF - -;------------ -; d3.w = result code -; a0.l = physical address if successful -;------------ -@cleanup - IF Supports24Bit THEN - move.b (sp)+,d0 ; get original MMU mode - bne.s @skipMMUSwap ; IF we were originally in 24-bit mode THEN - _SwapMMUMode ; swap back to it -@skipMMUSwap ; ENDIF - ENDIF - move.w (sp)+,d0 ; get status register value - move d0,sr ; restore status register - move.w d3,d0 ; return result in d0 -@return unlk a6 - movem.l (sp)+,ProtectRegs ; restore working registers -@bailNoMMU - rts - ENDWITH ;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ ; That's all folks. diff --git a/OS/MMU/MMU.a b/OS/MMU/MMU.a index 8ef38b4..9d6dd41 100644 --- a/OS/MMU/MMU.a +++ b/OS/MMU/MMU.a @@ -129,7 +129,7 @@ MACHINE MC68030 MMUStuff PROC - EXPORT InitMMUGlobals, InitMMUTrap, MMUCleanupFor8Mb, SwitchMMU + EXPORT InitMMUGlobals, InitMMUTrap, SwitchMMU IMPORT BaseOfROM, Critical, PramIO, RamTest IMPORT RomLoc @@ -138,7 +138,7 @@ MMUStuff PROC ;----- -; InitMMUTrap - set up trap addres for SwapMMUMode +; InitMMUTrap 7930 - set up trap addres for SwapMMUMode ; ; Entry ; jSwapMMU points to correct SwapMMUMode routine @@ -155,7 +155,7 @@ InitMMUTrap ;----- -; InitMMUGlobals - set up vectors & lowmem for SwapMMUMode +; InitMMUGlobals 793c - set up vectors & lowmem for SwapMMUMode ; ; Entry ; BootGlobPtr points to BootGlobs @@ -195,53 +195,16 @@ InitMMUGlobals @NoSwap rts @swaps dc.w @NoSwap-@swaps ; No MMU: no swap routine! - dc.w SwapHMMU-@swaps ; offset to HMMU swap routine + dc.w @NoSwap-@swaps ; offset to HMMU swap routine dc.w @NoSwap-@swaps ; MMB not supported: no swap routine! - dc.w Swap851-@swaps ; offset to 68851 PMMU swap routine + dc.w @NoSwap-@swaps ; offset to 68851 PMMU swap routine dc.w Swap030-@swaps ; offset to 030 PMMU swap routine - dc.w Swap040-@swaps ; offset to 040 PMMU swap routine + dc.w @NoSwap-@swaps ; offset to 040 PMMU swap routine dc.w @NoSwap-@swaps ; future expansion dc.w @NoSwap-@swaps ; future expansion -;----- <3.1> -; MMUCleanupFor8Mb - copies MMU info (tc, crp, tt0, tt1) to below BufPtr. -; -; This is called on systems supporting 24 bit mode that have more than 8mb of RAM -; installed. The MMU info must be at a place that can be accessed in 24 bit mode, -; since the Swap MMU code must access it! -; -; Entry -; System is in 32 bit mode -; MMU24Info (long) points to 24 bit mode MMU configuration info in BootGlobs -; MMU32Info (long) points to 32 bit mode MMU configuration info in BootGlobs -; Exit -; MMU24Info (long) points to 24 bit mode MMU configuration info below BufPtr -; MMU32Info (long) points to 32 bit mode MMU configuration info below BufPtr -; -; Trashes -; d0/a0-a2 -;--- - - WITH MMUConfigInfo - -MMUCleanupFor8Mb - move.l BufPtr,a0 ; get top useable memory - suba.w #2*MMUInfoSize,a0 ; allocate space for config info - move.l a0,BufPtr ; update top useable memory - lea MMU32Info,a1 ; point at ptr to 32 bit mode info - bsr.s @doCopy ; copy it down - lea MMU24Info,a1 ; point at ptr to 32 bit mode info -@doCopy move.l (a1),a2 ; get ptr to info in BootGlobs - move.l a0,(a1) ; update ptr w/new stuff below BufPtr - moveq #MMUInfoSize-1,d0 ; loop counter -@copy move.b (a2)+,(a0)+ ; copy next byte - dbra d0,@copy ; repeat for all bytes - rts - - ENDWITH ; {MMUConfigInfo} - ;----- -; Swap32Only - null MMU swap, used when system has 32 bit addressing only +; Swap32Only 7990 - null MMU swap, used when system has 32 bit addressing only ; ; Entry: ; d0.b 0 to set 24-bit mode, non-zero to set 32-bit mode. @@ -256,84 +219,6 @@ Swap32Only rts -;----- -; Swap851 - switches 68851 PMMU between 24 & 32 bit modes. -; -; Entry -; d0.b 0 to set 24-bit mode, non-zero to set 32-bit mode. -; -; Exit -; MMU32Bit updated with passed value of d0 -; d0.l has previous value of MMU32Bit -; MMU is switched into the desired mode -; -; Trashes: -; d1/a0/a1 -;--- - -Swap851 move.b d0,d1 ; check what mode we are going to, set up d1 - bne.s @to32 ; IF we want 24 bit mode - moveq #0,d0 ; clear return register - move.b MMU32bit,d0 ; see what mode we're in now - beq.s @endif ; IF in 32 bit mode now - move sr,-(sp) ; save current interrupt status - ori #HiIntMask,sr ; disable interrupts during switch - move.l MMU24Info,a0 ; get ptr to 24 bit mode info - bra.s @swap ; go to common swap code - ; ENDIF -@to32 ; ELSE (we want 32 bit mode) - moveq #0,d0 ; clear return register - move.b MMU32bit,d0 ; see what mode we're in now - bne.s @endif ; IF in 24 bit mode - move sr,-(sp) ; save current interrupt status - ori #HiIntMask,sr ; disable interrupts during switch - move.l MMU32Info,a0 ; get ptr to 32 bit mode info - - IF forRomulator THEN ; Assume logical PC <> physical PC <3.7> - -@swap moveq.l #1,d0 ; unset zero flag <3.7> - bra.s @doSwap ; go put PMOVE to TC into i-cache <3.7> -@inCache moveq.l #0,d0 ; set zero flag <3.7> - pmove theCRP(a0),CRP ; set the root pointer <3.7> - lea theTC(a0),a1 ; get address of TC <3.7> - bra.s @doSwap ; go swap modes from i-cache <3.7> - - ; NOTE: the following instructions are put <3.7> - ; . in the i-cache, thus the 4 byte instructions<3.7> - ; . to be executed must start on odd word <3.7> - ; . boundaries so that they are put in on the <3.7> - ALIGN 4 ; . first pass through <3.7> -@doSwap bne.s @step ; (2 bytes) if zero flag not set, skip pmove <3.7> - pmove theCRP(a0),TC ; (4 bytes) disable the 851 <3.7> - ; NOTE: the 851 must be disabled before <3.7> - ; . the TC can be changed. The CRP always <3.7> - ; . has the high bit off, and can be used to <3.7> - ; . disable MMU. Also note that "theCRP" is <3.7> - ; . zero, causing this instruction to be 4 bytes<3.7> -@step nop ; (2 bytes) force next inst to start on odd word<3.7> - bne.s @chk ; (2 bytes) if zero flag not set, skip pmove <3.7> - pmove (a1),TC ; (4 bytes) fire up new TC, flush ATC <3.7> -@chk beq.s @swapped ; (2 bytes) if zero flag set, we're done <3.7> - bra.s @inCache -@swapped ; <3.7> - - ELSE ; <3.7> - -@swap pmove theCRP(a0),tc ; disable the MMU so we can load a new TC value <3.8> - pmove theCRP(a0),crp ; set crp -@thePmove pmove theTC(a0),tc ; fire up the TC - - ENDIF - pflusha ; clean out dirty ATC entries - move.b d1,MMU32Bit ; update global w/new mode flag - movec cacr,d1 ; get cache control register - ori.w #$0008,d1 ; set i-cache 'flush' bit - movec d1,cacr ; flush instruction caches - move (sp)+,sr ; restore interrupt mask - ; ENDIF -@endif ; ENDIF - rts - ;----- ; Swap030 - switches 030 PMMU between 24 & 32 bit modes. ; @@ -383,124 +268,8 @@ Swap030 move.b d0,d1 ; check what mode we are going to, set up d1 rts -;----- -; Swap040 - switches 040 PMMU between 24 & 32 bit modes. <7> -; -; Entry -; d0.b 0 to set 24-bit mode, non-zero to set 32-bit mode. -; -; Exit -; MMU32Bit updated with passed value of d0 -; d0.l has previous value of MMU32Bit -; MMU is switched into the desired mode -; -; Trashes: -; d1/a0 -;--- - - machine mc68040 - -Swap040 move.b d0,d1 ; check what mode we are going to, set up d1 - bne.s @to32 ; IF we want 24 bit mode - moveq #0,d0 ; clear return register - move.b MMU32bit,d0 ; see what mode we're in now - beq.s @endif ; IF in 32 bit mode now - move.l MMU24Info,a0 ; get ptr to 24 bit mode info - bra.s @swap ; go to common swap code - ; ENDIF -@to32 ; ELSE (we want 32 bit mode) - moveq #0,d0 ; clear return register - move.b MMU32bit,d0 ; see what mode we're in now - bne.s @endif ; IF in 24 bit mode - move.l MMU32Info,a0 ; get ptr to 32 bit mode info -@swap move sr,-(sp) ; save current interrupt status - ori #HiIntMask,sr ; disable interrupts during switch - move.b d1,MMU32Bit ; update global w/new mode flag - move.l theTT0(a0),d1 ; get transparent translation reg 0 value - movec d1,itt0 ; load the instruction TT0 reg - movec d1,dtt0 ; load the data TT0 reg with the same value - move.l theTT1(a0),d1 ; get transparent translation reg 1 value - movec d1,itt1 ; load the instruction TT0 reg - movec d1,dtt1 ; load the data TT0 reg with the same value - move.l theTC(a0),d1 ; get the TC value in d1 - move.l theSRP(a0),a0 ; get the SRP value in a0 - movec a0,SRP ; set the SRP with new pointer - movec d1,TC ; set the TC with the new value - pflusha ; flush the ATC entries - move (sp)+,sr ; restore interrupt mask - ; ENDIF -@endif ; ENDIF - rts - - machine mc68030 ; - -;----- -; SwapHMMU - switches HMMU between 24 & 32 bit modes. -; -; This routine has a fix for the problem of losing sound interrupts when switching -; MMU modes. On HMMU Mac II's, a bit on Via2 portB switches the MMU mode. -; Unfortunately, hitting this bit clears the CB1 interrupt flag, which is -; the ASC interrupt. -; -; Since the interrupt handlers all call SwapMMUMode to switch into 24 bit mode -; before processing interrutps, an ASC interrupt that occurs after the -; original interrupt could be lost. -; -; This routine reduces the window for losing ASC interrupts to the minimum -; possible, which is half an instruction. After switching MMU modes, -; it checks the ASC's interrupt register, and if any interrupts are present -; (but lost because the CB1 flag was cleared), it OR's the interrupt register back -; to itself. The ASC then generates a new interrupt. -; -; Entry -; d0.b 0 to set 24-bit mode, non-zero to set 32-bit mode. -; -; Exit -; MMU32Bit updated with passed value of d0 -; d0.l has previous value of MMU32Bit -; MMU is switched into the desired mode -; -; Trashes: -; d1/a0 -;--- - -SwapHMMU - move.b d0,d1 ; check what mode desired, save it - bne.s @1 ; IF we want 24 bit mode - moveq #0,d0 ; clear return register - move.b MMU32bit,d0 ; see what mode we're in now - beq.s @3 ; IF in 32 bit mode now - move sr,-(sp) ; save current interrupt status - ori #HiIntMask,sr ; disable interrupts during switch - move.l VIA2RBV,a0 ; get ptr to 2nd Via - bclr #vFC3,vBufB(a0) ; throw us into 24 bit mode - bra.s @common ; (re-use common code) -@1 ; ELSE (we want 32 bit mode) - moveq #0,d0 ; clear return register - move.b MMU32bit,d0 ; see (and return) what mode we're in now - bne.s @3 ; IF in 24 bit mode now - move sr,-(sp) ; save current interrupt status - ori #HiIntMask,sr ; disable interrupts during switch - move.l VIA2RBV,a0 ; get ptr to 2nd Via - bset #vFC3,vBufB(a0) ; throw us into 32 bit mode -@common move.b d1,MMU32Bit ; update global w/new mode flag - movec cacr,d1 ; get cache control register - bset #3,d1 ; set icache flush bit - movec d1,cacr ; flush da cache, Guido - move.l ASCBase,a0 ; point to ASC - adda.w #ascFifoInt,a0 ; point to ASC interrupt register - move.b (a0),d1 ; get ASC interrupt register - beq.s @2 ; IF ASC thinks interrupt is pending - or.b d1,(a0) ; re-generate interrupt to VIA's CB1 -@2 ; ENDIF - move (sp)+,sr ; restore interrupt mask - ; ENDIF -@3 ; ENDIF - rts - - ;--------------------------------------------------- -; MMU switch code, for Unix & Pink. +; MMU switch code, for Unix & Pink. 79ec ; ; Turns off the MMU, flushes ATC, then re-enables the MMU with passed info. ; @@ -525,33 +294,6 @@ SwapHMMU SwitchMMU -@TestCPU sub.l d0,d0 ; D0 = 0 - bset #CACR_DE_040,d0 ; set Data Cache Enable bit on 040s - movec d0,CACR ; attempt to enable data cache (temporarily) - movec CACR,d0 ; check and see if it's still there - btst #CACR_DE_040,d0 ; see if the bit exists in CACR - beq.s @isNot040 - - - MACHINE MC68040 ; IF we're on a 68040 THEN - -@is040 movec CACR,d0 ; retrieve cache control register - move.l d0,d1 ; save a copy for later restoration - sub.l d0,d0 ; clear D0 to disable caches (see diagram above) - movec d0,CACR ; disable both caches - movec d0,TC ; disable the ATC - pflusha ; flush ATC - movea.l theCRP(a0),a2 ; retrieve the new CRP (= URP on the 040) into D0 - move.l theTC(a0),d0 ; retrieve the new TC into D0 - movec a2,URP ; set up the URP - movec d0,TC ; ... and the TC - cpusha bc ; flush both caches (dirty data only pushed out of - ; the data cache. inst. cache CPUSH = CINV) - movec d1,cacr ; re-enable caches - bra.s @allDone - - MACHINE MC68030 ; ELSE we're on a 68030/68020 - @isNot040 movec cacr,d0 ; get 020/030 cache control reg move.w d0,d1 ; save it andi #$FEFE,d0 ; clear cache enable bits diff --git a/OS/MMU/MMU.make b/OS/MMU/MMU.make index 02a0ac1..2310492 100644 --- a/OS/MMU/MMU.make +++ b/OS/MMU/MMU.make @@ -15,8 +15,8 @@ MMUObjs = "{ObjDir}MMU.a.o" "{ObjDir}MMUTables.a.o" ¶ "{ObjDir}GetReal.a.o" -"{LibDir}MMU.lib" Ä {MMUObjs} - Lib {StdLibOpts} {MMUObjs} -o "{Targ}" +# "{LibDir}MMU.lib" Ä {MMUObjs} +# Lib {StdLibOpts} {MMUObjs} -o "{Targ}" diff --git a/OS/MMU/MMUTables.a b/OS/MMU/MMUTables.a index f02a4c7..154c2f4 100644 --- a/OS/MMU/MMUTables.a +++ b/OS/MMU/MMUTables.a @@ -238,7 +238,6 @@ MACHINE MC68030 MMUStuff PROC EXPORT InitMMU - EXPORT Trans IMPORT BaseOfROM, Critical, PramIO, RamTest IMPORT RomLoc IMPORT SizeSoundBuffer @@ -267,16 +266,6 @@ MMUStuff PROC ; is set. ;--- - MACRO -&label Setup &tc,&tt0,&tt1,&template,&special,&physical -&label dc.l &tc - dc.l &tt0 - dc.l &tt1 - dc.w &template-&label - dc.w &special-&label - dc.w &physical-&label - ENDM - MMUSetupInfo RECORD 0,INCR newtc ds.l 1 ; translation control register newtt0 ds.l 1 ; transparent translation reg 0 @@ -289,44 +278,6 @@ size equ * ; size of each table entry WITH MMUSetupInfo -; transp. transp offset to offset to offset to -; TC xlat 0 xlat 1 template special template physical template -; -------- --------- --------- ----------- ---------------- ---------------- -contig24 Setup $80F84500, 0, 0, template24, 0, physNormal -contig32 Setup $80F05750, 0, 0, template32, void32, physNormal -split24 Setup $80F84500, 0, 0, template24, 0, physNormal -split1mb32 Setup $80F05750, 0, 0, template32, void32, physNormal -split2mb32 Setup $80F05660, 0, 0, template32, void32, physNormal -split4mb32 Setup $80F05570, 0, 0, template32, void32, physNormal -split8mb32 Setup $80F05480, 0, 0, template32, void32, physNormal -split16mb32 Setup $80F08900, 0, 0, template32, void32, physNormal -split32mb32 Setup $80F07A00, 0, 0, template32, void32, physNormal -split64mb32 Setup $80F06B00, 0, 0, template32, void32, physNormal -Rbv24b Setup $80F84500, 0, 0, template24RBVb, 0, physRBVb ; <11> -Rbv32b Setup $80F05750, 0, 0, Template32RBVb, void32RBVb, physRBVb ; <11> -Rbv24e Setup $80F84500, 0, 0, template24RBVe, 0, physRBVe ; <11> -Rbv32e Setup $80F05750, 0, 0, Template32RBVe, void32RBVe, physRBVe ; <11> -orwell24 Setup $C000, 0, 0, template24Orwell, 0, physOrwell ; -orwell32 Setup $C000, $F900C060, $807FC040, Template32Orwell, void32Orwell, physOrwell ; -Jaws24 Setup $80F84500, 0, 0, template24Jaws, 0, physLCD ; <9> -Jaws32 Setup $80F05750, 0, 0, template32Jaws, void32Jaws, physLCD ; <9> -MSC24 Setup $80D86500, 0, 0, template24MSC, 0, physMSC ; -MSC32 Setup $80D07750, $600F8507, $807F8507, template32MSC, void32MSC, physMSC ; -MSC24040 Setup $C000, 0, 0, template24MSC040, 0, physMSC ; -MSC32040 Setup $C000, $600FC060, $807FC060, template32MSC040, void32MSC, physMSC ; -Niagra24 Setup $80D86500, 0, 0, template24Niagra, 0, physNiagra ; -Niagra32 Setup $80D07750, $600F8507, 0, template32Niagra, void32Niagra, physNiagra ; -Sonora24 Setup $80D86500, 0, 0, template24Sonora, 0, physSonora ; -Sonora32 Setup $80D07750, $600F8507, $807F8507, template32Sonora, void32Sonora, physSonora ; -FstrFrms24 Setup $80F84500, 0, 0, templateFF24, 0, physFF ; CSS -FstrFrms32 Setup $80F05750, 0, 0, templateFF32, 0, physFF ; CSS -YMCA24 Setup $C000, 0, 0, template24YMCA, 0, physYMCA ; CSS -YMCA32 Setup $C000, $F900C060, $807FC040, Template32YMCA, void32YMCA, physYMCA ; CSS -SnraForty24 Setup $C000, 0, 0, template24SnraFrty, 0, physSonora ; -SnraForty32 Setup $C000, $600FC060, $807FC040, template32SnraFrty, void32Sonora, physSonora ; -Pratt24 Setup $C000, 0, 0, template24Pratt, 0, physPratt ; -Pratt32 Setup $C000, $A01FC040, $600FC060, template32Pratt, void32Pratt, physPratt ; - ;----- ; The template tables describe the logical to physical address mapping. ; @@ -540,417 +491,6 @@ physNflag ds.l 1 ; suggested physical address, & flags <7> tEntrySize equ * ; size of a template entry ENDR - MACRO -&label tp &span,&physNflag -&label dc.l &span - dc.l &physNflag ; <7> - ENDM - -Template32 - tp bRom32-bRam, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o and/or video - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isThru+cInhibit ; slots - -Template32RBVb ; RBV in Slot B - tp bRom32-bRam, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp RBVWrap32b-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots - tp RBVBase32b-RBVWrap32b, isVidWrap ; wrap area <11> - tp RBVEnd32b-RBVBase32b, isVideo ; frame buffer area <11> - tp (bTop32Less1-RBVEnd32b)+1, isThru+cInhibit ; rest of slots <11> - -Template32RBVe ; RBV in Slot E <11> - tp bRom32-bRam, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp RBVWrap32e-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots - tp RBVBase32e-RBVWrap32e, isVidWrap ; wrap area - tp RBVEnd32e-RBVBase32e, isVideo ; frame buffer area - tp (bTop32Less1-RBVEnd32e)+1, isThru+cInhibit ; rest of slots - -Template32Orwell ; <7> - tp bRealRom32-bRam, isRAM+c040CopyBack ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+c040CopyBack; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp bNonSerEyeOh-bRealEyeOh32, isThru+c040InhibitSer ; ser i/o - tp (bNonSerEyeOh+IOMaxSize)-bNonSerEyeOh, isThru+c040InhibitNonSer ; non-ser i/o - tp bRamDisk-(bNonSerEyeOh+IOMaxSize), isVoid ; Invalid - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp (bTop32Less1-(bRamDisk+EDskMaxSize))+1, isVoid ; slots (uses TTx regs) - -Template32Jaws - tp bRom32-bRam, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp LCDWrap32-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots - tp LCDBase32-LCDWrap32, isVidWrap ; wrap area - tp LCDEnd32-LCDBase32, isVideoRAM ; frame buffer area - tp (bTop32Less1-LCDEnd32)+1, isThru+cInhibit ; rest of slots - -Template32MSC ; - tp bRealRom32-bRam, isRAM+FullTbl ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+FullTbl ; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp b32VidBase-bRealEyeOh32, isThru+cInhibit ; i/o - tp bRamDisk-b32VidBase, isVoid ; video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isVoid ; slots (uses TT1) - -Template32MSC040 - tp bRealRom32-bRam, isRAM+c040CopyBack ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+c040CopyBack ; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp b32VidBase-bRealEyeOh32, isThru+c040InhibitSer ; i/o - tp bRamDisk-b32VidBase, isVoid ; video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isVoid ; slots (uses TT1) - -Template32SnraFrty ; - tp bRealRom32-bRam, isRAM+c040CopyBack ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+c040CopyBack ; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp bNonSerEyeOh-bRealEyeOh32, isThru+c040InhibitSer ; ser i/o - tp (bNonSerEyeOh+IOMaxSize)-bNonSerEyeOh, isThru+c040InhibitNonSer; non-ser i/o - tp (b32VidBase-$2000)-(bNonSerEyeOh+IOMaxSize), isVoid ; Invalid - tp b32VidBase-(b32VidBase-$2000), isThru+c040InhibitSer ; CPU ID Register - tp bRamDisk-b32VidBase, isVoid ; Video (uses TTx regs) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp (bTop32Less1-(bRamDisk+EDskMaxSize))+1, isVoid ; slots (uses TTx regs) - -Template32Sonora ; - tp bRealRom32-bRam, isRAM+FullTbl ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+FullTbl ; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp b32VidBase-bRealEyeOh32, isThru+cInhibit ; I/O - tp bRamDisk-b32VidBase, isThru+cInhibit ; Video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isVoid ; slots (uses TT1) - -Template32Niagra ; - tp bRealRom32-bRam, isRAM+FullTbl ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+FullTbl ; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp b32VidBase-bRealEyeOh32, isThru+cInhibit ; i/o - tp bRamDisk-b32VidBase, isVoid ; video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp b32SlotE-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots thru E - tp (b32SlotF-DeclRomSize)-b32SlotE, isThru+cInhibit ; slot E up to config ROM - tp b32SlotF-(b32SlotF-DeclRomSize), bRealRom32+isMap+cInhibit ; slot E Config ROM - tp bTop32Less1-b32SlotF+1, isThru+cInhibit ; slots - -Template32YMCA ; CSS - tp bRealRom32-bRam, isRAM+c040CopyBack ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+c040CopyBack; ROM - tp bVideo32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp bVRAM32 -bVideo32, isThru+c040InhibitNonSer ; non-ser video I/O. - tp (bVRAM32+VRAMMaxSize)-bVRAM32, isThru+c040InhibitNonSer ; non-ser VRAM. - tp bRealEyeOh32 -(bVRAM32+VRAMMaxSize), isVoid ; Invalid - tp bNonSerEyeOh-bRealEyeOh32, isThru+c040InhibitSer ; ser i/o - tp (bNonSerEyeOh+IOMaxSize)-bNonSerEyeOh, isThru+c040InhibitNonSer ; non-ser i/o - tp bRamDisk-(bNonSerEyeOh+IOMaxSize), isVoid ; Invalid - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp (bTop32Less1-(bRamDisk+EDskMaxSize))+1, isVoid ; slots (uses TTx regs) - -Template32Pratt - tp bRom32-bRam, isRAM+c040CopyBack ; RAM - -; IMPORTANT! The following two lines contain the expression 2*ROMMaxSize so that we can overlay -; the emulation monitor for the HP 040 emulator into a valid address range. For the final product, -; we don't need the factor of 2 (i.e. just use ROMMaxSize instead). - tp (bRom32+2*ROMMaxSize)-bRom32, isROM32+c040CopyBack ; ROM - tp bEyeOh32-(bRom32+2*ROMMaxSize), isVoid ; Invalid - - tp bNonSerIO-bEyeOh32, isThru+c040InhibitSer ; ser i/o - tp b32VidBase-bNonSerIO, isThru+c040InhibitNonSer ; non-ser i/o - tp bRamDisk-b32VidBase, isVoid ; Invalid - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp b32SlotA-(bRamDisk+EDskMaxSize), isVoid ; Invalid - tp b32SlotC-b32SlotA, isThru+c040InhibitSer ; Minor slot spaces A and B - tp b32SlotE-b32SlotC, isVoid ; Invalid - tp (b32SlotF-DeclRomSz)-b32SlotE, isThru+c040InhibitSer ; map beginning of slot E thru - tp b32SlotF-(b32SlotF-DeclRomSz), ($402e0000-DeclRomSz)+isMap+c040InhibitSer; slot E Config ROM - tp bTop32Less1-b32SlotF+1, isVoid ; slot f not used - -Template24 - tp bRom24-bRam, isRAM ; RAM - tp b24Slot9-bRom24, isROM24 ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+cInhibit ; minor slot 9 <7> - tp b24SlotB-b24SlotA, b32SlotA+isMap+cInhibit ; minor slot A <7> - tp b24SlotC-b24SlotB, b32SlotB+isMap+cInhibit ; minor slot B <7> - tp b24SlotD-b24SlotC, b32SlotC+isMap+cInhibit ; minor slot C <7> - tp b24SlotE-b24SlotD, b32SlotD+isMap+cInhibit ; minor slot D <7> - tp bEyeOh24-b24SlotE, b32SlotE+isMap+cInhibit ; minor slot E <7> - tp (bTop24Less1-bEyeOh24)+1, bEyeOh32+isMap+cInhibit ; i/o <7> - -Template24RBVb ; RBV in Slot B <11> - tp bRom24-bRam, isRAM ; RAM - tp b24Slot9-bRom24, isROM24 ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+cInhibit ; minor slot 9 <7> - tp RBVWrap24b-b24SlotA, b32SlotA+isMap+cInhibit ; minor slot A <7><11> - tp RBVBase24b-RBVWrap24b, isVidWrap ; wrap area <11> - tp RBVEnd24b-RBVBase24b, isVideo ; frame buffer area <11> - tp b24SlotD-RBVEnd24b, b32SlotC+isMap+cInhibit ; minor slot C <7><11> - tp b24SlotE-b24SlotD, b32SlotD+isMap+cInhibit ; minor slot D <7> - tp bEyeOh24-b24SlotE, b32SlotE+isMap+cInhibit ; minor slot E <7> - tp bTop24Less1-bEyeOh24+1, bEyeOh32+isMap+cInhibit ; i/o <7> - -Template24RBVe ; <11> - tp bRom24-bRam, isRAM ; RAM - tp b24Slot9-bRom24, isROM24 ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+cInhibit ; minor slot 9 - tp b24SlotB-b24SlotA, b32SlotA+isMap+cInhibit ; minor slot A - tp b24SlotC-b24SlotB, b32SlotB+isMap+cInhibit ; minor slot B - tp b24SlotD-b24SlotC, b32SlotC+isMap+cInhibit ; minor slot C - tp RBVWrap24e-b24SlotD, b32SlotD+isMap+cInhibit ; minor slot D - tp RBVBase24e-RBVWrap24e, isVidWrap ; wrap area - tp RBVEnd24e-RBVBase24e, isVideo ; frame buffer area - tp bEyeOh24-RBVEnd24e, isVoid ; invalid - tp bTop24Less1-bEyeOh24+1, bEyeOh32+isMap+cInhibit ; i/o - -Template24Orwell ; <7> - tp bRom24-bRam, isRAM+c040CopyBack ; RAM <16> - tp b24Slot9-bRom24, isROM24+c040CopyBack ; ROM <16> - tp b24SlotA-b24Slot9, b32Slot9+isMap+c040InhibitNonSer ; minor slot 9 <16> - tp b24SlotB-b24SlotA, b32SlotA+isMap+c040InhibitSer ; minor slot A <16> - tp b24SlotC-b24SlotB, b32SlotB+isMap+c040InhibitSer ; minor slot B <16> - tp b24SlotD-b24SlotC, b32SlotC+isMap+c040InhibitSer ; minor slot C <16> - tp b24SlotE-b24SlotD, b32SlotD+isMap+c040InhibitSer ; minor slot D <16> - tp bEyeOh24-b24SlotE, b32SlotE+isMap+c040InhibitSer ; minor slot E <16> - tp IOMaxSize,bRealEyeOh32+isMap+c040InhibitSer ; serialized i/o - tp IOMaxSize,bNonSerEyeOh+isMap+c040InhibitNonSer ; nonserialized i/o - tp bTop24Less1-(bEyeOh24+(2*IOMaxSize))+1, isVoid ; void - tp bTop32Less1-bTop24Less1+1, isWrap24 ; 24-bit wrap area - -Template24Jaws ; <9> - tp bRom24-bRam, isRAM ; RAM - tp b24Slot9-bRom24, isROM24 ; ROM <13> - tp LCDWrap24-b24Slot9, isVoid ; invalid <13> - tp LCDBase24-LCDWrap24, isVidWrap ; wrap area - tp LCDEnd24-LCDBase24, isVideoRAM ; frame buffer area - tp bEyeOh24-LCDEnd24, isVoid ; invalid - tp bTop24Less1-bEyeOh24+1, bEyeOh32+isMap+cInhibit ; i/o - -Template24MSC ; - tp bRom24-bRam, isRAM+FullTbl ; RAM - tp b24Slot9-bRom24, isROM24+FullTbl ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+cInhibit ; minor slot 9 - tp b24SlotB-b24SlotA, b32SlotA+isMap+cInhibit ; minor slot A - tp b24SlotC-b24SlotB, b32SlotB+isMap+cInhibit ; minor slot B - tp b24SlotD-b24SlotC, b32SlotC+isMap+cInhibit ; minor slot C - tp b24SlotE-b24SlotD, b32SlotD+isMap+cInhibit ; minor slot D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+cInhibit ; minor slot E - tp bTop24Less1-bEyeOh24+1, bRealEyeOh32+isMap+cInhibit ; i/o - -Template24MSC040 ; - tp bRom24-bRam, isRAM+c040CopyBack ; RAM - tp b24Slot9-bRom24, isROM24+c040CopyBack ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+c040InhibitSer ; minor slot 9 - tp b24SlotB-b24SlotA, b32SlotA+isMap+c040InhibitSer ; minor slot A - tp b24SlotC-b24SlotB, b32SlotB+isMap+c040InhibitSer ; minor slot B - tp b24SlotD-b24SlotC, b32SlotC+isMap+c040InhibitSer ; minor slot C - tp b24SlotE-b24SlotD, b32SlotD+isMap+c040InhibitSer ; minor slot D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+c040InhibitSer ; minor slot E - tp bTop24Less1-bEyeOh24+1, bRealEyeOh32+isMap+c040InhibitSer ; i/o - tp bTop32Less1-bTop24Less1+1, isWrap24 ; 24-bit wrap area - -Template24Niagra ; - tp bRom24-bRam, isRAM+FullTbl ; RAM - tp b24Slot9-bRom24, isROM24+FullTbl ; ROM - tp b24SlotC-b24Slot9, isVoid ; invalid - tp b24SlotD-b24SlotC, b32SlotC+isMap+cInhibit ; minor slot C - tp b24SlotE-b24SlotD, b32SlotD+isMap+cInhibit ; minor slot D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+cInhibit ; minor slot E - tp bTop24Less1-bEyeOh24+1, bRealEyeOh32+isMap+cInhibit ; i/o - -Template24SnraFrty ; - tp bRom24-bRam, isRAM+c040CopyBack ; RAM - tp b24Slot9-bRom24, isROM24+c040CopyBack ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+c040InhibitSer ; minor slot 9 - tp b24SlotB-b24SlotA, b32SlotA+isMap+c040InhibitSer ; minor slot A - tp b24SlotC-b24SlotB, $60B00000+isMap+c040InhibitNonSer ; Video RAM - tp b24SlotD-b24SlotC, b32SlotC+isMap+c040InhibitSer ; minor slot C - tp b24SlotE-b24SlotD, b32SlotD+isMap+c040InhibitSer ; minor slot D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+c040InhibitSer ; minor slot E - tp b24DblX-bEyeOh24, bRealEyeOh32+isMap+c040InhibitSer ; i/o - tp (bTop24Less1-b24DblX)+1, $FEE00000+isMap+c040InhibitSer ; Double X slot space - tp bTop32Less1-bTop24Less1+1, isWrap24 ; 24-bit wrap area - -Template24Sonora - tp bRom24-bRam, isRAM+FullTbl ; RAM - tp b24Slot9-bRom24, isROM24+FullTbl ; ROM - tp b24SlotA-b24Slot9, b32Slot9+isMap+cInhibit ; minor slot 9 - tp b24SlotB-b24SlotA, b32SlotA+isMap+cInhibit ; minor slot A - tp b24SlotC-b24SlotB, $60B00000+isMap+cInhibit ; Video RAM - tp b24SlotD-b24SlotC, b32SlotC+isMap+cInhibit ; minor slot C - tp b24SlotE-b24SlotD, b32SlotD+isMap+cInhibit ; minor slot D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+cInhibit ; minor slot E - tp b24DblX-bEyeOh24, bRealEyeOh32+isMap+cInhibit ; i/o - tp (bTop24Less1-b24DblX)+1, b24SlotE+isMap+cInhibit ; Double X slot space - -Template24YMCA ; - tp bRom24-bRam, isRAM+c040CopyBack ; RAM - tp b24Slot9-bRom24, isROM24+c040CopyBack ; ROM - tp b24SlotA-b24Slot9, $40900000 + isMap ; Slot 9 is 2nd meg of ROM. - tp b24SlotB-b24SlotA, b32SlotA+isMap+c040InhibitSer ; minor slot A - tp b24SlotC-b24SlotB, b32SlotB+isMap+c040InhibitSer ; minor slot B - tp b24SlotD-b24SlotC, b32SlotC+isMap+c040InhibitSer ; minor slot C - tp b24SlotE-b24SlotD, b32SlotD+isMap+c040InhibitSer ; minor slot D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+c040InhibitSer ; minor slot E - tp IOMaxSize,bRealEyeOh32+isMap+c040InhibitSer ; serialized i/o - tp IOMaxSize,bNonSerEyeOh+isMap+c040InhibitNonSer ; nonserialized i/o - tp bTop24Less1-(bEyeOh24+(2*IOMaxSize))+1, isVoid ; void - tp bTop32Less1-bTop24Less1+1, isWrap24 ; 24-bit wrap area - -Template24Pratt ; - tp bRom24-bRam, isRAM+c040CopyBack ; RAM - tp b24Slot9-bRom24, isROM24+c040CopyBack ; ROM - tp b24SlotA-b24Slot9, isVoid ; invalid - tp b24SlotC-b24SlotA, b32SlotC+isMap+c040InhibitSer ; minor slots A-B - tp b24SlotE-b24SlotC, isVoid ; minor slots C-D - tp bEyeOh24-b24SlotE, b32SlotE+isMap+c040InhibitSer ; minor slot E - tp bTop24Less1-bEyeOh24+1, bRealEyeOh32+isMap+c040InhibitSer ; i/o - -Void32 - tp HoleLowMem-bRam, isRAM ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRom32 - HoleSysHeap, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isThru+cInhibit ; slots - -Void32RBVb - tp HoleLowMem-bRam, isRAM ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRom32 - HoleSysHeap, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp RBVWrap32b-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots - tp RBVBase32b-RBVWrap32b, isVidWrap ; wrap area - tp RBVEnd32b-RBVBase32b, isVideo ; frame buffer area - tp (bTop32Less1-RBVEnd32b)+1, isThru+cInhibit ; rest of slots - -Void32RBVe - tp HoleLowMem-bRam, isRAM ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRom32 - HoleSysHeap, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp RBVWrap32e-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots - tp RBVBase32e-RBVWrap32e, isVidWrap ; wrap area - tp RBVEnd32e-RBVBase32e, isVideo ; frame buffer area - tp bTop32Less1-RBVEnd32e+1, isThru+cInhibit ; rest of slots - -Void32Orwell ; - tp HoleLowMem-bRam, isRAM+c040CopyBack ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRealRom32-HoleSysHeap, isRAM+c040CopyBack ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+c040CopyBack; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp bNonSerEyeOh-bRealEyeOh32, isThru+c040InhibitSer ; ser i/o - tp (bNonSerEyeOh+IOMaxSize)-bNonSerEyeOh, isThru+c040InhibitNonSer ; non-ser i/o - tp bRamDisk-(bNonSerEyeOh+IOMaxSize), isVoid ; Invalid - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp (bTop32Less1-(bRamDisk+EDskMaxSize))+1, isVoid ; slots (uses TTx regs) - -Void32Jaws ; <9> - tp HoleLowMem-bRam, isRAM ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRom32 - HoleSysHeap, isRAM ; RAM - tp bEyeOh32-bRom32, isROM32 ; ROM - tp bRamDisk-bEyeOh32, isThru+cInhibit ; i/o - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp LCDWrap32-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots - tp LCDBase32-LCDWrap32, isVidWrap ; wrap area - tp LCDEnd32-LCDBase32, isVideo ; frame buffer area - tp bTop32Less1-LCDEnd32+1, isThru+cInhibit ; rest of slots - -Void32MSC ; - tp HoleLowMem-bRam, isRAM+FullTbl ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRealRom32 - HoleSysHeap, isRAM+FullTbl ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32 ; ROM - tp b32VidBase-(bRealRom32+ROMMaxSize), isThru+cInhibit ; i/o - tp bRamDisk-b32VidBase, isVoid ; video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isVoid ; slots (uses TT1) - -Void32Sonora ; - tp HoleLowMem-bRam, isRAM+FullTbl ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRealRom32-HoleSysHeap, isRAM+FullTbl ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32 ; ROM - tp b32VidBase-(bRealRom32+ROMMaxSize), isThru+cInhibit ; I/O - tp bRamDisk-b32VidBase, isVoid ; Video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp (bTop32Less1-(bRamDisk+EDskMaxSize))+1, isVoid ; slots (uses TTx regs) - -Void32Niagra ; - tp HoleLowMem-bRam, isRAM+FullTbl ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRealRom32 - HoleSysHeap, isRAM+FullTbl ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32 ; ROM - tp b32VidBase-(bRealRom32+ROMMaxSize), isThru+cInhibit ; i/o - tp bRamDisk-b32VidBase, isVoid ; video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk ; Ram Disk - tp b32SlotE-(bRamDisk+EDskMaxSize), isThru+cInhibit ; slots thru E - tp (b32SlotF-DeclRomSize)-b32SlotE, isThru+cInhibit ; slot E up to config ROM - tp b32SlotF-(b32SlotF-DeclRomSize), bRealRom32+isMap+cInhibit; slot E Config ROM - tp bTop32Less1-b32SlotF+1, isThru+cInhibit ; slots - -TemplateFF24 ; CSS - tp FFbShadow-bRam, isRAM ; RAM - tp FFtRom24-FFbShadow, isThru ; ROM - tp t24SlotE-FFtRom24, b32SlotE+isMap+cInhibit ; Slot E - tp FFtEyeOh24-t24SlotE, isThru+cInhibit ; I/O space - tp FFtDblxSlot24-FFtEyeOh24, b24SlotE+isMap+cInhibit ; Slot E (64k), for DblX - tp bTop24Less1-FFtDblxSlot24+1, isThru+cInhibit ; rest of I/O space - -TemplateFF32 - tp FFbShadow-bRam, isRAM ; RAM - tp FFtShadow-FFbShadow, isThru ; Shadowed area - tp FFbRom32-FFtShadow, isRAM ; RAM - tp FFtRom32-FFbRom32, FFbRom24+isMap ; ROM - tp FFbEyeOh32-FFtRom32, isVoid ; unmapped space - tp FFtEyeOh32-FFbEyeOh32, bEyeOh24+isMap+cInhibit ; I/O space - tp FFtDblXSlot32-FFtEyeOh32, b24SlotE+isMap+cInhibit ; Slot E (64k), for DblX - tp bRAMDisk-FFtDblXSlot32, isThru+cInhibit ; bank switch reg in here - tp bRamDisk+EDskMaxSize-bRamDisk, isEdisk ; Ram Disk - tp bTop32Less1-(bRamDisk+EDskMaxSize)+1, isThru+cInhibit ; Rest of slot space - -Void32YMCA ; CSS - tp HoleLowMem-bRam, isRAM+c040CopyBack ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRealRom32-HoleSysHeap, isRAM+c040CopyBack ; RAM - tp (bRealRom32+ROMMaxSize)-bRealRom32, isROM32+c040CopyBack; ROM - tp bRealEyeOh32-(bRealRom32+ROMMaxSize), isVoid ; Invalid - tp bNonSerEyeOh-bRealEyeOh32, isThru+c040InhibitSer ; ser i/o - tp (bNonSerEyeOh+IOMaxSize)-bNonSerEyeOh, isThru+c040InhibitNonSer ; non-ser i/o - tp bRamDisk-(bNonSerEyeOh+IOMaxSize), isVoid ; Invalid - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp (bTop32Less1-(bRamDisk+EDskMaxSize))+1, isVoid ; slots (uses TTx regs) - -Void32Pratt ; - tp HoleLowMem-bRam, isRAM+c040CopyBack ; low memory: RAM - tp HoleSysHeap - HoleLowMem, isVoid ; black hole - tp bRom32 - HoleSysHeap, isRAM+c040CopyBack ; RAM - tp (bRom32+ROMMaxSize)-bRom32, isROM32 ; ROM - tp b32VidBase-(bRom32+ROMMaxSize), isThru+c040InhibitSer ; i/o - tp bRamDisk-b32VidBase, isVoid ; video (uses TT0) - tp (bRamDisk+EDskMaxSize)-bRamDisk, isEdisk+c040CopyBack ; Ram Disk - tp b32SlotE-(bRamDisk+EDskMaxSize), isThru+c040InhibitSer ; slots thru E - tp (b32SlotF-DeclRomSize)-b32SlotE, isThru+c040InhibitSer ; slot E up to config ROM - tp b32SlotF-(b32SlotF-DeclRomSize), bRom32+c040InhibitSer ; slot E Config ROM - tp bTop32Less1-b32SlotF+1, isThru+c040InhibitSer ; slots - ;----- ; The physical template tables describe the significant sections of the pysical address space. ; These templates are used ONLY to generate the 'physical table', which is passed to VM and @@ -1018,752 +558,8 @@ firstEntry DS.B PhysicalSpaceBlock ; first in variable-sized table ENDIF -physNormal dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40000000, $10000000 - dc.l $40000000, $10000000 - dc.l $00800000, $00100000 ; - - dc.w kUsageIO, notCacheable - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l $00F00000, $00100000 - - dc.w kUsageMajorSlot, notCacheable - dc.l $60000000, $10000000 - dc.l $60000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $90000000, $10000000 - dc.l $90000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $B0000000, $10000000 - dc.l $B0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable - dc.l $F9000000, $01000000 - dc.l $F9000000, $01000000 - dc.l $00900000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FB000000, $01000000 - dc.l $FB000000, $01000000 - dc.l $00B00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageEndTable - -;--- -; Max size of buffer for physical table = size of above fized stuff, plus entries for -; max # of RAM chunks, plus video and video wrapping space, plus bootglobals space <3.2> -; plus a few more just to be safe. <3.2> -;--- - -physBufSize equ *-physNormal + (sgMaxChunks+6) * PhysicalSpaceBlock.size ; CSS ;<3.2> - - -;--- -; Physical table for RBV in Slot B <9> -;--- - -physRBVb dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40000000, $10000000 - dc.l $40000000, $10000000 - dc.l $00800000, $00100000 - - dc.w kUsageIO, notCacheable - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l $00F00000, $00100000 - - dc.w kUsageMajorSlot, notCacheable - dc.l $90000000, $10000000 - dc.l $90000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable - dc.l $F9000000, $01000000 - dc.l $F9000000, $01000000 - dc.l $00900000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageEndTable - - -;--- -; Physical table for RBV in Slot E <11> -;--- - -physRBVe dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40000000, $10000000 - dc.l $40000000, $10000000 - dc.l $00800000, $00100000 - - dc.w kUsageIO, notCacheable - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l $00F00000, $00100000 - - dc.w kUsageMajorSlot, notCacheable - dc.l $90000000, $10000000 - dc.l $90000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $B0000000, $10000000 - dc.l $B0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable - dc.l $F9000000, $01000000 - dc.l $F9000000, $01000000 - dc.l $00900000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FB000000, $01000000 - dc.l $FB000000, $01000000 - dc.l $00B00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageEndTable - -;--- -; Physical table for 68030 LCD portables <9> <17> HJR -;--- - -physLCD dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40000000, $10000000 - dc.l $40000000, $10000000 - dc.l $00800000, $00100000 - - dc.w kUsageIO, notCacheable - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l $00F00000, $00100000 - - dc.w kUsageEndTable - -;--- -; Physical table for MSC-based portables -;--- - -physMSC dc.w kUsageRAM, cacheable ; RAM - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable ; ROM - dc.l $40800000, ROMMaxSize - dc.l $40800000, ROMMaxSize - dc.l $00800000, ROMMaxSize - - dc.w kUsageIO, notCacheable ; I/O - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l $00F00000, $00100000 - - dc.w kUsageOnboardVideo, notCacheable ; LCD video - dc.l $60000000, $10000000 - dc.l $60000000, $10000000 - dc.l $00000000, $00000000 - - dc.w kUsageMajorSlot, notCacheable ; slot 9 - dc.l $90000000, $10000000 - dc.l $90000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable ; slot A - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable ; slot B - dc.l $B0000000, $10000000 - dc.l $B0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable ; slot C in docking station - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable ; slot D in docking station - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable ; slot E (PDS docking connector) - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable ; slot 9 - dc.l $F9000000, $01000000 - dc.l $F9000000, $01000000 - dc.l $00900000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot A - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot B - dc.l $FB000000, $01000000 - dc.l $FB000000, $01000000 - dc.l $00B00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot C in docking station - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot D in docking station - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot E (PDS docking connector) - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageEndTable - -;--- -; Physical table for Niagra LCD portables -;--- - -physNiagra dc.w kUsageRAM, cacheable ; - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable ; ROM - dc.l $40800000, ROMMaxSize - dc.l $40800000, ROMMaxSize - dc.l $00800000, ROMMaxSize - - dc.w kUsageIO, notCacheable ; I/O - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l $00F00000, $00100000 - - dc.w kUsageOnboardVideo, notCacheable ; LCD video - dc.l $60000000, $10000000 - dc.l $60000000, $10000000 - dc.l $00000000, $00000000 - - dc.w kUsageMinorSlot, notCacheable ; slot C - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot D - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot E up to declaration ROM - dc.l $FE000000, $01000000-DeclRomSize - dc.l $FE000000, $01000000-DeclRomSize - dc.l $00E00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable ; slot E declaration ROM (VSCDeclData) - dc.l $40800000, DeclRomSize - dc.l $FF000000-DeclRomSize, DeclRomSize - dc.l $00000000, $00000000 - - dc.w kUsageEndTable - -;--- -; Physical table for Orwell Based machines -;--- - -physOrwell dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40800000, ROMMaxSize - dc.l $40800000, ROMMaxSize - dc.l $00800000, ROMMaxSize - - dc.w kUsageIO, notCacheable - dc.l $50F00000, IOMaxSize - dc.l $50F00000, IOMaxSize - dc.l $00F00000, IOMaxSize - - dc.w kUsageIO, notCacheable ; ¥¥temp¥¥ - dc.l $50F40000, IOMaxSize ; should be nonserialized - dc.l $50F40000, IOMaxSize - dc.l $00F40000, IOMaxSize - - dc.w kUsageMajorSlot, notCacheable - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $B0000000, $10000000 - dc.l $B0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageOnboardVideo, notCacheable - dc.l $F9000000, $01000000 - dc.l $F9000000, $01000000 - dc.l $00900000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FB000000, $01000000 - dc.l $FB000000, $01000000 - dc.l $00B00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageEndTable - -physSonora dc.w kUsageRAM, cacheable ; Special Cased for Double X Slot E - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40800000, ROMMaxSize - dc.l $40800000, ROMMaxSize - dc.l $00800000, ROMMaxSize - -; dc.w kUsageROM, cacheable ; ROM -; dc.l $40000000, $10000000 -; dc.l $40000000, $10000000 -; dc.l $00800000, $00100000 - - dc.w kUsageIO, notCacheable ; - dc.l $50000000, $10000000 ; Don't map all of I/O Space - dc.l $50000000, $00FC0000 ; because of Double Exposure Card - dc.l $00F00000, $000C0000 - - dc.w kUsageOnboardVideo, notCacheable ; Video Space - dc.l $60000000, $01000000 ; - dc.l $60000000, $01000000 ; - dc.l $00B00000, $00100000 - - dc.w kUsageMajorSlot, notCacheable - dc.l $90000000, $10000000 - dc.l $90000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $B0000000, $10000000 - dc.l $B0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable - dc.l $F9000000, $01000000 - dc.l $F9000000, $01000000 - dc.l $00900000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageOther, notCacheable ; Double X accesses slot E - dc.l $FEE00000, $40000 ; with addresses in the range - dc.l $50FC0000, $40000 ; $50FC0000-$50100000 - dc.l $00FC0000, $40000 ; - - dc.w kUsageEndTable - -;¥¥¥ Begin CSS Cyclone Roll-in. -;----- -; Physical table for Foster Farms -;--- - -physFF dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $00A00000, $00100000 - dc.l $40A00000, $00100000 - dc.l $00A00000, $00100000 - - dc.w kUsageROM, cacheable - dc.l $00B00000, $00100000 - dc.l $40B00000, $00100000 - dc.l $00B00000, $00100000 - - dc.w kUsageROM, cacheable ; define 2 Mb addtional ROM - dc.l $00C00000, $00100000 ; - dc.l $40C00000, $00100000 ; - dc.l $00C00000, $00100000 ; - - dc.w kUsageROM, cacheable ; - dc.l $00D00000, $00100000 ; - dc.l $40D00000, $00100000 ; - dc.l $00D00000, $00100000 ; - - dc.w kUsageIO, notCacheable - dc.l $00F00000, FFIOMax - dc.l $50F00000, FFIOMax - dc.l $00F00000, FFIOMax - - dc.w kUsageMajorSlot, notCacheable - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageOther, notCacheable ; Double X accesses slot E - dc.l $00E00000, DblXSlotMax ; with addresses in the range - dc.l $50FC0000, DblXSlotMax ; $50FC0000-$50CFFFFF - dc.l $00FC0000, DblXSlotMax ; - - dc.w kUsageEndTable ; - -;--- -; Physical table for YMCA Based machines -;--- - -physYMCA dc.w kUsageRAM, cacheable - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable - dc.l $40800000, ROMMaxSize - dc.l $40800000, ROMMaxSize - dc.l $00800000, ROMMaxSize - - dc.w kUsageOnboardVideo, notCacheable - dc.l $50100000, VRAMMaxSize - dc.l $50100000, VRAMMaxSize - dc.l 0, 0 - - dc.w kUsageIO, notCacheable - dc.l $50036000, $00002000 - dc.l $50036000, $00002000 - dc.l 0, 0 - - dc.w kUsageIO, notCacheable - dc.l $50F00000, IOMaxSize - dc.l $50F00000, IOMaxSize - dc.l $00F00000, IOMaxSize - - dc.w kUsageMajorSlot, notCacheable - dc.l $A0000000, $10000000 - dc.l $A0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $B0000000, $10000000 - dc.l $B0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $C0000000, $10000000 - dc.l $C0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $D0000000, $10000000 - dc.l $D0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMajorSlot, notCacheable - dc.l $E0000000, $10000000 - dc.l $E0000000, $10000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FA000000, $01000000 - dc.l $FA000000, $01000000 - dc.l $00A00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FB000000, $01000000 - dc.l $FB000000, $01000000 - dc.l $00B00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FC000000, $01000000 - dc.l $FC000000, $01000000 - dc.l $00C00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FD000000, $01000000 - dc.l $FD000000, $01000000 - dc.l $00D00000, $00100000 - - dc.w kUsageMinorSlot, notCacheable - dc.l $FE000000, $01000000 - dc.l $FE000000, $01000000 - dc.l $00E00000, $00100000 - - dc.w kUsageEndTable - -;¥¥¥ End CSS Cyclone roll-in - -;--- -; Physical table for Pratt LCD portables -;--- - -physPratt dc.w kUsageRAM, cacheable ; - dc.l 0, 0 - dc.l 0, 0 - dc.l 0, 0 - - dc.w kUsageROM, cacheable ; ROM - dc.l $40000000, ROMMaxSize - dc.l $40000000, ROMMaxSize - dc.l 0,0 - - dc.w kUsageIO, notCacheable ; I/O - dc.l $50000000, $10000000 - dc.l $50000000, $10000000 - dc.l 0,0 - - dc.w kUsageOnboardVideo, notCacheable ; LCD video - dc.l $60000000, $10000000 - dc.l $60000000, $10000000 - dc.l 0,0 - - dc.w kUsageMajorSlot, notCacheable ; PDS, major slots A-B - dc.l $A0000000, $20000000 - dc.l $A0000000, $20000000 - dc.l 0, 0 - - dc.w kUsageMinorSlot, notCacheable ; PDS, minor slots A-B - dc.l $FA000000, $02000000 - dc.l $FA000000, $02000000 - dc.l 0,0 - - dc.w kUsageMinorSlot, notCacheable ; slot E up to declaration ROM - dc.l $FE000000, $01000000-DeclRomSz - dc.l $FE000000, $01000000-DeclRomSz - dc.l 0,0 - - dc.w kUsageMinorSlot, notCacheable ; slot E up to declaration ROM - dc.l $402e0000-DeclRomSz, DeclRomSz - dc.l $FF000000-DeclRomSz, DeclRomSz - dc.l 0,0 - - dc.w kUsageEndTable - ;----- -; MMUError - unrecoverable error discovered while setting up MMU. -;--- -MMUError move.w #102,d6 ; minor error code = MMU setup error <3.2> - move.l #$0F,d7 ; major error code = NuMac error <3.2> - bigjmp Critical,a0 ; ugly tone, service call needed... - - -;----- -; InitMMU - sets up the MMU depending on what memory controller we are running and +; InitMMU 7a20 - sets up the MMU depending on what memory controller we are running and ; what chunks of RAM were found by StartTest. ; ; Entry @@ -1847,11 +643,6 @@ InitMMU link a5,#InitSize ; set up stack frame bsr SetupGlobals ; set up stack frame, boot globals bsr FindInfo ; get ptr to MMU setup info ; returns a0 = 32 bit info ptr, a1 = 24 bit ptr - cmpi.b #EMMU1,sgTypeMMU(A6) ; Do we have an Emulated MMU? (ie don't make tables) - beq.s @NoTables ; -> Yes, bail out now! - cmp.b #HMMU,sgTypeMMU(a6) ; CSS check type of MMU - bne.s @isPmmu ; IF HMMU -@noTables movem.l SaveURegs(a5),UnivRegs ; restore universal registers IF forRomulator THEN ; TestInRAM A2 ; check if running ROM image in RAM | @@ -1864,179 +655,9 @@ InitMMU link a5,#InitSize ; set up stack frame move.l a6,a4 ; return ptr to BootGlobs unlk a5 ; remove stack frame rts ; EXITROUTINE -@isPmmu ; ENDIF - move.l a1,a4 ; save ptr to 24 bit mode MMU setup info - move.l a0,a2 ; save ptr to 32 bit mode MMU setup info - bsr MakePhysicalTable ; create physical space table (for VM et. al.) - move.l a2,a0 ; recall ptr to 32 bit mode info - bsr MakeTable ; make 32 bit translation table - lea sg32Info(a6),a1 ; point at 32 bit mode info in BootGlobs CSS - bsr SaveMMUInfo ; move 32 bit info to BootGlobs CSS - btst #MMStartMode,sgMMFlags(a6);check if we're booting 32 bit only CSS - bne.s @modesOK ; IF not booting 32 only - move.l a4,a0 ; recall addr 24 bit mode MMU setup Info - move.l a4,a2 ; recall addr 24 bit mode MMU setup Info - bsr MakeTable ; make a translation table -@modesOK ; ENDIF - lea sg24Info(a6),a1 ; point at 24 bit mode info in BootGlobs CSS - bsr SaveMMUInfo ; move 24 (or 32) bit info to BootGlobs -@done ; ENDIF - - bsr CleanupGlobals ; tidy up, leaving registers as follows: - ; a2 - InitMMU's logical return address - ; a3 - points to tc in MMUConfigInfo - ; a4 - logical ptr to BootGlobs - ; d3 - ROM physical-2-logical conversion constant - ; sp - midway thru useable logical RAM - ; d0-d2/d7/a0-a1 restored (DON'T TOUCH!) ;----- -; The following code actually enables the MMU. Since enabling the MMU may change the -; address of the code that actually does it (if it is running in RAM under Romulatorª), -; we take precautions to ensure that both the 'pmove tc' and the 'jmp to the new logical -; address' are both in the 020/030 instruction cache. We can then jump to our new -; logical pc without fetching anything from the old pc, which is invalid once the pmove -; is executed. The same principle applies to the 040 'MOVEC URP', 'MOVEC TC' code. <2> -; -; We preload the instruction cache by executing the code snippet twice, passing in the Z -; condition code flag to determine whether to run the pmove or not. Since the pmove is -; 4 bytes, if we ensure that it is on a non-longword boundary, it will always be prefetched -; and cached by the 020 on the first pass thru the code. -; -; It is important the the transparent translation registers be set up before the MMU <7> -; is enabled, since we get the values for the TT regs using a3, which may become <7> -; invalid once the MMU is enabled. This will also work with Romulatorª, since <7> -; we are already executing out of phyiscal space, which will not be affected by <7> -; transparent translation. <7> -; -; This routine assumes that the MMU is NOT enabled when called on a system with a <3.8> -; 68851 PMMU. <3.8> -;--- - -VTEntries equ 64 ; entries in exception vector table CSS - - IF forRomulator THEN ; <3.8> - biglea baseOfRom,a5 ; get physical base of ROM <3.8> - move.l a5,d6 ; save it to adjust pointers later <3.8> - ENDIF ; <3.8> - - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 <2><3> - beq.s @enable040MMU ; YES ... go enable 040 MMU <2> - - pflusha ; flush address translation cache <16> -;¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ CSS -; For LC since all addresses are mapped straight thru, (i.e. no address translation takes place) -; 00AxXXXX is a valid address in 32 or 24 bit modes but on Foster Farms trying to access the ROM -; at 00AxXXXX will generate a bus error in 32 bit mode once the MMU is turned on. Therefore we -; must adjust all ptrs that have already been set up to pt at 40AxXXXX. Note: this address is -; also valid in 24 bit mode since the upper 8 bits of the address are ignored in this mode. -; Remember, D3 contains the ROM physical-2-logical conversion constant. -;¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ - add.l d3,a0 ; adjust ptr to base addrs - add.l d3,a1 ; adjust ptr to productInfo rec - - movec vbr,a5 ; get address of vectors - move.w #VTEntries-1,d5 ; get number of entries to adjust -@adj add.l d3,(a5)+ ; convert a vector - dbra d5,@adj ; do all of them - -;¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ CSS - movec cacr,d5 ; NO ... get cache control reg - ori.w #$0808,d5 ; set flush bits (also set ccr.z = 0, for no pmove) - movec d5,cacr ; flush instruction, data caches - pmove theTT0-theTC(a3),tt0 ; load the transparent translation regs <7> - pmove theTT1-theTC(a3),tt1 ; BEFORE we fire up the MMU <7> - lea theCRP-theTC(a3),a6 ; get address of CRP <3.8> - lea @return1,a5 ; get 1st return addr - bra.s @inIcache ; load tc enable code into i-cache <3.8> -@return1 lea @mmuEnabled,a5 ; get 2nd return addr <3.8> - add.l d3,a5 ; add in phys-to-log conversion constant <3.8> - moveq #0,d5 ; set ccr.z = 1, so pmove gets executed - IF NOT forRomulator THEN ; Do not set the VBR to 0 if this is a ReAnimator build - movec d5,vbr ; restore vector base reg <3.8> - ENDIF ; - bra.s @inIcache ; go enable the mmu, return from InitMMU <3.8> - nop ; appease the assembler gods - ALIGN 4 ; <3.8> -@inIcache bne.s @step ; (2 bytes) IF second time thru - pmove (a6),crp ; (4 bytes) set up 32 bit mode crp <3.8> -@step nop ; (2 bytes) aligns next pmove to odd-word <3.8> - bne.s @goBack ; (2 bytes) IF second time thru <3.8> - pmove (a3),tc ; (4 bytes) enable the MMU -@goBack jmp (a5) ; (2 bytes) ENDIF - return - -@mmuEnabled - - IF 0 THEN - IF forRomulator THEN ; <3.8> - TestInRam a5 ; running in RAM? <3.8> - beq.s @noAdj ; if not, don't adjust pointers <3.8> - move.l ROMBase,d5 ; get correct base of ROM <3.8> - sub.l d6,d5 ; make d5 a phys-to-log offset <3.8> - add.l d5,a0 ; adjust ptr to base addrs <3.8> - add.l d5,a1 ; adjust ptr to productInfo rec <3.8> -@noAdj ; <3.8> - ENDIF ; <3.8> - ENDIF - jmp (a2) ; get InitMMU return addr <3.8> - - -;----- -; Enable the MMU on a 68040. -; -; Flush both caches. Use a CPUSHA instead of a CINVA, since CINVA does not flush <2> -; dirty entries to memory. N.B. - the CPUSHA IC generated by the operand does <2> -; NOT flush out the inst. cache, but instead performs the same action as a CINVA IC. <2> -; This is because in the 040, there won't BE any "dirty" entries in the inst. cache. <2> -; -; Since the Mac OS does not distinguish between instruction and data space, we must <7> -; duplicate the values placed in the instruction and data transparent translation <7> -; registers. <7> -;----- - MACHINE MC68040 ; The use of 040 instructions requires this <2> - -@enable040MMU ; <2> - - IF forRomulator THEN ; - biglea baseOfRom,a5 ; get physical base of ROM - MACHINE MC68040 ; corrects for ASM bug w/040 directive - move.l a5,d6 ; save it to adjust pointers later - ENDIF ; - - pflusha ; flush address translation cache <16> - move.l theTT0-theTC(a3),d5 ; get transparent translation reg 0 value <7> - movec d5,itt0 ; load the instruction TT0 reg <7> - movec d5,dtt0 ; load the data TT0 reg with the same value <7> - move.l theTT1-theTC(a3),d5 ; get transparent translation reg 1 value <7> - movec d5,itt1 ; load the instruction TT0 reg <7> - movec d5,dtt1 ; load the data TT0 reg with the same value <7> - moveq #0,d5 ; set ccr.z=1, to put enable code in cache <7> - lea @return0,a5 ; get 1st return addr <2> - bra.s @cachedEnableCode ; load TC enable code into i-cache <2> -@return0 lea @mmuEnabled,a5 ; get 2nd return addr <2> - add.l d3,a5 ; add in phys-to-log conversion constant <2> - if NOT forRomulator THEN ; <16> - movec d5,vbr ; restore vector base reg to zero <16> - endif ; <16> - move.l theSRP-theTC(a3),a6 ; retrieve 040 SRP value <7> - move.l (a3),d5 ; retrieve 040 TC value in lsw (ccr.z=0) <2> - bra.s @cachedEnableCode ; go enable the MMU, return from InitMMU <2> - - ALIGN 16 ; force onto Cache Line boundary <2> -@cachedEnableCode - beq.s @aJMP ; (2 bytes) IF second time thru, fall thru <2> - movec a6,SRP ; (2 bytes) set up 32 bit mode SRP <7> - movec d5,TC ; (2 bytes) enable the MMU <2> -@aJMP jmp (a5) ; (2 bytes) ENDIF - return <2> - -; ----------------------------------------------------------------------------------- <2> - - MACHINE MC68030 ; return to prior MACHINE directive <2> - -; ----------------------------------------------------------------------------------- <2> - -;----- -; SetupGlobals - sets up the InitMMU stack frame and the BootGlobals record that is passed +; SetupGlobals 7a38 - sets up the InitMMU stack frame and the BootGlobals record that is passed ; back to StartInit. ; ; Entry: @@ -2069,7 +690,7 @@ SetupGlobals move.l ROMPhysAddr(a0),d0 ; use it instead of computed value @SavePhys move.l d0,physRomBase(a5) ; save it in our globals - bsr GetMMUType ; figure out what kind of MMU we have + moveq.l #6,d0 ; figure out what kind of MMU we have move.b d0,sgTypeMMU(a6) ; save MMU type in BootGlobs CSS clr.l VRAMSize(a5) ; assume no onboard video <9> clr.l VRAMrealSize(a5) ; assume no onboard video <9> @@ -2086,42 +707,15 @@ SetupGlobals clr.b sgEDiskStealFlag(a6) ; assume no chunks to steal move.l #-1,eDiskChunks(a5) ; make eDisk chunk table empty too - lea sgBottom,a0 ; assume we'll start allocating below BootGlobs CSS + lea $FFFFFFA4,a0 move.l a0,sgAllocOff(a6) ; save allocation offset CSS - move.b #ramDiskPramAddr,d0 ; get PRAM address of memory manager flags - bsr ReadPRAMByte ; read it and weep... - andi.l #$ff,d0 ; clear upper bytes of pram byte - beq.s @noEdisk ; IF we want an Edisk THEN clr.l d3 ; clear counter - cmpi.b #EMMU1,sgTypeMMU(A6) ; DO we have an EMMU? (have we already stolen RAM for the EDisk?) - bne.s @countRAM ; -> Nope, parse the tables - move.l sgTestSpace+24(a6),d1 ; Get the amount of bytes allocated by SizeMem for the EDisk - bra.s @saveSize ; join the rest of the code (if D1=0 then no EDisk) - -@countRAM lea sgRamTable+4(a6),a0 ; get pointer to size of the first chunk | CSS -@countLoop ; LOOP (to count RAM chunk sizes) v - add.l (a0)+,d3 ; bump RAM counter - tst.l (a0)+ ; is this the last chunk? - bpl.s @countLoop ; UNTIL (we reach the last chunk) -@gotSize lsr.l #8,d3 ; get chunk size - mulu.l d3,d0 ; calc size of edisk - add.l #$7fff,d0 ; bump edisk past next 32k boundary - and.w #$8000,d0 ; round down to the boundary ^ - cmp.l #MinRamDiskSize,d0 ; check ram disk size | - blo.s @noEdisk ; >>EXIT if edisk is too small - cmp.l #MaxRamDiskSize,d0 ; check upper size limit - bhi.s @noEdisk ; >>EXIT is edisk to too big - move.l d0,d1 ; copy the size into D1 - move.b #1,sgEDiskStealFlag(a6) ; signal that we want to steal chunks from RAM - lea sgRamTable(a6),a0 ; source = chunk table in BootGlobs CSS - lea eDiskChunks(a5),a1 ; destination = edisk chunk table - bsr stealChunks ; try to steal some ram from main memory -@saveSize ; + ; move.l d1,sgRamDiskSize(a6) ; save size of eDisk in boot globals CSS @noEdisk ; ENDIF - + lea sgRamTable(a6),a0 ; source = chunk table in BootGlobs CSS lea globChunks(a5),a1 ; destination = our globals bsr CopyChunks ; copy RAM chunks to our globals @@ -2130,27 +724,18 @@ SetupGlobals ; a0 = top highest bank, d1 = total RAM sub.l a0,d1 ; normal phys-to-log offset = total - top - move.b #MMPRAMloc**$FF,d0 ; get PRAM address of memory manager flags - bsr ReadPRAMByte ; read it and weep... <5> + moveq.l #0,d0 - IF NOT Supports24Bit THEN ; rb rb +; IF NOT Supports24Bit THEN ; rb rb + bset #mmFigEnable,d0 ; Force 32-bit mode until we make room for a 2 meg rom kc ¥¥¥¥ bset #MMStartMode,d0 ; Force 32-bit mode until we make room for a 2 meg rom kc ¥¥¥¥ bset #MMMixed,d0 ; Force 32-bit mode until we make room for a 2 meg rom kc ¥¥¥¥ bset #MMSysheap,d0 ; Force 32-bit mode until we make room for a 2 meg rom kc ¥¥¥¥ bset #MMROZheap,d0 ; Force 32-bit mode until we make room for a 2 meg rom kc ¥¥¥¥ - bclr #mmHighSysHeap,d0 ; Force 32-bit mode until we make room for a 2 meg rom kc ¥¥¥¥ - ENDIF ; rb + +; ENDIF ; rb - btst #MMStartMode,d0 ; check for 32 bit only - bne.s @not24 ; IF not 32 bit only - bclr #mmHighSysHeap,d0 ; weird system heap is a bad idea - bra.s @modeOk ; ... -@not24 btst #mmHighSysHeap,d0 ; ELSEIF 'black hole' before system heap - beq.s @modeOk ; . - add.l #HoleSysHeap-HoleLowMem,d1 ; phys-to-log offset = (total-top) + - ; .(new base system heap - ram for lowmem) -@modeOk ; ENDIF move.b d0,sgMMFlags(a6) ; save memory mgr flags in BootGlobs CSS move.l d1,sgPhys2Log(a6) ; save physical-to-logical offset CSS rts @@ -2158,7 +743,7 @@ SetupGlobals ENDWITH ; {DecoderInfo} ;_____________________________________________________________________________________________ -; Routine ReadPRAMByte +; Routine ReadPRAMByte 7ada ; ; Inputs: D0 - byte # to read from PRAM ; A5 - local frame pointer for InitMMU @@ -2184,7 +769,7 @@ ReadPRAMByte rts ;_____________________________________________________________________________________________ -; CleanupGlobals +; CleanupGlobals 7b04 ; ; Fixes up the RAM entries in the physical space table to account for total space ; occupied by boot globals and mmu tables. Restores the 'universal' registers that were @@ -2239,14 +824,6 @@ CleanupGlobals ENDIF ; add.l sgAllocOff(a6),d0 ; get logical address top useable memory CSS - btst.b #mmHighSysHeap,sgMMFlags(a6); check if 'black hole' before system heap CSS - beq.s @noHole ; IF 'black hole' - move.l d0,sp ; temporarily set new logical stack ptr there - sub.l #HoleSysHeap-HoleLowMem,d0 ; adjust amount of useable logical memory - lsr.l #1,d0 ; divide amt useable logical memory by 2 - suba.l d0,sp ; stack = middle of useable logical memory - bra.s @donestak ; . -@noHole ; ELSE cmp.l #$200000,d0 ; do we have at least two meg of RAM? <5> bge.s @plentyORam ; IF we have less than two meg THEN <5> lsr.l #2,d0 ; divide amt useable logical memory by 4 <5> @@ -2256,7 +833,6 @@ CleanupGlobals move.l #defStackAddr,d0 ; use default stack size <5> @stakOk ; ENDIF move.l d0,sp ; set new stack -@doneStak ; ENDIF biglea BaseOfROM,a1 ; get physical base address of ROM move.l logRomBase(a5),d3 ; get future logical base addr ROM @@ -2270,7 +846,7 @@ CleanupGlobals jmp (a5) ; return to caller ;----- -; SaveMMUInfo - save tc, tt0, tt1, create and save crp +; SaveMMUInfo 7b86 - save tc, tt0, tt1, create and save crp ; ; Entry: d0 has 1st longword of crp ; a0 points to translation table @@ -2291,40 +867,15 @@ SaveMMUInfo move.l newtc(a2),theTC(a1) ; move tc ;----- -; GetMMUType - figure out what kind of MMU we have -; -; Entry -; a5 - points to InitMMU globals -; d7 - bits 31-16: logic board type -; d7 - bits 15-0: cpu type (0 = 68000, 1 = 68010, 2 = 68020, 3 = 68030, 4 = 68040, etc.) <2> -; -; Exit -; d0.b - type of MMU -; -; Destroys d1-d2/a0-a1 +; MMUError 7bac - unrecoverable error discovered while setting up MMU. ;--- - -MMUTypes ; CPU type -> MMU type mapping - dc.b NoMMU ; 68000 - no MMU - dc.b NoMMU ; 68010 - no MMU - dc.b HMMU ; 68020 - HMMU or 68851 - dc.b PMMU030 ; 68030 - '030 MMU - dc.b PMMU040 ; 68040 - '040 MMU <2> -MaxCPU equ *-MMUTypes-1 ; highest CPU flag supported - -GetMMUType cmp.w #MaxCPU,d7 ; check if CPU type is in range - bhi MMUError ; if outta range, we're hosed - moveq #0,d0 ; clear a reg - move.b MMUTypes(d7),d0 ; get MMU type, based on CPU type - - move.l prodInfoPtr(A5),A0 ; Get ptr to productInfo table - btst #ProductInfo.has68kEmulator//8,ProductInfo.ExtValid1+3(A0) - beq.s @done ; -> No emu. MMU type is correct. - moveq #EMMU1,D0 ; Set the MMU type to EmuMMU cause we're emulation an 020. -@done rts +MMUError move.w #102,d6 ; minor error code = MMU setup error <3.2> + move.l #$0F,d7 ; major error code = NuMac error <3.2> + bra.l Critical + ;----- -; CopyChunks - copies a RAM chunk table, skipping zero sized chunks, remembering +; CopyChunks 7bb8 - copies a RAM chunk table, skipping zero sized chunks, remembering ; the smallest one, and accumulating the total size of all the chunks. ; ; Entry @@ -2365,91 +916,6 @@ CopyChunks movem.l CopyRegs,-(sp) ; save work regs rts -;----- -; StealChunks - Steals chunks from the end of a chunk table and moves them to -; another table. Also copies the original Boot Globs from the end -; of the original last chunk to the "new" last chunk of main memory. -; -; Entry -; a0 - points to source table of chunks -; a1 - points to destination table of chunks -; d0 - amount of RAM to steal -; -; Exit -; d1.l - total size of memory stolen, else zero upon failure -; a6.l - new boot globs pointer if RAM was stolen -; -; Destroys -; a1-a3 -;----- -MinBootGlobs equ $00080000 ; 512k: boot globs min size - -StealRegs REG d2-d5/a4 - -StealChunks - movem.l StealRegs,-(sp) ; save work regs - move.l a0,a2 ; get addr of source chunks - move.l a1,a3 ; get addr of dest chunks - move.l d0,d2 ; get number of bytes to steal - clr.l d3 ; clear RAM size count -@findEndLoop ; LOOP (to find end of source chunks) - cmp.l #-1,(a2)+ ; did we reach the end? - beq.s @foundEnd ; >>EXIT when we get there - add.l (a2)+,d3 ; add size of this chunk into total - bra.s @findEndLoop ; END -@foundEnd ; - sub.l #MinHeapSize,d3 ; subtract minimum amount of RAM for System - ble @notEnufRAM ; >>EXIT if not enuf RAM - cmp.l d3,d2 ; check against requested amount - bhi @notEnufRAM ; >>EXIT if not enuf RAM - - add.l #MinBootGlobs,d2 ; so we eat past boot globs - suba.l #4,a2 ; point just past last chunk entry - cmp.l #MinBootGlobs,-4(a2); is this a boot globs chunk? - beq.s @getChunksLoop ; IF boot globs chunk is not already seperate THEN - move.l -4(a2),d4 ; get size of previous last chunk - sub.l #MinBootGlobs,d4 ; calc new size of previous last chunk - move.l d4,-4(a2) ; save new size in previous last chunk - add.l -8(a2),d4 ; calc new end of previous last chunk - move.l d4,(a2) ; save start of boot globs chunk in new entry - move.l #MinBootGlobs,4(a2) ; save size of new chunk in a new entry at end - move.l #-1,8(a2) ; put end of chunk marker after boot globs chunk - adda.l #8,a2 ; point past new boot globs chunk - ; ENDIF - - move.l a2,a4 ; save ptr to end of boot globs chunk in src table -@getChunksLoop ; LOOP (to get start of Edisk chunks) - sub.l -(a2),d2 ; subtract this chunk from request - suba.l #4,a2 ; point to beginning of this chunk - bgt.s @getChunksLoop ; END - move.l a2,a0 ; make a copy of source table address - bsr copyChunks ; copy the chunk table starting with the chunk in a0 - add.l d2,d1 ; calc amount of memory stolen - neg.l d2 ; get number of bytes in last main RAM chunk we don't need - move.l d2,4(a2) ; save new size of last chunk of main RAM in src table - sub.l d2,4(a3) ; save size of first chunk of edisk in dest table - add.l d2,(a3) ; adjust start of first chunk of edisk in dest table - -; fix up boot globs chunks - move.l -8(a4),8(a2) ; copy start of boot globs chunk down in src table - move.l -4(a4),12(a2) ; copy size of boot globs chunk down in src table - move.l #-1,16(a2) ; put an end marker in src table after last chunk -@findEndLoop1 ; LOOP (to find end of dest chunks) - cmp.l #-1,(a3)+ ; did we reach the end? - beq.s @foundEnd1 ; >>EXIT when we get there - add.l #4,a3 ; bump up ptr to next addr - bra.s @findEndLoop1 ; END -@foundEnd1 move.l #-1,-12(a3) ; kill off extra boot globs chunk - sub.l #MinBootGlobs,d1 ; adjust amount of memory stolen - -@exit movem.l (sp)+,StealRegs ; restore regs - rts - -@notEnufRAM - clr.l d1 ; clear total size to indicate failure - bra.s @exit - - ;----- ; FindInfo - massage RAM chunks based on what type of hardware we are on, and return ; pointers to the layout tables to use in setting up the MMU. @@ -2486,1899 +952,39 @@ FindInfo movem.l FindRegs,-(sp) ; save work registers dc.w @bad-@casetbl ; .(Mac Pal) dc.w @bad-@casetbl ; .(BBU) dc.w @bad-@casetbl ; .(Normandy) - dc.w @Glu-@casetbl ; .(Mac2Glue) - dc.w @MDU-@casetbl ; .(MDU) - dc.w @FMC-@casetbl ; .(OSS FMC) - dc.w @VISA-@casetbl ; .(VISA has MMU similar to HMMU) <12> - dc.w @Orwell-@casetbl ; .(Orwell) <7> - dc.w @Jaws-@casetbl ; .(Jaws) <9> - dc.w @MSC-@casetbl ; .(MSC) - dc.w @Sonora-@casetbl ; .(Sonora)

- dc.w @Niagra-@casetbl ; .(Niagra) - dc.w @YMCA-@casetbl ; .(YMCA) fau - dc.w @djMEMC-@casetbl ; .(djMEMC) - dc.w @Emulated-@casetbl ; .(HMC) - dc.w @Pratt-@casetbl ; .(Pratt) - dc.w @Emulated-@casetbl ; .(HHead) + dc.w @bad-@casetbl ; .(Mac2Glue) + dc.w @bad-@casetbl ; .(MDU) + dc.w @bad-@casetbl ; .(OSS FMC) + dc.w @bad-@casetbl ; .(VISA has MMU similar to HMMU) <12> + dc.w @bad-@casetbl ; .(Orwell) <7> + dc.w @bad-@casetbl ; .(Jaws) <9> + dc.w @bad-@casetbl ; .(MSC) + dc.w @bad-@casetbl ; .(Sonora)

+ dc.w @bad-@casetbl ; .(Niagra) + dc.w @bad-@casetbl ; .(YMCA) fau + dc.w @bad-@casetbl ; .(djMEMC) + dc.w @exp-@casetbl ; .(HMC) + dc.w @bad-@casetbl ; .(Pratt) + dc.w @exp-@casetbl ; .(HHead) + dc.w @exp-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @bad-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @exp-@casetbl ; + dc.w @bad-@casetbl ; Align 4 @bad ; CASE non-MMU based controller: bra MMUError ; we're hosed... @exp ; CASE some new controller: - moveq #2,d0 ; filler for a future overpatch - moveq #2,d0 ; filler for a future overpatch - bra @endSwitch - -;--- -; Mac II glue chip: check for weird cases, normally return pointer to Contiguous setup. -; Normal case is no bank B here, since we merged it with bank A -; and set the size bits. If we still have bank B, either there -; was no bank A, or Bank B is bigger than bank A. Either can be -; handled if a 68851 is present by using the Split setup. -;--- - - - -@Glu ; CASE Mac 2 glue chip: - lea Contig32,a0 ; assume contig 32 bit mode layout info - lea Contig24,a1 ; assume contig 24 bit mode layout info - tst.l d2 ; check if first chunk start w/Bank A <3.5> - bne.s @tryPMMU ; if not, its a weird case (has to be bank B) <3.5> - addq.l #1,d4 ; check if second chunk (bank B) exists <3.5> - beq @endSwitch ; if only one chunk of RAM, we're all set <3.5> -@tryPMMU cmp.b #HMMU,sgTypeMMU(a6) ; see if we have an MMU up to the task <3.5> CSS - bne @split ; if its a PMMU, we can live with split memory <3.5> - bra MMUError ; otherwise we're hosed (no mem at addr zero!) - -;--- -; Emulated: RISC Macs have MMU functionality, but don't need to be setup here. cch -;--- - -@Emulated ; CASE RISC Mac: - bra @endSwitch ; that's all folks - - -;--- -; Sonora: Weird Case necessary to be able to handle Vail and Double Exposure. -;--- - -@Sonora ; CASE Sonora chip:

- - move.l d0,a0 ; save d0 - movec cacr,d0 ; - move.l d0,a1 ; save cacr - sub.l d0,d0 ; D0 = 0 - bset #CACR_DE_040,d0 ; set Data Cache Enable bit on 040s - movec d0,CACR ; attempt to enable data cache (temporarily) - movec CACR,d0 ; check and see if it's still there - btst #CACR_DE_040,d0 ; see if the bit exists in CACR - beq.s @Sonora030 ; IF we're on a 68040 THEN - - MACHINE MC68040 ; need this for the MOVEC D0,TC below - - cinva bc ; make sure caches are invalidated - - MACHINE MC68030 ; return to prior MACHINE directive <2> - - move.l a1,d0 ; restore cacr - movec d0,cacr ; - move.l a0,d0 ; restore d0 - lea SnraForty32,a0 ; use Sonora's 040 32 bit mode layout info - lea SnraForty24,a1 ; use Sonora's 040 24 bit mode layout info - bra @endSwitch ; that's all folks - -@Sonora030 move.l a1,d0 ; restore cacr - movec d0,cacr ; - move.l a0,d0 ; restore d0 - - lea Sonora32,a0 ; use Sonora's 32 bit mode layout info - lea Sonora24,a1 ; use Sonora's 24 bit mode layout info - bra @endSwitch ; that's all folks - -;--- -; Orwell: no weird cases. This wonderful decoder has already been set up to merge <7> -; RAM to be contiguous. -;--- - -@djMEMC ; CASE djMEMC chip: -@Orwell ; CASE Orwell chip: <7> - lea Orwell32,a0 ; use Orwell's 32 bit mode layout info - lea Orwell24,a1 ; use Orwell's 24 bit mode layout info - bra @endSwitch ; that's all folks - -;--- -; Jaws: Memory is always contiguous on Jaws, and onboard video will always be on. -;--- - -@Jaws ; CASE Jaws chip: <9> - movea.l prodInfoPtr(a5),a0 ; get productInfo record in a0 - move.l a0,a1 ; get a copy in a1 - adda.l ProductInfo.VideoInfoPtr(a0),a1 ; point to the VideoInfo record - move.l VideoInfo.VRAMPhysAddr(a1),VRAMPhysBase(a5) ; initialize base of video RAM - move.l VideoInfo.VRAMLogAddr32(a1),logVRAMBase32(a5) ; 24-bit logical VRAM addr - move.l VideoInfo.VRAMLogAddr24(a1),logVRAMBase24(a5) ; 32-bit logical VRAM addr - move.l #LCDMaxSize,VRAMrealSize(a5) ; set the size of video for phys space tbl <17> HJR - lea Jaws32,a0 ; use Jaws' 32 bit mode layout info - lea Jaws24,a1 ; use Jaws' 24 bit mode layout info - - bra @endSwitch ; that's all folks - -;--- -; MSC: Memory is always contiguous on MSC, and onboard video will always be on. -;--- - -@MSC ; CASE MSC chip: - - movea.l prodInfoPtr(a5),a0 ; get productInfo record in a0 - move.l a0,a1 ; get a copy in a1 - adda.l ProductInfo.VideoInfoPtr(a0),a1 ; point to the VideoInfo record - move.l VideoInfo.VRAMPhysAddr(a1),VRAMPhysBase(a5) ; initialize base of video RAM - move.l VideoInfo.VRAMLogAddr32(a1),logVRAMBase32(a5) ; 24-bit logical VRAM addr - move.l VideoInfo.VRAMLogAddr24(a1),logVRAMBase24(a5) ; 32-bit logical VRAM addr - lea MSC32,a0 ; use MSC's 32 bit mode layout info - lea MSC24,a1 ; use MSC's 24 bit mode layout info - - bra @endSwitch ; that's all folks - -;--- -; Niagra: Memory is always contiguous on Niagra, and onboard video will always be on. -; through next -;--- - -@Niagra ; - - movea.l prodInfoPtr(a5),a0 ; get productInfo record in a0 - move.l a0,a1 ; get a copy in a1 - adda.l ProductInfo.VideoInfoPtr(a0),a1 ; point to the VideoInfo record - move.l VideoInfo.VRAMPhysAddr(a1),VRAMPhysBase(a5) ; initialize base of video RAM - move.l VideoInfo.VRAMLogAddr32(a1),logVRAMBase32(a5) ; 24-bit logical VRAM addr - move.l VideoInfo.VRAMLogAddr24(a1),logVRAMBase24(a5) ; 32-bit logical VRAM addr - lea Niagra32,a0 ; use Niagra' 32 bit mode layout info - lea Niagra24,a1 ; use Niagra' 24 bit mode layout info - - bra @endSwitch ; that's all folks - -;--- -; Pratt: Memory is always contiguous on Pratt, and onboard video will always be on. -; -;--- - -@Pratt ; - - movea.l prodInfoPtr(a5),a0 ; get productInfo record in a0 - move.l a0,a1 ; get a copy in a1 - adda.l ProductInfo.VideoInfoPtr(a0),a1 ; point to the VideoInfo record - move.l VideoInfo.VRAMPhysAddr(a1),VRAMPhysBase(a5) ; initialize base of video RAM - move.l VideoInfo.VRAMLogAddr32(a1),logVRAMBase32(a5) ; 24-bit logical VRAM addr - move.l VideoInfo.VRAMLogAddr24(a1),logVRAMBase24(a5) ; 32-bit logical VRAM addr - lea Pratt32,a0 ; use Niagra' 32 bit mode layout info - lea Pratt24,a1 ; use Niagra' 24 bit mode layout info - - bra @endSwitch ; that's all folks - -;--- -; FMC - only weird case is bank B only. For other cases, we previously merged -; everything into one bank starting at physical zero. We can survive bank B -; only with the split model. -;--- - -@FMC ; CASE FMC chip: <3.6> - lea Contig32,a0 ; assume contig 32 bit mode layout info - lea Contig24,a1 ; assume contig 24 bit mode layout info - tst.l d2 ; check if RAM starts at physical zero - bne @split ; if not, we can live with split memory mode <3.8> - bra @endSwitch ; ... - - -;¥¥¥ Begin fau -;--- -; YMCA: no weird cases. -;--- - -@YMCA ; CASE YMCA chip: - lea YMCA32,a0 ; use YMCA's 32 bit mode layout info - lea YMCA24,a1 ; use YMCA's 24 bit mode layout info - bra @endSwitch ; that's all folks -;¥¥¥ End fau end - -;--- -; MDU - if RBV present w/monitor attached, deallocate video buffer from useable RAM -; and make Bank B, if present, be low memory. -;--- - -@MDU ; CASE MDU chip: - - btst #RBVExists,d6 ; check if RBV exists - beq @split ; IF RBV exists <3.8> - movea.l prodInfoPtr(a5),a0 ; get productInfo record in a0 <9> - move.l a0,a1 ; get a copy in a1 <9> - adda.l ProductInfo.VideoInfoPtr(a0),a1 ; point to the VideoInfo record <9> - move.l VideoInfo.VRAMPhysAddr(a1),VRAMPhysBase(a5) ; initialize base of video RAM <9> - move.l VideoInfo.VRAMLogAddr32(a1),logVRAMBase32(a5) ; 24-bit log. VRAM addr <9> - move.l VideoInfo.VRAMLogAddr24(a1),logVRAMBase24(a5) ; 32-bit log. VRAM addr <9> - cmpi.l #RBVBase32b,logVRAMBase32(a5) ; check which slot video is in <11> - adda.l ProductInfo.DecoderInfoPtr(a0),a0 ; point a0 to decoder info <11> - bne.s @slotE ; IF RBV is in Slot B THEN <11> - lea RBV32b,a3 ; point to RBV Slot B table <11> - bra.s @gotSlot ; ELSE <11> -@slotE lea RBV32e,a3 ; point to RBV Slot E table <11> -@gotSlot ; ENDIF <11> - bfextu newtc(a3){8,4},d0 ; get # addr bits for pageSize <11> - moveq #0,d6 ; clear a reg - bset d0,d6 ; get our pagesize - move.l sgTotalRAM(a6),d0 ; get total amt memory (for GetRBVSize) CSS - moveq #0,d1 ; signal no rounding, we want the REAL size - move.l RBVAddr(a0),a0 ; get addr of RBV hardware <11> - movea.l prodInfoPtr(a5),a2 ; pass addr of productInfo record in a2 <3.0> - bsr GetRBVSize ; get actual video buffer size - move.l d0,VRAMrealSize(a5) ; save it for later <9> - move.l sgTotalRAM(a6),d0 ; get total amt memory (for GetRBVSize) CSS - move.l d6,d1 ; rounding factor = MMU page size - bigjsr GetRBVSize,a4 ; get monitor size, rounded up to pagesize - move.l d0,VRAMSize(a5) ; save it for later <9> - beq @split ; if no monitor, its easy! - tst.l d2 ; check if any memory in Bank A - bne @split ; if no Bank A, its easy! - sub.l d0,d3 ; subtract monitor size from bank A - move.l d3,globChunks+4(a5) ; update RAM chunk table - add.l d0,d2 ; add monitor size to bank A start addr - move.l d2,globChunks(a5) ; update RAM chunk table - sub.l d0,sgPhys2Log(a6) ; adjust physical-to-logical conversion offset CSS - move.l a3,a0 ; point to RBV table <11> - - lea globChunks+8(a5),a1 ; get pointer to second chunk - tst.l sgEDiskStealFlag(a6); check for ram disk CSS | - beq.s @noRamDisk ; IF there is a ram disk THEN v - add.l #8,a1 ; point at third chunk -@noRamDisk ; ENDIF - tst.l (a1) ; check for bank B ^ - bmi.s @noBankB ; IF Bank B exists | - IF forRomulator THEN ; ¥¥¥Note: Romulator won't work with an Edisk - TestInRam A2 ; are we running in ram? <3.8> - beq.s @inROM ; if not, skip this <3.8> - BigLea BaseOfRom,a2 ; get current base of ROM <3.8> - lsl.l #1,d1 ; add an extra page to bootglobs <3.8> - add.l ROMHeader.RomSize(a2),d1 ; increase size of bootglobs by ROM size <3.8> -@inROM ; - ENDIF ; <3.8> - tst.l sgEDiskStealFlag(a6); check for ram disk CSS - bne.s @ramDiskExists ; IF there is no ram disk THEN - sub.l d1,d5 ; decrement Bank B size by pagesize -@ramDiskExists ; ENDIF - lea globChunks(a5),a1 ; point at beginning of chunk table - move.l d4,(a1)+ ; put Bank B (addr) first in Ram chunk table - move.l d5,(a1)+ ; put Bank B (size) first in Ram chunk table - move.l d2,(a1)+ ; put Bank A (addr) second in Ram chunk table - move.l d3,(a1)+ ; put Bank A (size) second in Ram chunk table - tst.l sgEDiskStealFlag(a6); check for ram disk CSS - bne.s @noBankB ; IF there is no ram disk THEN - add.l d5,d4 ; get addr of last chunk - move.l d4,(a1)+ ; put addr last little chunk in table - move.l d1,(a1)+ ; put size last little chunk in table - moveq #-1,d4 ; get end of table marker - move.l d4,(a1)+ ; put end marker in table - move.l d4,(a1)+ ; put end marker in table - ; ENDIF -@noBankB ; ENDIF - move.l #RBVBase24b,d2 ; get the 24-bit video base address <14> - move.l logVRAMBase24(a5),d3 ; get the 24-bit video base addr for this machine <14> - andi.l #$ffffff,d2 ; ensure these are 24-bit addrs... <14> - andi.l #$ffffff,d3 ; same here <14> - cmp.l d3,d2 ; check which slot video is in <14> - bne.s @inSlotE ; IF RBV is in Slot B THEN <11> - lea RBV24b,a1 ; point to RBV Slot B table <11> - bra.s @done ; ELSE <11> -@inSlotE lea RBV24e,a1 ; point to RBV Slot E table <11> -@done ; ENDIF <11> - bra.s @endSwitch ; ... - - -;--- <12> -; VISA chip: Generally, the VISA code is similar to the HMMU (that is, there isn't any -; hardware, and it doesn't do anything). This code also whacks the ChunkTable -; to adjust for usage of RAM by the video system. There's no possibility of -; the split RAM case (big block in bank B), since there's no PMMU at all. -; -; For Slice there is no on-board video so no need to allocate a video buffer. -; All we need to do is allocate a 4k sound buffer. -;--- - -@VISA ; CASE VISA chip: - sub.l #$00001000,sgAllocOff(A6) ; allocate 4k sound buffer - lea FstrFrms24,a1 ; point to 24 bit MMU info table - lea FstrFrms32,a0 ; point to 32 bit MMU info table - bra @endSwitch ; - -@split ; ELSE (no RBV, just split memory) - move.l smallest(a5),d0 ; get size smallest chunk - bfffo d0{0,0},d0 ; get 32-log2(size) - subq.w #5,d0 ; normalize to 64 meg - muls.w #-MMUSetupInfo.Size,d0; compute offset from 64 meg entry - lea (split64mb32,d0.w),a0; return addr 32 bit mode layout - lea Split24,a1 ; return split 24 bit mode layout info -;fallThru bra.s @endSwitch ; ... - -@endSwitch ; ENDSWITCH movem.l (sp)+,FindRegs ; restore work registers rts -;----- -; MakePhysicalTable -; -; Create the 'physical table' describing the significant portions of the physical -; address space. Use the physical template to create the table. -; -; The table is actually created into a buffer on the stack, then copied to space -; allocated below BootGlobals. -; -; Entry -; a0 - points to 32 bit mode layout info -; a5 - points to InitMMU stack frame -; a6 - points to BootGlobs -; -; Exit -; physical table created (in BootGlobs) -;--- -MakPhysRegs REG a1-a2 - -MakePhysicalTable - - movem.l MakPhysRegs,-(sp) ; save work registers - suba.w #physBufSize,sp ; allocate buffer on stack - move.l sp,a2 ; save ptr to buffer start - move.l a2,a1 ; init buffer fill ptr - add.w physicalOff(a0),a0 ; scan ptr = addr physical template -@loop ; LOOP for each entry - move.w PhysicalSpaceBlock.usage(a0),d0;get template entry type - cmp.w #kUsageEndTable,d0 ; check it - beq.s @exitLoop ; >>EXITLOOP if end-of-table - cmp.w #kUsageRAM,d0 ; check it again - bne.s @notRam ; IF its a RAM entry - bsr doPhysRam ; generate RAM entries - adda.w #PhysicalSpaceBlock.size,a0 ; point at next template entry - bra.s @loop ; . -@notRam cmp.w #kUsageROM,d0 ; ELSEIF its a ROM entry - bne.s @notRom ; . - bsr doPhysRom ; generate ROM entry - adda.w #PhysicalSpaceBlock.size,a0 ; point at next template entry - bra.s @loop ; . -@notRom ; ELSE - moveq #PhysicalSpaceBlock.size-1,d0; prepare to copy entry to buffer -@copy move.b (a0)+,(a1)+ ; LOOP - copy next byte - dbra d0,@copy ; REPEAT - ; ENDIF - bra.s @loop ; REPEAT -@exitLoop - suba.l a2,a1 ; size = end - start - move.l a1,d1 ; save size of entries - addq.l #PhysicalSpace.firstEntry-PhysicalSpace,a1 ; add in extra fields - move.l a6,a0 ; get ptr to BootGlobs - move.l sgAllocOff(a6),d0 ; get current allocation offset CSS - sub.l a1,d0 ; allocate space for physical table - move.l d0,sgPhysicalTableOff(a6) ; save offset to physical table CSS - move.l d0,sgAllocOff(a6) ; update allocation offset CSS - add.l d0,a0 ; get ptr to allocated table - - move.l d1,d0 ; get total size of entries - divu #PhysicalSpaceBlock.size,d0 ; # entries = (total size)/(entry size) - move.w d0,(a0)+ ; write # entries - move.w #PhysicalSpaceBlock.size,(a0)+ ; write entry size - bra.s @endCopy ; adjust for dbra -@copyLoop move.b (a2)+,(a0)+ ; LOOP - copy byte from buffer to final table -@endCopy dbra d1,@copyLoop ; REPEAT for all bytes of entries in buffer - adda.w #physBufSize,sp ; de-allocate buffer from stack - movem.l (sp)+,MakPhysRegs ; restore registers - rts - -;----- -; doPhysRam - local subroutine of MakePhysicalTable to generate RAM entries in the -; physical table. -; -; First, if onboard video uses some RAM, entries are generated for both the video -; and the wrap of the logical space before and afet the video buffer (to accomodate <3.2> -; the Quickdraw bug of accessing a few bytes before and after the video buffer). <3.2> -; -; Then, a RAM entry is generated for each RAM chunk from our 'massaged' RAM chunk -; table. The first RAM entry is marked as low memory, so VM knows where low -; memory really is. We also duplicate the last entry, because we need to -; divide the last chunk into useable Ram and boot globals space. Later we will -; go back and adjust the addesses and sizes to reflect the actual size of the -; boot globals/mmu tables area. -; -; Entry -; a0 - points to physical template entry -; a1 - buffer fill ptr where physical table is being generated -; a2 - points to start of buffer -; a5 - points to InitMMU stack frame -; a6 - points to boot globs -; -; Exit -; a1 - updated buffer fill ptr (after RAM entries are added) -; a0-a2 preserved -;--- - -doPhysRegs REG d2-d4/a3-a4 - -doPhysRam movem.l doPhysRegs,-(sp) ; save registers - move.l VRAMrealSize(a5),d0 ; get exact onboard video size <9> - beq.s @doneVideo ; IF any onboard video - - move.l VRAMPhysBase(a5),d4 ; get physical base - - moveq #kUsageOnboardVideo,d1 ; entry type = onboard video <3.2, to end 3.2> - move.l logVRAMBase32(a5),d2 ; logical 32 addr <9> - move.l logVRAMBase24(a5),d3 ; logical 24 addr - bsr @writeOne ; create entry for real video buffer - - add.l d0,d2 ; log 32 addr = end of video buffer - add.l d0,d3 ; log 24 addr = end of video buffer - move.l #VidWrapSize,d0 ; size = size of wrap area <9> - moveq #kUsageOnboardVideoWrap,d1 ; entry type = onboard video WRAP - bsr.w @writeOne ; create entry for wrap area after video buffer - - move.l logVRAMBase32(a5),d2 ; wrap area before video buffer <9> - sub.l d0,d2 ; calculate start of wrap area <9> - move.l logVRAMBase24(a5),d3 ; logical 24 addr - sub.l d0,d3 ; calculate start of wrap area - bsr.w @writeOne ; for wrap area before video buffer - -@doneVideo ; ENDIF - - tst.l sgEDiskStealFlag(a6) ; check for ram disk CSS - beq.s @doneEDisk ; IF any ram disk THEN | - move.l #kUsageEDisk,d1 ; entry type = ram disk v - move.l sgRamDiskBase(a6),d2 ; logical 32 base = from globals CSS - clr.l d3 ; no access in 24-bit mode - lea eDiskChunks(a5),a3 ; point at ram disk chunk table -@eDiskLoop ; LOOP (to write entries for eDisk chunks) - move.l (a3)+,d4 ; get chunk addr - move.l (a3)+,d0 ; get chunk size - cmp.l #-1,d4 ; check for end of chunks - beq.s @doneEDisk ; >>EXITIF done all ram disk chunks - bsr @writeOne ; write a physical table entry - add.l d0,d2 ; bump up logical pointer ^ - bra.s @eDiskLoop ; REPEAT | -@doneEDisk ; ENDIF - - moveq #kUsageLowMemory,d0 ; start w/type = low memory - lea globChunks(a5),a3 ; point at massaged RAM chunk table -@ramLoop ; LOOP through RAM chunk table - movem.l (a3)+,d1-d2 ; get chunk addr/size - cmp.l #-1,d1 ; check for end of chunks - beq.s @doneRam ; >>EXITIF done all RAM chunks - move.l a1,a4 ; remember pointer to last RAM entry - move.w d0,(a1)+ ; type = current type - move.w #cacheable,(a1)+ ; attributes = cacheable - move.l d1,(a1)+ ; physical addr = RAM chunk addr - move.l d2,(a1)+ ; physical size = RAM chunk size - clr.l (a1)+ ; logical 32 addr = (don't care) - clr.l (a1)+ ; logical 32 size = (don't care) - clr.l (a1)+ ; logical 24 addr = (don't care) - clr.l (a1)+ ; logical 24 size = (don't care) - moveq #kUsageRam,d0 ; next type = normal RAM - bra.s @ramLoop ; REPEAT -@doneRam - move.l a4,d0 ; get ptr to last RAM chunk entry - sub.l a2,d0 ; buffer offset = ptr - start of buffer - addq.l #PhysicalSpace.firstEntry-PhysicalSpace,d0 ; account for extra fields - move.l d0,lastPhysRam(a5) ; save offset to last RAM chunk entry - moveq #PhysicalSpaceBlock.size-1,d0;prepare to copy last RAM chunk entry -@copy move.b (a4)+,(a1)+ ; LOOP - copy next byte - dbra d0,@copy ; REPEAT - - move.l soundBufferSize(a5),d0 ; is there a sound buffer on this machine? - beq.s @NoSoundBuffer ; -> nope, all done - clr.w (a1)+ ; entry type = other - move.w #notCacheable,(a1)+ ; attributes = notCacheable - move.l soundBufferBase(a5),(a1)+ ; physical addr = base of sound buffer - move.l d0,(a1)+ ; physical size = size of sound buffer - clr.l (a1)+ ; logical 32 addr = (don't care) - move.l d0,(a1)+ ; logical 32 size = size of sound buffer - clr.l (a1)+ ; logical 24 addr = (don't care) - move.l d0,(a1)+ ; logical 24 size = size of sound buffer -@NoSoundBuffer ; - movem.l (sp)+,doPhysRegs ; restore regs - rts - -;------ -; mini-routine to write a non-cached physical space entry -; d0 - size -; d1 - entry type -; d2 - logical 32 addr -; d3 - logical 24 addr -; d4 - physical addr -; a1 - pointer to next free entry -;------ -@writeOne move.w d1,(a1)+ ; write out entry type - move.w #notCacheable,(a1)+ ; attributes = notCacheable - move.l d4,(a1)+ ; physical addr = video base addr - move.l d0,(a1)+ ; physical size - move.l d2,(a1)+ ; logical 32 addr - move.l d0,(a1)+ ; logical 32 size - move.l d3,(a1) ; logical 24 addr - andi.l #$00FFFFFF,(a1)+ ; strip high byte of 24 bit addr - move.l d0,(a1)+ ; logical 24 size - rts - - -;----- -; doPhysRom - local subroutine of MakePhysicalTable to generate the Rom entry in the -; physical table. -; -; The physical address in the entry is the physical address of the ROM image, which might -; be in RAM if we are using Romulatorª. The size is obtained from the Rom header. -; -; Entry -; a0 - points to physical template entry -; a1 - buffer fill ptr where physical table is being generated -; a2 - points to start of buffer -; a5 - points to InitMMU stack frame -; -; Exit -; a1 - updated buffer fill ptr (after RAM entries are added) -; a0-a2 preserved -;--- - -doPhysRom exg a3,d1 ; save register - move.w PhysicalSpaceBlock.usage(a0),(a1)+ ; CSS get usage type - move.w PhysicalSpaceBlock.attributes(a0),(a1)+ ; CSS get the attributes - move.l PhysicalSpaceBlock.physical.rangeSize(a0),d0 ; CSS - cmpi.l #$10000000,d0 ; CSS is the size 256MB ? - - bne.s @doNew ; CSS if 256MB then generate ROM entry the old way otherwise get -; ; CSS actual values from the physical space template - biglea BaseOfRom,a3 ; get physical addr Rom image - move.l a3,(a1)+ ; physical addr = image addr - move.l RomHeader.RomSize(a3),d0 ; get Rom image size from header - move.l d0,(a1)+ ; physical size = image size - exg a3,d1 ; restore reg - move.l logRomBase(a5),d1 ; get logical addr ROM - move.l d1,(a1)+ ; logical 32 addr - move.l d0,(a1)+ ; logical 32 size... - and.l #$FFFFFF,d1 ; get 24 bit mode address of ROM - move.l d1,(a1)+ ; logical 24 addr... - move.l d0,(a1)+ ; logical 24 size... - - bra.s @done ; CSS - -@doNew move.l PhysicalSpaceBlock.physical.address(a0),(a1)+ ; CSS get the physical address of the rom bank - move.l d0,(a1)+ ; CSS physical size of rom image from template - move.l PhysicalSpaceBlock.logical.address(a0),(a1)+ ; CSS get the logical 32 bit Rom bank address - move.l PhysicalSpaceBlock.logical.rangesize(a0),(a1)+ ; CSS get the logical 32 bit Rom bank size - move.l PhysicalSpaceBlock.logical24.address(a0),(a1)+ ; CSS get the logical 24 bit Rom bank address - move.l PhysicalSpaceBlock.logical24.rangesize(a0),(a1)+ ; CSS get the logical 32 bit Rom bank size - -@done exg a3,d1 ; CSS restore reg - rts - -;----- -; -; MakeTable - creates an MMU table. -; -; First an intermediate table is generated, given the installed RAM and the desired -; logical map. Then the final MMU table entries are generated from the intermediate table. -; -; The intermediate table entries are formatted as follows: -; -; 31 8 7 6 5 43 2 10 -; +--------------------------------+-+-+-+--+-+--+ -; | page address or table limit |0|c|0|xx|0|yy| -; +--------------------------------+-+-+-+--+-+--+ -; c - cache inhibit bit (one if cache should be inhibited, zero if not) -; xx - level in table. Level one corresponds to TIA, four to TID -; yy - descriptor type -; -; Each intermediate entry corresponds to some piece of the logical address space. For -; instance, if the tc specifies 16 TIA entries, there would be 16 level 1 entries. -; -; The intermediate entry is generated to allow easy creation of the final MMU table. -; Entries for the same level are laid out consecutively until it is determined that -; a deeper level is needed, or until the entire address space for that level has been -; covered. -; -; If a deeper level is needed, entries are laid out for that deeper level, followed -; by an entry for the parent level with a descriptor type of 'table'. The sequence -; of levels for a tc w/16 TIA entries, xx TIB entries, yy TIC entries might look like: -; -; 1111223333...322..2111111111111 -; | | - level 1 'table' entry, possible w/limit for the preceeding run -; | of level 2's -; | -; | - level 2 'table' entry, possibly w/limit -; -; In the above example, the level 2's even had a nested level 3 table! -; -; Entry: a0 points to table layout info -; a5 points to InitMMU stack frame -; -; Exit: a0 points to created table -; d0 has 1st longword of CRP -;----- - -tableSize EQU $30000 ; get 192k of space for intermediate table <7> - -MakeFrame RECORD {prevLink},DECR -Return ds.l 1 ; return addr -prevLink ds.l 1 ; previous value of link register -mmuSetupPtr ds.l 1 ; ptr to mmu setup information -templatePtr ds.l 1 ; pointer to template -logicalAddr ds.l 1 ; current logical address -genPtr ds.l 1 ; ptr into "intermediate form" table -ramChunks ds.l sgMaxChunks*2 ; space for copy of RAM chunks (addr/size) (last addr -1) CSS -eDskChunks ds.l sgMaxChunks*2 ; space for copy of edisk chunks (addr/size) (last addr -1) CSS -vidAddr ds.l 1 ; video chunk addr (get bumped up as allocated) -vidSize ds.l 1 ; video chunk size (gets bumped down as allocated) -doWrap24 ds.w 1 ; true if we need to wrap tables for 24-bit mode <7> -intermedTbl ds.l 1 ; start of intermediate table <7> -makeLocSize equ * ; size of locals - ENDR - -NoLimit equ $7FFF0000 ; what to stuff in limit field when there is no limit - - WITH MakeFrame - -MakeTable -MakeRegs REG d2/a1 - link a4,#makeLocSize-tableSize ; set up stack frame <7> - movem.l MakeRegs,-(sp) ; save registers - - move.l a0,mmuSetupPtr(a4) ; save ptr to MMU setup info - move.w templOff(a0),d0 ; get offset to normal template - btst.b #mmHighSysHeap,sgMMFlags(a6) ; check if creating map w/huge void CSS - beq.s @haveTempl ; IF we are - move.w specialOff(a0),d0 ; get offset to special template -@haveTempl add.w d0,a0 ; ENDIF - add in template offset - move.l a0,templatePtr(a4) ; save ptr to template - - lea globChunks(a5),a0 ; source = ram chunk table from InitMMU globals - lea ramChunks(a4),a1 ; destination = our local copy - bsr.s CopyChunks ; get a local copy of chunk table - - lea eDiskChunks(a5),a0 ; source = ram disk chunk table from globals - lea eDskChunks(a4),a1 ; destination = our local copy - bsr.s CopyChunks ; get a local copy of chunk table - move.l VRAMPhysBase(a5),vidAddr(a4) ; get local copy of base of video RAM <9> - move.l VRAMSize(a5),vidSize(a4) ; get local copy of size of video buffer <9> - - bsr.s IntermediateTable ; make the intermediate table - bsr FinalTable ; make the final MMU tables - - movem.l (sp)+,MakeRegs ; restore registers - unlk a4 ; deallocate stack frame - rts - -;----- -; IntermediateTable - wrapper routine for creating the intermediate form table. -; -; The table is created using two mutually recursive routines, DoLevel and DoNode. -; DoLevel is responsible for creating all nodes at a given level. It calls DoNode -; to create each node. -; -; DoNode attempts to create a node at the current level. If it determines that a node -; can be created at the current level (a contiguous physical space is possible for the -; current logical address mapping and the span of the current level), it quickly does so -; and returns. Otherwise, a lower level table is neccessary, and it calls DoLevel to -; create the lower level entries in the intermediate table. -; -; This routine simply sets up for generating nodes at the top level, and calls DoLevel. -; Before returning, it appends a dummy level zero node to the end of the intermediate -; table, to make generating the final MMU tables easier. -; -; Entry: -; a4 - points to MakeTable stack frame -; -;--- - -IntermediateTable - move.l d2,-(sp) ; save work reg - lea intermedTbl(a4),a0 ; get ptr to where intermediate table will go - move.l a0,genPtr(a4) ; save ptr to intermediate table - clr.l logicalAddr(a4) ; start at logical address zero - clr.w doWrap24(a4) ; assume generating for 32-bit mode <7> - moveq #1,d0 ; start at level one - bsr.s DoLevel ; create level 1 (and higher!) intermediate table - moveq #0,d2 ; signal writing table node for level zero - bsr WriteTableNode ; write the final table node - move.l (sp)+,d2 ; restore work reg - rts - -;----- -; DoLevel - create intermediate table entries for a given level of the MMU tree. -; -; Entry: -; d0.w - the level -;--- - -DoLevelRegs REG d2-d4 -DoLevel movem.l DoLevelRegs,-(sp) ; save regs - move.w d0,d2 ; save level of interest - bsr SpanAndCount ; d0 = span, d1 = count of entries at this level - move.l d0,d3 ; save span - move.l d1,d4 ; save count - bra.s @endLoop ; adjust loop count for dbra -@loop ; LOOP count times - bsr.s DoNode ; create next node -@endLoop dbra d4,@loop ; REPEAT - movem.l (sp)+,DoLevelRegs ; restore regs - rts - -;----- -; DoNode - create a node in the intermediate table, given the current table level and -; logical address. -; -; Entry: -; d2.w - level -; d3 - span of this level (passed in for convenience, could be recomputed here) -; a4 - points to MakeTable stack frame -;--- - -DoNode bsr.s PageAddr ; a0 = page address, d0 = type, d1 = cache inhibit flag - move.b @casetbl(d0),d0 ; get offset to routine to handle type - jmp @casetbl(d0.w) ; SWITCH(type) -@casetbl dc.b @valid-@casetbl ; . - dc.b @invalid-@casetbl ; . - dc.b @noFit-@casetbl ; . - dc.b @endCase-@casetbl ; . - ALIGN 2 ; . -@valid ; CASE(type = valid) - bsr WritePageNode ; write page node(level, page addr, cache flag) - bra.s @endCase ; ... -@invalid ; CASE(type = invalid) - bsr WriteInvalidNode ; write invalid node(level) - bra.s @endCase ; ... -@noFit ; CASE(type = didn't fit) - bsr CanGoDeeper ; see if we can go to next level - beq.s @noDeeper ; IF we can - move.w d2,d0 ; recall level - addq.w #1,d0 ; bump to next level - bsr.s DoLevel ; make entries at next level - bsr WriteTableNode ; write a table node (level) - bra.s @endCase ; ... -@noDeeper ; ELSE - bsr WriteInvalidNode ; write invalid node (level) - ; ENDIF -;fallthru bra.s @endCase ; ... -@endCase ; ENDSWITCH - rts - -;----- -; PageAddr - given logical address and level span, return information about the physical -; page where it will map to -; -; Entry: -; a4 - points to MakeTable stack frame -; a5 - points to InitMMU stack frame <3.2> -; d2.w - level -; d3 - span of this level (passed in for convenience, could be recomputed here) -; -; Exit -; d0.w - type (0 = valid page, 1 = invalid page, 2 = didn't fit) -; d1.w - cache inhibit flag in bit 6 -; a0 - page address -;--- - - WITH Template -PageRegs REG d3-d5 -PageAddr movem.l PageRegs,-(sp) ; save regs - move.l templatePtr(a4),a0 ; get ptr to template table - moveq #0,d5 ; template logical address = zero - move.l logicalAddr(a4),d0 ; get our current logical addr -@loop ; LOOP - move.l span(a0),d1 ; get chunk size - move.l d0,d4 ; recall our current logical address - sub.l d5,d4 ; get offset from start of template chunk - cmp.l d4,d1 ; check if we're in this chunk's range - bhi.s @exitLoop ; >>EXITLOOP if logical addr falls in this chunk - add.l d1,d5 ; bump template chunk address by size this chunk - addq.l #tEntrySize,a0 ; point at next template entry - bra.s @loop ; REPEAT -@exitLoop ; at this point: a0 -> template entry, - ; d1 = template chunk size, d2 -> bottom of chunk, - ; d3 = level span, d4 = our offset from bottom of chunk - move.l d3,d0 ; save level span - add.l d4,d3 ; get offset + span - cmp.l d3,d1 ; check against size of chunk - bhs.s @fits ; IF logical span doesn't fit in template chunk - moveq #2,d0 ; returned type = "doesn't fit" - bra @done ; EXITROUTINE -@fits ; ENDIF - move.l physNflag(a0),d3 ; get phys addr/flags word <7> - move.l d3,d5 ; copy for getting type bits <7> - and.l #typeMask,d5 ; mask all except type bits <7> - move.b @casetbl(d5),d5 ; get offset to routine to handle type - jmp @casetbl(d5.w) ; SWITCH(type) -@casetbl dc.b @thru-@casetbl ; . - dc.b @ram-@casetbl ; . - dc.b @rom32-@casetbl ; . - dc.b @rom24-@casetbl ; . - dc.b @vidWrap-@casetbl ; . - dc.b @video-@casetbl ; . - dc.b @mapped-@casetbl ; . - dc.b @Void-@casetbl ; . - dc.b @wrap24-@casetbl ; . <7> - dc.b @vram-@casetbl ; . <9> - dc.b @eDisk-@casetbl ; . - - ALIGN 2 ; . -@thru ; CASE(pass thru) - move.l logicalAddr(a4),a0 ; page address = current logical address - bra.s @valid ; returned type = "valid page" -@ram ; CASE(ram) - bsr.w GrabRam ; allocate from RAM chunks, return type, page addr - bra.s @endSwitch ; ... -@wrap24 ; CASE(24-bit wrap area) <7> - move.w #1,doWrap24(a4) ; fall through, and mark "invalid" <7> -@Void ; CASE(void in the middle of RAM) - moveq #1,d0 ; mark page as "invalid" - bra.s @endSwitch ; ... -@rom32 ; CASE(rom, 32 bit mode) - move.l physRomBase(a5),d0 ; assume running in ROM (use real h/w address) - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 - beq.s @nomask ; IF NOT on a 68040 THEN - btst.l #FullTblBit,d3 ; Check if we want full MMU tables for this block - bne.s @nomask ; IF Full Tables NOT wanted then - and.l #$ff000000,d0 ; mask to just use high byte of phys addr -@nomask move.l d0,a0 ; ENDIF - bra.s @romCommon ; (continue w/common code) - -@rom24 ; CASE(rom, 24 bit mode) - move.l physRomBase(a5),a0 ; assume running in ROM (use phys addr) - -@romCommon - IF forRomulator THEN ; <3.7> - biglea BaseOfROM,a0 ; point to start of ROM image in RAM - ENDIF ; <3.7> -@gotROM ; ENDIF - add.l d4,a0 ; returned page addr = start of ROM + offset from - ; .start of template chunk - bra.s @valid ; returned type = "valid page" -@vidWrap ; CASE(wrap to start of video) - move.l VRAMPhysBase(a5),a0 ; get physical base of video buffer <9> - bra.s @valid ; ... -@video ; CASE(video) - bsr GrabVideo ; allocate from vRAM chunks, return type, page addr - bra.s @endSwitch ; ... -@vram ; CASE(vram) <9> - move.l VRAMPhysBase(a5),a0 ; get physical base of video RAM <9> -; adda.l d4,a0 ; returned page addr = start + offset - bra.s @valid ; ... <9> -@eDisk ; CASE(ram disk) - bsr GrabEdisk ; allocate from eDisk chunks, return type, page addr - bra.s @endSwitch ; ... -@mapped ; CASE(mapped) - move.l d3,d0 ; get phys addr/flags word - and.l #physMask,d0 ; mask all except suggested physical addr <7> - move.l d0,a0 ; returned page addr = suggested phys addr <7> - add.l d4,a0 ; .plus offset from start of template chunk -@valid moveq #0,d0 ; returned type = "valid page" -;fallThru bra.s @endSwitch ; ... - -@endSwitch ; ENDSWITCH - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 <7> - beq.s @on040 ; IF NOT on a 68040 THEN <7> - btst.l #FullTblBit,d3 ; Check if we want full MMU tables for this block - beq.s @term ; IF Full Tables wanted then - and.l #cBitMask,d3 ; get cache inhibit bit - bra.s @fullTables ; check table level - ; ELSE -@term and.l #cBitMask,d3 ; get cache inhibit bit <7> - bra.s @setCache ; ELSE <7> -@on040 and.l #c040ModeMask,d3 ; get cache mode bits <7> - -@fullTables bsr.w CanGoDeeper ; check if we are at the lowest Level <7> - beq.s @setCache ; >>EXITROUTINE if NOT on lowest level <7> - cmp.w #0,d0 ; check if we would have returned valid <7> - bne.s @setCache ; >>EXITROUTINE if NOT returning valid <7> - moveq #2,d0 ; can't have a page descriptor yet, return "doesn't fit" <7> -@setCache ; ENDIF <7> - lsl.l #6-cBitNum,d3 ; move it into position <7> - move.w d3,d1 ; return it - -@done movem.l (sp)+,PageRegs ; restore regs - rts - - ENDWITH ; {Template} - - -;----- -; GrabRAM - allocate some space from the chunks of RAM. -; -; The procedure scans the chunks, looking for one that has a non-zero size. -; It then determines whether the allocation amount fits in that chunk. No attempt -; is made to look at other chunks (if it doesn't fit in the first non-zero sized one) -; in order to preserve the ordering present in the chunk table. -; -; Entry: -; a4 - ptr to MakeTable stack frame -; d0 - amount to allocate -; d2.w - level -; d3 - phys addr/flags -; -; Exit: -; a0 - ptr to the RAM chunk -; d0 - type, as follows: -; zero: valid (allocation was successful) -; one: invalid (no RAM available) -; two: didn't fit (requested size didn't fit in first available chunk) -; -; if successful, RAM chunk's size reduced by allocation amount. -; -; Trashes -; d1 -;--- - -GrabRAM lea ramChunks(a4),a0 ; point at table of RAM chunks - move.l d0,d1 ; save allocation amt - moveq #1,d0 ; assume returning "invalid" (no RAM available) -@loop cmp.l #-1,(a0)+ ; LOOP while more chunks - beq.s @done ; >>EXITROUTINE if no more chunks - tst.l (a0)+ ; check size of chunk - beq.s @loop ; REPEAT while nothing in this chunk - moveq #2,d0 ; assume returning "didn't fit" - cmp.l -4(a0),d1 ; check size versus desired size - bhi.s @done ; IF chunk is big enough - - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 - beq.s @fulltbl ; IF on a 68040 THEN - - btst.l #FullTblBit,d3 ; Check if we want full MMU tables for this block - beq.s @term ; IF Full Tables wanted then - -@fulltbl bsr.w CanGoDeeper ; check if on lowest level <7> - bne.s @valid ; >>EXITROUTINE if we're not on lowest level <7> - ; ENDIF <7> -@term move.l -8(a0),d0 ; page addr = start addr chunk - add.l d1,-8(a0) ; increment start addr by allocation amt - sub.l d1,-4(a0) ; decrement chunk size by allocation amt - move.l d0,a0 ; return page addr -@valid moveq #0,d0 ; returned type = "valid" -@done ; ENDIF - rts - - -;----- -; GrabVideo - allocate some space from the RAM allocated to video -; -; Entry: -; a4 - ptr to MakeTable stack frame -; a5 - points to InitMMU stack frame <3.2> -; d0 - amount to allocate -; d2.w - level -; d3 - phys addr/flags -; -; Exit: -; If requested size didn't fit in video RAM chunk -; d0 - two (didn't fit) -; a0 - undefined -; If all video RAM already allocated -; d0 - zero (valid page) -; a0 - base of video RAM (makes end of buffer wrap to start) <3.2> -; If requested size successfully allocated from video RAM chunk -; d0 - zero (valid page) -; a0 - allocated RAM chunk addr -; video RAM chunk's size reduced by allocation amount. -; -; Trashes -; d1 -;--- - -GrabVideo move.l d0,d1 ; save allocation amt - move.l VRAMPhysBase(a5),a0 ; assume no vRAM left, wrap to physical buffer base <9> - tst.l vidSize(a4) ; check remaining video RAM - beq.s @valid ; EXITROUTINE w/valid if none left <3.2> - moveq #2,d0 ; assume returning "didn't fit" (not enuf video RAM left) - cmp.l vidSize(a4),d1 ; check if there is enough - bhi.s @done ; EXITROUTINE if not enough left - - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 - beq.s @fulltbl ; IF on a 68040 THEN - - btst.l #FullTblBit,d3 ; Check if we want full MMU tables for this block - beq.s @term ; IF Full Tables wanted then - -@fulltbl bsr.s CanGoDeeper ; check if we'er on the lowest level <7> - bne.s @valid ; >>EXITROUTINE if we're not on lowest level <7> - ; ENDIF <7> -@term move.l vidAddr(a4),a0 ; return ptr to video RAM chunk - add.l d1,vidAddr(a4) ; bump video addr by allocation amt - sub.l d1,vidSize(a4) ; decrease remaining size by allocation amt -@valid moveq #0,d0 ; return "valid" <3.2> -@done rts - - -;----- -; GrabEdisk - allocate some space from the RAM allocated to the RAM disk -; -; The procedure scans the chunks, looking for one that has a non-zero size. -; It then determines whether the allocation amount fits in that chunk. No attempt -; is made to look at other chunks (if it doesn't fit in the first non-zero sized one) -; in order to preserve the ordering present in the chunk table. -; -; Entry: -; a4 - ptr to MakeTable stack frame -; d0 - amount to allocate -; d2.w - level -; d3 - phys addr/flags -; -; Exit: -; a0 - ptr to the RAM disk chunk -; d0 - type, as follows: -; zero: valid (allocation was successful) -; one: invalid (no RAM available) -; two: didn't fit (requested size didn't fit in first available chunk) -; -; if successful, RAM disk chunk size reduced by allocation amount. -; -; Trashes -; d1 -;--- -GrabEdisk - lea eDskChunks(a4),a0 ; point at table of eDisk chunks - move.l d0,d1 ; save allocation amt - moveq #1,d0 ; assume returning "invalid" (no RAM available) -@loop cmp.l #-1,(a0)+ ; LOOP while more chunks - beq.s @done ; >>EXITROUTINE if no more chunks - tst.l (a0)+ ; check size of chunk - beq.s @loop ; REPEAT while nothing in this chunk - moveq #2,d0 ; assume returning "didn't fit" - cmp.l -4(a0),d1 ; check size versus desired size - bhi.s @done ; IF chunk is big enough - - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 - beq.s @fulltbl ; IF on a 68040 THEN - - btst.l #FullTblBit,d3 ; Check if we want full MMU tables for this block - beq.s @term ; IF Full Tables wanted then - -@fulltbl bsr.s CanGoDeeper ; check if we'er on the lowest level <7> - bne.s @valid ; >>EXITROUTINE if we're not on lowest level <7> - ; ENDIF <7> -@term move.l -8(a0),d0 ; page addr = start addr chunk - add.l d1,-8(a0) ; increment start addr by allocation amt - sub.l d1,-4(a0) ; decrement chunk size by allocation amt - move.l d0,a0 ; return page addr -@valid moveq #0,d0 ; returned type = "valid" -@done ; ENDIF - rts - - -;----- -; CanGoDeeper - check if we can generate tables at at next level -; -; Entry: -; d2.w - current level -; a4 - points to MakeTable stack frame -; -; Exit -; Z flag - ne if we can, eq if we can't -; -; Trashes -; none -;--- - -DeeperRegs REG d0/a0 ; - -CanGoDeeper - movem.l DeeperRegs,-(sp) ;save working registers - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 <7> - bne.s @not040 ; IF on a 68040 THEN <7> - - cmp.w #3,d2 ; third level is the deepest we can go <7> - bra.s @done ; ELSE <7> -@not040 cmp.w #4,d2 ; fourth level is the deepest we can go <7> -@1 beq.s @done ; >>EXITROUTINE w/failure if at deepest level <7> - clr.l d0 ; so not to mess up bfextu down below <7> - move.w d2,d0 ; get level - addq.w #1,d0 ; get next level - lsl.w #2,d0 ; multiply by four (= TIx field size) - add.w #12,d0 ; get offset to TIx field - move.l mmuSetupPtr(a4),a0 ; get ptr to MMU setup info - bfextu newtc(a0){d0,4},d0 ; get TIx field for next level (eq if no TIx bits) -@done ; ENDIF <7> - movem.l (sp)+,DeeperRegs ; restore regs - rts - - -;----- -; WritePageNode - write a page node to the intermediate table. -; -; Entry: -; d1.w - cache inhibit flag -; d2.w - current level -; d3.l - logical address span of the node -; a0 - page address -; a4 - points to MakeTable stack frame -; -; Trashes: -; d0/a0 -;--- - -WritePageNode - moveq #0,d0 ; clear a reg - move.w d2,d0 ; get the level - lsl.w #3,d0 ; shift level into place - or.w d1,d0 ; factor in the cache inhibit flag - add.l a0,d0 ; lay in the page address - addq.w #descrPage,d0 ; set type = 'page' -AdvAndWrite add.l d3,logicalAddr(a4) ; logical address += span of this entry -WriteNode move.l genPtr(a4),a0 ; get ptr to next intermediate table entry - move.l d0,-(a0) ; put entry into intermediate table <7> - move.l a0,genPtr(a4) ; save ptr to next entry - rts - - -;----- -; WriteInvalidNode - write an invalid page node to the intermediate table. -; -; Entry: -; d2.w - current level -; d3.l - logical address span of the node -; a4 - points to MakeTable stack frame -; -; Trashes: -; d0/a0 -;--- - -WriteInvalidNode - moveq #0,d0 ; clear a reg - move.w d2,d0 ; get the level - lsl.w #3,d0 ; shift level into place - ; NOTE: invalid type = 0, so its already there - bra.s AdvAndWrite ; advance logical address, write node to - ; .intermediate table & EXIT - - -;----- -; WriteTableNode - write a table node to the intermediate table. -; -; Entry: -; d2.w - level -; a4 - points to MakeTable stack frame -; -; Trashes: -; d0/a0 -;--- - -WriteTableNode - cmp.w #cpu68040,d7 ; Check whether or not we're on an 040 <7> - bne.s @not040 ; IF on a 68040 THEN <7> - - movea.l #NoLimit,a0 ; we don't have limit fields <7> - bra.s @1 ; ELSE <7> -@not040 bsr.s Limit ; get limit field - ; ENDIF <7> -@1 moveq #0,d0 ; clear a reg - move.w d2,d0 ; get the level - lsl.w #3,d0 ; shift level into place - tst.w a0 ; check if low word of a0 is nonzero - bne.s @doWrite ; IF it is clear THEN - addq.w #descrTbl4,d0 ; set type to '4 byte table descriptor' - add.l a0,d0 ; factor in the limit field - or.w #LongStat,d0 ; put in rest of status field -@doWrite bra.s WriteNode ; write node to intermediate table & EXIT - ; ENDIF - -;----- -; Limit - given current level, looks backwards in intermediate table to see if -; a limit can be used on the next deeper level. -; -; If limit is possible, entries are shifted in the table to get rid of any entries -; made obsolete by the limit. -; -; Entry: -; d2.w - current level -; a4 - points to MakeTable stack frame -; -; Exit: -; a0 - limit field -;--- - -Limit move.l d3,-(sp) ; save work reg - bsr.s CountLeading ; get # leading invalid entries at next level - move.w d0,d3 ; save it - bsr.s CountTrailing ; get # trailing invalid entries at next level - move.w d0,d1 ; save it - or.w d3,d0 ; check for both zero - bne.s @yesLimit ; IF no leading OR trailing invalids - movea.l #NoLimit,a0 ; no limit! - bra.s @haveLimit ; . -@yesLimit cmp.w d1,d3 ; ELSEIF more trailing than leading - bhi.s @doLeading ; . - move.w d1,d0 ; recall # trailing invalids - bsr.s HandleTrailing ; handle upper limit case - bra.s @haveLimit ; . -@doLeading ; ELSE - move.w d3,d0 ; recall # leading invalids - bsr.s HandleLeading ; handle lower limit case -@haveLimit ; ENDIF - move.l (sp)+,d3 ; restore work reg - rts - -;----- -; CountLeading - count the number of leading invalid entries for the next lower level. -; -; Entry: -; d2.w - current level -; a4 - points to MakeTable stack frame -; -; Exit: -; d0.w - # leading invalid entries -;--- - -CountLeading - moveq #0,d0 ; deal w/leading invalid entries later... - rts - -;----- -; HandleLeading - purge the leading invalid entries at the next level from -; the intermediate table, and return an appropriate limit field. -; -; Entry: -; d0.w - # leading invalids -; d2.w - current level -; a4 - points to MakeTable stack frame -; -; Exit: -; a0 - limit field -;--- - -HandleLeading - move.l #NoLimit,a0 ; deal w/leading invalid entries later... - rts - -;----- -; CountTrailing - count the number of trailing invalid entries for the next lower level. -; -; Entry: -; d2.w - current level -; a4 - points to MakeTable stack frame -; -; Exit: -; d0.w - # trailing invalid entries -;--- - -CountTrailing - moveq #0,d0 ; # trailing invalids = 0 - move.l genPtr(a4),a0 ; get ptr to next intermediate table entry -@loop ; LOOP backwards thru intermediate table - move.l (a0)+,d1 ; get entry <7> - bfextu d1{30,2},d1 ; get descriptor type - bne.s @exitLoop ; >>EXITLOOP if not invalid - addq.w #1,d0 ; bump # trailing invalids - cmpa.l intermedTbl(a4),a0 ; check if we're at start of table - bne.s @loop ; REPEAT till start of table -@exitLoop rts - - -;----- -; HandleTrailing - purge the trailing invalid entries at the next level from -; the intermediate table, and return an appropriate limit field. -; Entry: -; d0.w - # trailing invalids -; d2.w - current level -; a4 - points to MakeTable stack frame -; -; Exit: -; a0 - limit field -;--- - -HandleTrailing - move.l d2,-(sp) ; save work reg - exg d2,d0 ; get current level, save # trailers - addq.w #1,d0 ; look at level we're getting limit for - bsr.s SpanAndCount ; get max # entries for that level - cmp.w d2,d1 ; check max entries against trailing invalids - blt.s @invalidLevel ; IF less invalids than max entries THEN | - sub.w d2,d1 ; limit = max # - # trailing v - subq.w #1,d1 ; limits are zero-based! - swap d1 ; get limit field in hi word - clr.w d1 ; zap low word - move.l d1,a0 ; return it - moveq #0,d0 ; clear a reg - move.w d2,d0 ; get # trailing invalids - bra.s @bumpPtr ; go bump intermediate table ptr -@invalidLevel ; ELSE - move.l d1,d0 ; use max number of entries - move.l #1,a0 ; return a bad limit -@bumpPtr ; ENDIF - lsl.l #2,d0 ; get size of their intermediate table entries - add.l d0,genPtr(a4) ; purge entries from intermediate table <7> - move.l (sp)+,d2 ; restore reg - rts - - -;----- -; SpanAndCount - get the address span of a given table level, and # entries at that level -; -; Entry -; d0.w - level -; a4 - ptr to MakeTable stack frame -; -; Exit -; d0.l - address span -; d1.w - count -;--- - -SpanAndCount -SpanRegs REG d2-d3 - movem.l SpanRegs,-(sp) ; save regs - move.l mmuSetupPtr(a4),a0 ; get ptr to MMU setup info - cmp.w #cpu68040,d7 ; check if we are an 040 <7> - bne.s @not040 ; IF on a 68040 THEN <7> - - clr.l d2 ; clear reg for span bits <7> - clr.l d3 ; clear reg for entry bits <7> - subq.w #1,d0 ; convert level into table index <7> - move.b (TIX040,d0.w*2),d2 ; get # of bits in this level's span <7> - move.b (TIX040+1,d0.w*2),d3; get # of bits in entry count for this level <7> - move.l #14,d0 ; bit # in TC to test for page size on 68040 <7> - btst d0,newtc(a0) ; check what size pages we're using <7> - beq.s @8kPages ; IF we're using 4k pages <7> - subq #1,d2 ; span goes down by half <7> - addq #1,d3 ; and number of entries doubles <7> -@8kPages ; ENDIF <7> - bra.s @done ; ELSE <7> -@not040 moveq #32,d2 ; start w/all address bits - bfextu newtc(a0){12,4},d1 ; get # initial shift bits - sub.l d1,d2 ; reduce total bits by initial shift - moveq #16,d1 ; get bit offset to 1st TIx field - subq.w #1,d0 ; adjust level for dbra -@loopTIx ; LOOP - bfextu newtc(a0){d1,4},d3 ; get # bits this level - sub.l d3,d2 ; reduce total by # bits this level - addq.w #4,d1 ; bump offset to next TIx field - dbra d0,@loopTIx ; REPEAT for all levels - ; ENDIF <7> -@done moveq #0,d0 ; clear return reg - bset d2,d0 ; set address span for this level - moveq #0,d1 ; clear return reg - bset d3,d1 ; set # entries this level - movem.l (sp)+,SpanRegs ; restore regs - rts - -TIX040 ; 68040 built-in table index field sizes (8k pages) <7> -LevelOne dc.b 25,7 ; 32M span, 128 entries <7> -LevelTwo dc.b 18,7 ; 256k span, 128 entries <7> -LevelThree dc.b 13,5 ; 8k span, 32 entries <7> - -;----- -; FinalTable - generate the final MMU table from the intermediate table -; -; Entry: -; a4 - point to MakeTable stack frame -; intermediate table has been created -; -; Exit -; a0 - points to newly created MMU table -; d0 - has 1st word of crp (limit, descriptor type) -;--- - -FinalTable lea intermedTbl(a4),a0 ; get ptr to intermediate table - move.l a0,genPtr(a4) ; initialize scanning ptr - moveq #1,d0 ; start generating at level 1 - bsr.s Generate ; generate the table - tst.w doWrap24(a4) ; wrap the tables for 24-bit mode? <7> - beq.s @noWrap ; IF we need to wrap tables THEN <7> - bsr Wrap24BitTable ; wrap tables for 24-bit mode <7> -@noWrap ; ENDIF <7> - move.l ([genPtr,a4],-4),d1 ; get next intermediate table entry <7> - add.w d0,d1 ; make type '8 byte' if sub-table is 8 byte - and.w #descrTypeMask,d1 ; crp doesn't have extra status field bits - cmp.b #PMMU851,sgTypeMMU(a6) ; check MMU type CSS - bne.s @done ; IF we are on a 68851 - bset #9,d1 ; set 'shared global' bit -@done ; ENDIF - move.l d1,d0 ; return crp - rts - -;----- -; Generate - given a level, generate a (sub) table for that level -; -; Entry -; d0.w - level -; -; Exit -; d0.w - size (0 = short, 1 = long) of entries at this level -; a0 - ptr to generated table -;--- - -GenRegs REG d2-d4/a1-a2 -Generate movem.l GenRegs,-(sp) ; save work regs - move.l d0,d4 ; save level - bsr.s CountAndSize ; get #, size table entries needed - move.w d0,d3 ; save count - move.w d1,d2 ; save size - bsr.s AllocTbl ; allocate space for the (sub) table - move.l a0,a1 ; set up fill ptr for table - move.l a0,a2 ; remember table address - bra.s @repeat ; adjust for dbra -@loop ; LOOP - move.l ([genPtr,a4],-4),d0 ; get next intermediate table entry <7> - bfextu d0{27,2},d1 ; get level of this entry - cmp.w d1,d4 ; check against level we're generating for - bhs.s @notTbl ; IF entry's level deeper than ours - move.w d4,d0 ; recall level we are working on - addq.w #1,d0 ; bump to deeper level - bsr.s Generate ; generate sub-table at next deeper level - bsr MakeTableEntry ; make a 4/8 byte table descriptor at fill ptr <16> - bra.s @next ; ... -@notTbl bne.s @weird ; ELSEIF entry's level = ours - bsr MakePageEntry ; make a 4/8 byte page/invalid entry at fill ptr -;fallThru bra.s @next ; ... -@next ; ENDIF -@repeat dbra d3,@loop ; REPEAT for all entries at this level - move.l a2,a0 ; return ptr to generated table - move.w d2,d0 ; return size of entries in generated table - movem.l (sp)+,GenRegs ; restore work regs - rts - -@weird ; entry's level less deep than ours - SHOULD NEVER HAPPEN! - dc.w $A9FF ; trap to debugger, call Sculley - - -;----- -; CountAndSize - return number and size of entries for subtree at given level -; -; Number of entries is obtained by scanning forward in the intermediate table, -; counting entries at this level until a higher (lower in number) level entry -; is found. Size is assumed 4 byte, but is 8 byte if any of the intermediate -; table entries encountered at this level are 8 byte. -; -; Entry -; d0 - level -; a4 points to MakeTable stack frame -; -; Exit -; d0.w - number of entries -; d1.w - zero if 4 byte descriptors, one if eight byte descriptors -;--- - -CountRegs REG d2-d4 -CountAndSize - movem.l CountRegs,-(sp) ; save work registers - move.w d0,d2 ; save level of interest - move.l genPtr(a4),a0 ; get ptr to itermediate table entry - moveq #0,d1 ; assume 4 byte descriptors - moveq #0,d0 ; count = zero -@loop ; LOOP - move.l -(a0),d3 ; get next intermediate table entry <7> - bfextu d3{27,2},d4 ; get level of this entry - cmp.w d4,d2 ; compare level to ours - bhi.s @done ; >>EXITIF level less deep than ours - bne.s @loop ; COUNTINUELOOP if not same level as ours - addq.w #1,d0 ; bump count - bfextu d3{30,2},d4 ; get type from entry - cmp.w #descrTbl4,d4 ; check it - bne.s @loop ; CONTINUELOOP if type ­ "4 byte table" - swap d3 ; get limit field - cmp.w #NoLimit>>16,d3 ; check the limit - beq.s @loop ; CONTINUELOOP if no limit - moveq #1,d1 ; signal we'll need 8 byte descriptors - bra.s @loop ; REPEAT -@done movem.l (sp)+,CountRegs ; restore work regs - rts - - -;----- -; AllocTbl - allocate quadlong aligned space for MMU table from BootGlobs -; -; Entry -; d0.w - # entries in table -; d1.w - size of entries (0 = short, 1 = long) -; d4.w - level -; a6 - points to BootGlobs -; -; Exit -; a0 - ptr to allocated space -; -;----- - -AllocTbl and.l #$FFFF,d0 ; clear hi word of # entries - addq.w #2,d1 ; convert size into scale factor - ext.l d1 ; clear hi word of size - lsl.l d1,d0 ; table size = scaled # entries - move.l a6,d1 ; get ptr to BootGlobs - add.l sgAllocOff(a6),d1 ; calculate current allocation ptr CSS - sub.l d0,d1 ; allocate our table - cmpi.w #cpu68040,d7 ; check the type of processor <16> - bne.s @notAn040 ; IF on a 68040 THEN <16> - lea AlignmentMasks,a0 ; get address of table alignment masks <16> - and.w (a0,d4.w*2),d1 ; align the table <16> - bra.s @aligned ; ELSE <16> -@notAn040 and.b #$F0,d1 ; ensure quad-long alignment for 020/030's <16> -@aligned ; ENDIF <16> - move.l d1,a0 ; return ptr to allocated space - sub.l a6,d1 ; figure out new allocation offset - move.l d1,sgAllocOff(a6) ; update allocation offset CSS - rts - -; Masks for aligning 68040 tables on the correct boundaries <16> -AlignmentMasks -Level0 dc.w 0 -Level1 dc.w $fe00 ; align to 512 bytes (SRP ptr) -Level2 dc.w $fe00 ; align to 512 bytes (ptrs IN 1st level) -Level3 dc.w $ff00 ; align to 256 bytes (ptrs IN 2nd level) - -;----- -; MakeTableEntry - make a 4 or eight byte table descriptor at passed fill ptr -; -; Entry -; d0 - size (0 = short, 1 = long) of entries in sub-table -; d2 - size (0 = short, 1 = long) of table descriptor to be made -; a0 - ptr to sub-table -; a1 - fill ptr -; a4 - points to MakeTable stack frame (genPtr points to next intermediate entry) -; -; Exit -; a1 - fillptr updated to next place to put a descriptor -; genPtr(a4) - points to next intermediate table entry -;--- - -MakeTableEntry - subq.l #4,genPtr(a4) ; bump scan ptr <7> - move.l ([genPtr,a4]),d1 ; get next intermediate table entry <7> - add.w d0,d1 ; make type '8 byte' if sub-table is 8 byte - bfextu d1{30,2},d0 ; get descriptor type - tst.w d2 ; check descriptor size - bne.s @eightByte ; IF its a 4 byte descriptor - add.l a0,d0 ; merge sub-table address w/type - bset #3,d0 ; set used bit, so processor won't have to - move.l d0,(a1)+ ; lay down descriptor, update fill ptr - bra.s @done ; ... -@eightByte ; ELSE (its an eight byte descriptor) - bfclr d1{24,6} ; clear rest of status field - bset #3,d1 ; set used bit, so processor won't have to - move.l d1,(a1)+ ; lay down limit & status, update fill ptr - move.l a0,(a1)+ ; lay down table address, update fill ptr -@done ; ENDIF - rts - - -;----- -; MakePageEntry - make a (4 or eight byte) page or table descriptor at passed fill ptr -; -; Entry -; d2 - size (0 = short, 1 = long) of descriptor to be made -; a1 - fill ptr -; a4 - points to MakeTable stack frame (genPtr points to next intermediate entry) -; -; Exit -; a1 - fillptr updated to next place to put a descriptor -; genPtr(a4) - points to next intermediate table entry -;--- - -MakePageEntry - subq.l #4,genPtr(a4) ; bump scan ptr <7> - move.l ([genPtr,a4]),d0 ; get next intermediate table entry <7> - bfextu d0{25,7},d1 ; get descriptor type, cache inhibit bit - and.w #$FF00,d0 ; clear out all except page address - bfset d1{27,2} ; set modified, used bits so processor won't have to - tst.w d2 ; check descriptor size - bne.s @eightByte ; IF its a 4 byte descriptor - add.l d0,d1 ; merge page address w/status field - move.l d1,(a1)+ ; lay down descriptor, update fill ptr - bra.s @done ; ... -@eightByte ; ELSE (its an eight byte descriptor) - bfset d1{1,21} ; set limit to $7FFF, set up high bits of status - move.l d1,(a1)+ ; lay down limit & status, update fill ptr - move.l d0,(a1)+ ; lay down page address, update fill ptr -@done ; ENDIF - rts - - ENDWITH ; {MakeFrame} - ENDWITH ; {InitFrame} - ENDWITH ; {MMUSetupInfo} - -;----- -; Wrap24BitTable - Wrap the entries in the first and second level tables. This causes <7> -; the first byte in an address to be essentially ignored in 24-bit mode. -; Note: This routine assumes 4-byte descriptors. -; -; Entry -; a0 - points to newly created MMU table -; a4 - point to MakeTable stack frame -; -; Exit -; a0 - ptr to generated table -;--- - -WrapRegs REG d2/a1-a2 -Wrap24BitTable - movem.l WrapRegs,-(sp) ; save work registers - move.l a0,a2 ; save ptr to mmu table - move.w #2,d0 ; for level two, - bsr.s SpanAndCount ; find entrys' address span and count - mulu.l d1,d0 ; calc span of entire 2nd-level table - move.l #24,d2 ; bits in 16 meg chunk - lsr.l d2,d0 ; calc how many 16 meg chunks in level - and.l #$ffff,d1 ; clear high word of count - divu.w d0,d1 ; calc # of entries to duplicate - move.l (a2),d2 ; get table descriptor for first 2nd-level table - andi.l #$fffffff0,d2 ; get rid of attribute bits - move.l d2,a1 ; get it in an address register - subq.l #2,d0 ; (# of copies to make)-1 - movea.l a1,a0 ; get copy of pointer to table - lsl.l #2,d1 ; convert # of entries to bytes -@chunkLoop - adda.l d1,a0 ; point to copy destination - clr.l d2 ; clear counter -@copyLoop - move.l (a1,d2),(a0,d2) ; copy an entry - addq.l #4,d2 ; point to next entry - cmp.l d2,d1 ; done? - bne.s @copyLoop ; nope, keep looping - dbra d0,@chunkLoop ; do next chunk, if any - - moveq.l #1,d0 ; for level one -- - bsr.s SpanAndCount ; get address span and entry count - movea.l a2,a1 ; get a copy of the mmu table pointer - adda.l #4,a1 ; bump to point at second entry in table - subq.w #2,d1 ; (# of entries to copy) - 1 -@wrapLoop - move.l (a2),(a1)+ ; copy an entry - dbra d1,@wrapLoop ; loop through first level table - movea.l a2,a0 ; restore a0 - - movem.l (sp)+,WrapRegs ; restore work regs - rts ; - -;_____________________________________________________________________________________________ -; GetRBVSize - return size of RBV video buffer, optionally rounded up. -; -; Entry -; d0.l - total memory available -; d1.l - MMU page size to round buffer size up to. Zero if no rounding. -; a0 - RBV base address -; a2 - ProductInfo record ptr (for finding slot zero PRAM alias addr) <8.1> -; -; Exit -; d0 - the size -; -; all registers except parameters are preserved -;_____________________________________________________________________________________________ - - -GetRBVSize - - IF hasRBV THEN - bra.s DoRBVSize ; branch around tables, assembler barfs on fwd refs - -Trans ; Translations from monitor ID bits - dc.w 0 ; 000 = reserved (no monitor) - dc.w P15Table-Trans ; x01 = 15" portrait - dc.w IIGSTable-Trans ; 010 = IIgs - dc.w 0 ; 011 = reserved (no monitor) - dc.w 0 ; 100 = reserved (no monitor) - dc.w P15Table-Trans ; x01 = 15" portrait - dc.w MacIITable-Trans ; 110 = Mac 2 - dc.w 0 ; 111 = no monitor - -; these sizes are ordered to match the option bit ordering in DeclDataRBV.a - -SETable DC.L $0002AC00 ; SE (9" monitor), 8 bits/pixel, 171 Kbyte buffer <8.9> - DC.L $00005580 ; SE (9" monitor, 342x512), 1 bit/pixel, 21.375 Kbyte buffer <8.9> - DC.L $00015600 ; SE (9" monitor), 4 bits/pixel, 85.5 Kbyte buffer <8.9> - DC.L $0000A600 ; SE (9" monitor), 2 bits/pixel, 42.75 Kbyte buffer <8.9> - -IIGSTable DC.L $00030000 ; IIGS (12" monitor,384x512), 8 bits/pixel, 192 Kbyte buffer <8.9> - DC.L $00006000 ; IIGS (12" monitor,384x512), 1 bit/pixel, 24 Kbyte buffer <8.9> - DC.L $00018000 ; IIGS (12" monitor,384x512), 4 bits/pixel, 96 Kbyte buffer <8.9> - DC.L $0000C000 ; IIGS (12" monitor,384x512), 2 bits/pixel, 48 Kbyte buffer <8.9> - -MacIITable DC.L $0004B000 ; Mac II (12" monitor,640x480), 8 bits/pixel, 300 Kbyte buffer - DC.L $00009600 ; Mac II (12" monitor,640x480), 1 bit/pixel, 37.5 Kbyte buffer - DC.L $00025800 ; Mac II (12" monitor,640x480), 4 bits/pixel, 150 Kbyte buffer - DC.L $00012C00 ; Mac II (12" monitor,640x480), 2 bits/pixel, 75 Kbyte buffer - -P15Table - DC.L $00043F80 ; Portrait (15" monitor,640x870), 4 bits/pixel, 272 Kbyte buffer - DC.L $00010FE0 ; Portrait (15" monitor,640x870), 1 bit/pixel, 68 Kbyte buffer - DC.L $00021FC0 ; Portrait (15" monitor,640x870), 2 bits/pixel, 136 Kbyte buffer - - -GetRBVRegs REG d1-d4/a0 - -DoRBVSize movem.l GetRBVRegs,-(sp) ; save regs - - move.l d1,-(SP) ; save the rounding factor - - moveq #(1< - adda.l ProductInfo.VideoInfoPtr(a2),a0 ; point to the VideoInfo record <8.1> - moveq.l #0,d2 ; <8.1> - move.b VideoInfo.SlotPramAddr(a0),d2 ; set d2 = pram addr for slot zero <8.1> - - move.w d2,d0 ; <8.1> - addq.w #4,d0 ; get the last configuration flags from slot 0 pRAM <8.1> - - bsr ReadPRAMByte ; read it and weep... <5> - - eor.b d3,d0 ; exclusive or to see if anything changed - - btst #3,d0 ; did the RAM size change? - bne.s @configChanged ; if set, then it did - -;+++ btst #4,d0 ; did the CPU speed change? -;+++ bne.s @configChanged ; if set, then the configuration changed - -; test if the monitor type has changed - - move.w d2,d0 ; d2 = addr of slot zero pram <8.1> - addq.w #3,d0 ; get the last video sRsrc spID from pRAM <8.1> - bsr ReadPRAMByte ; read this pRAM - bclr #7,d0 ; mask off the spID hi bit - move.w d0,d3 ; remember this value in d3 - and.l #7,D0 ; lo-3 bits = monitor ID - - moveq #0,d1 ; clear this register out as a long in case there's no monitor - move.w (Trans,d4*2),d1 ; 0 = none, 1-4 = SE, IIGS, MacII, P15 - beq.s @gotSize ; if no monitor, then don't allocate any memory for video - - cmp.b d0,d4 ; is the monitor the same? - beq.s @noChange ; yup, so the saved slot pRAM value is OK - -@configChanged ; if we got here, then the CPU configuration has changed - ; PRESERVE D1 ACROSS THIS SECTION! - btst #3,d3 ; was the 1MB bit turned on? - beq.s @10 ; if not, then skip - bclr #4,d3 ; if 1MB, then ignore CPU speed -@10 - or.b d4,d3 ; OR the monitor ID in d4 with the config data in d3 to get - ; sRsrc id (with hi-bit off) - -; when 1MB/25MHz machines default to 1,2,4 instead of 1,2,4,8, then and extra test will be needed hee - -; -; at this point, we have the valid video sRsrc spID (sans bit 7) in d3. We use this value to look -; up the buffer size in the Trans table declared above -; - -@noChange - lea Trans,a0 ; point to table - moveq #0,d1 ; clear, in case there's no monitor <6.4> - move.w (Trans,d4*2),d1 ; 0 = none, 1-4 = SE, IIGS, MacII, P15 <6.4> - beq.s @gotSize ; if no monitor, then no memory for video <6.4> - adda.l d1,a0 ; offset to monitor's table <6.4> - lsr #3,d3 ; get the option bits at the bottom of d3 - move.l (a0,d3*4),d1 ; get the frame buffer size in d1 - - move.l (SP),d0 ; get the rounding factor in d0 - beq.s @gotSize ; IF rounding needed - move.l d1,d2 ; save our size - tdivu.l d0,d3:d2 ; get remainder of size/round factor - tst.l d3 ; check remainder - beq.s @gotSize ; IF any remainder - sub.l d3,d0 ; get round factor - remainder - add.l d0,d1 ; add to size to get next higher - ; ENDIF - ; ENDIF -@gotSize ; ENDIF - move.l d1,d0 ; return size - move.l (SP)+,d1 ; restore d1 - movem.l (sp)+,GetRBVRegs ; restore regs - ELSE - moveq #0,d0 ; no RBV, no size - ENDIF - - - RTS - - -;_____________________________________________________________________________________________ -; -; GetVISASize - calculate size of VISA video buffer -; -; This routine finds the amount of RAM occupied by the video frame buffer to be used by the -; VISA decoder, and adjusts the chunk table sizes accordingly. This code is similar to -; that in the Universal primaryInit (in RBVPrimaryInit.a). It needs to verify the -; connected display, and do some pRAM stuff to make this calculation work correctly. -; -; Preserves all registers -; -; Inputs : A2 = pointer to productInfo record -; A3 = VISA base address -; A6 = pointer to RAM chunk table -; -; Outputs : none -; -;_____________________________________________________________________________________________ - - WITH StartGlobals - -GetVISASize - -; I'm a bad dog to include these equates here, but they live in different files in Reality/split sources and -; the Reality version can't be included. - -sRsrc_VidElsA2Em EQU $A8 ; special Apple II emulation mode (1,4) -sRsrc_VidElsGSa EQU $A2 ; Rubik (1,4) - - - MOVEM.L A0/A2/A3/D0/D2/D4,-(SP) - - MOVE.B VsMonP(A3),D4 ; get the current monitor information - LSR.B #3,D4 ; shift the monitor ID into the low bits - AND.B #7,D4 ; clear out other bits - CMP.B #7,D4 ; if sense lines read 111 then no connect - BEQ.S @Done ; no changes needed if no connect - - CMP.B #2,D4 ; if =2, then Rubik display - BNE.S @isJersey ; if =6, then Jersey display - LEA RubikTbl,A1 ; point to the Rubik memory table - BRA.S @GetPRAM ; -@isJersey LEA JerseyTbl,A1 ; point to the Jersey memory table - -@GetPRAM - ADD.L ProductInfo.VideoInfoPtr(A2),A2 ; point to the VideoInfo record - MOVEQ #0,D2 ; clear out this register - MOVE.B VideoInfo.SlotPramAddr(A2),D2 ; get the start of pRAM for built-in video - ADDQ #4,D2 ; point to the config byte (see PrimaryInit) - - MOVE.W D2,D0 ; copy it to this register - BSR ReadPRAMByte ; get the config byte from pRAM in D0, the RAM-less way - - CMP.B D4,D0 ; was it the same configuration? - BNE.S @ReConfig ; no, so recalculate the default - -; the display configuration is the same, so use the spID in slot pRAM byte 3 to determine allocation - - MOVE.W D2,D0 ; point to pRAM byte again, clearing bits 8-15 of D0 - SUBQ #1,D0 ; point to byte 3 - BSR ReadPRAMByte ; get the config byte from pRAM in D0, the RAM-less way - - CMP.W #sRsrc_VidElsA2Em,D0 ; is it the Apple II emulation mode? - BNE.S @0 ; if not, continue - - MOVE.B #sRsrc_VidElsGSa,D0 ; memory allocation for the Apple II mode is same as Rubik (1,4) -@0 - LSR.B #3,D0 ; shift lo to make index - AND.B #3,D0 ; just the low two bits - BRA.S @GetSize ; - -; the display configuration is different, so determine the new default - -@ReConfig - MOVEQ #0,D0 ; zero index register - CMP.B #2,D4 ; if =2, then Rubik display, so default is RAM sensitive - BNE.S @GetSize ; if Jersey, then no RAM size variant - CMP.L #$100000,sgTotalRAM(A6) ; is there more than a megabyte of RAM? CSS - BGT.S @GetSize ; if so, then select variant 0 - ADDQ #1,D0 ; select variant 1 for Elsie with 1MB on Rubik - -@GetSize - MOVE.L (A1,D0.W*4),D0 ; get size for this config. A1=Monitor table, D0=index in tbl - -; adjust the sgAllocOff field down by the frame buffer size - - MOVE.L sgTotalRAM(A6),D2 ; get total ram CSS - SUB.L D0,D2 ; subtract frame buffer size to get base of frame buffer - SUB.L A6,D2 ; make frame buffer base relative to pointer to boot globals - MOVE.L D2,sgAllocOff(A6) ; CSS - -@Done - MOVEM.L (SP)+,A0/A2/A3/D0/D2/D4 ; restore work registers - RTS - -RubikTbl DC.L $0001B400,$00007000,$0003B400,$00027000 ; sizes for Rubik (1,4),(1),(1,4,2Pg),(1,2Pg) -JerseyTbl DC.L $0000B000,$00000000,$0002B000 ; sizes for Jersey (1), , (1,2Pg) <12> - - ENDWITH ; {MMUConfigInfo} ENDWITH ; {BootGlobs} diff --git a/OS/MemoryMgr/MemoryMgr.make b/OS/MemoryMgr/MemoryMgr.make index 1701bbd..86058fb 100644 --- a/OS/MemoryMgr/MemoryMgr.make +++ b/OS/MemoryMgr/MemoryMgr.make @@ -17,21 +17,20 @@ FigmentDir = {MemoryMgrDir}FigmentSources: -#include {FigmentDir}Figment.Make - - MemoryMgrObjs = "{ObjDir}MemoryMgr.a.o" ¶ "{ObjDir}MemoryMgrExtensions.a.o" ¶ "{ObjDir}MemoryMgrInternal.a.o" ¶ "{ObjDir}BlockMove.a.o" -"{LibDir}MemoryMgr.lib" Ä "{LibDir}Figment.lib" {MemoryMgrObjs} - If "{FeatureSet}" =~ /Å'hasNewHeapMgr=True'Å/ - Lib {StdLibOpts} -o "{Targ}" "{LibDir}Figment.lib" {MemoryMgrObjs} - Else - Lib {StdLibOpts} -o "{Targ}" {MemoryMgrObjs} - End +#include {FigmentDir}Figment.Make + +# "{LibDir}MemoryMgr.lib" Ä "{LibDir}Figment.lib" {MemoryMgrObjs} +# If "{FeatureSet}" =~ /Å'hasNewHeapMgr=True'Å/ +# Lib {StdLibOpts} -o "{Targ}" "{LibDir}Figment.lib" {MemoryMgrObjs} +# Else +# Lib {StdLibOpts} -o "{Targ}" {MemoryMgrObjs} +# End "{ObjDir}BlockMove.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/OS/NKEventGroupWrapper.a b/OS/NKEventGroupWrapper.a new file mode 100644 index 0000000..8114f69 --- /dev/null +++ b/OS/NKEventGroupWrapper.a @@ -0,0 +1,55 @@ +; Straightforward 68k wrappers for three NanoKernel MPCalls related to EventGroups + +MPCall49 PROC EXPORT ; create an EventGroup (will be for blue), return its ID + + Link A6, #$0 + MoveQ.L #49, D0 + dc.w $fe1f + Move.L D0, $C(A6) + Move.L $8(A6), D0 + BEQ.B (* + $6) + MoveA.L D0, A1 + Move.L A0, (A1) + Unlk A6 + MoveA.L (SP)+, A0 + AddQ #$4, SP + Jmp (A0) + + + +MPCall54 PROC EXPORT + + Link A6, #$0 + MoveA.L $C(A6), A0 + Move.L $8(A6), D1 + MoveQ.L #54, D0 + dc.w $fe1f + Move.L D0, $10(A6) + Unlk A6 + MoveA.L (SP)+, A0 + AddQ.L #$8, SP + Jmp (A0) + + + +MPCall52 PROC EXPORT + + Link A6, #$0 + MoveA.L $8(A6), A1 + MoveA.L $10(A6), A0 + MoveQ.L #52, D0 + dc.w $fe1f + Move.L D0, $14(A6) + Move.L $C(A6), D0 + BEQ.B (* + $6) + MoveA.L D0, A1 + Move.L A0, (A1) + Unlk A6 + MoveA.L (SP)+, A0 + DC.W $defc, $000c +; AddA.W #$C, SP + Jmp (A0) + + + + END \ No newline at end of file diff --git a/OS/NKLogShim.a b/OS/NKLogShim.a new file mode 100644 index 0000000..2397394 --- /dev/null +++ b/OS/NKLogShim.a @@ -0,0 +1,68 @@ +; To print a C string: +; PEA @cstring +; MOVE $-3, -(SP) +; DC.W $AA7F + +; To print a hex string: +; MOVE.L #value, -(SP) +; MOVE #2, -(SP) ; 1: byte, 2: word, else: long +; MOVE $-2, -(SP) +; DC.W $AA7F + + +NKLog PROC EXPORT + CmpI #-3, $4(SP) + BEQ.S NKxprintf + + CmpI #-2, $4(SP) ; + BEQ.S NKPrintHex + + Pea.L @errStr ; ERROR + Clr -(SP) + Bsr NKxprintf + + MoveQ.L #$0, D0 + Move $4(SP), D0 + Move.L D0, -(SP) + Move.L #$2, -(SP) + Clr -(SP) + Bsr NKPrintHex + Rts + + string Pascal +@errStr dc.b 'Unknown MPDispatch selector: ', 0, 0 + + +NKxprintf + + MoveA.L $6(SP), A0 + +@loop Move.B (A0)+, D0 ; iterate over string to get it in physical RAM? + BNE.S @loop + + MoveA.L $6(SP), A0 + + MoveQ.L #96, D0 ; call NKXprintf + dc.w $fe1f + + MoveA.L (SP)+, A0 ; return + AddQ.L #$6, SP + Jmp (A0) + + +NKPrintHex + + MoveA.L $A(SP), A0 ; r3 arg (value to print) + Move.L $6(SP), D1 ; r4 arg (1: byte, 2: 2byte, else: 4byte) + + MoveQ.L #97, D0 ; call NKPrintHex + dc.w $fe1f + + MoveA.L (SP)+, A0 ; return + dc.w $defc, $000A +; AddA.W #$A, SP + Jmp (A0) + + + + END diff --git a/OS/OS.make b/OS/OS.make index 567c4d6..80426c1 100644 --- a/OS/OS.make +++ b/OS/OS.make @@ -77,29 +77,28 @@ RealTimeDir = {OSDir}RealTime: #include {RealTimeDir}RealTime.make -OSObjs = "{ObjDir}clock.a.o" ¶ +OSObjs = "{ObjDir}BCScreenRelated.o" ¶ + "{ObjDir}clock.a.o" ¶ "{ObjDir}CrsrDev.a.o" ¶ "{ObjDir}CudaMgr.a.o" ¶ "{ObjDir}DeferredTaskMgr.a.o" ¶ - "{ObjDir}DeviceMgr.a.o" ¶ - "{ObjDir}DockingMgr.a.o" ¶ + "{ObjDir}DeviceRelatedMgr.o" ¶ "{ObjDir}EgretMgr.a.o" ¶ "{ObjDir}HwPriv.a.o" ¶ - "{ObjDir}I2C.a.o" ¶ "{ObjDir}Universal.a.o" ¶ - "{ObjDir}InterruptHandlers.a.o" ¶ - "{ObjDir}IOPMgr.a.o" ¶ "{ObjDir}OSEventMgr.a.o" ¶ "{ObjDir}queue.a.o" ¶ "{ObjDir}sysUtil.a.o" ¶ "{ObjDir}VerticalRetraceMgr.a.o" ¶ "{ObjDir}MiscPatches.a.o" ¶ - "{ObjDir}MagicData.a.o" ¶ "{ObjDir}PowerMgr.o" ¶ - "{ObjDir}PwrControlsPatches.o" ¶ "{ObjDir}VMPatches.a.o" ¶ + "{ObjDir}NKLogShim.a.o" ¶ "{ObjDir}Dispatch.a.o" ¶ - "{ObjDir}UniversalTables.a.o" + "{ObjDir}UniversalTables.a.o" ¶ + "{ObjDir}NKEventGroupRelated.a.o" ¶ + "{ObjDir}InterruptHandlers.a.o" ¶ + "{ObjDir}NKEventGroupWrapper.a.o" "{LibDir}OS.lib" Ä {OSObjs} @@ -133,14 +132,14 @@ OSObjs = "{ObjDir}clock.a.o" Asm {StdAOpts} -o "{Targ}" "{OSDir}DeferredTaskMgr.a" -"{ObjDir}DeviceMgr.a.o" Ä "{OSDir}DeviceMgr.a" ¶ - "{ObjDir}StandardEqu.d" ¶ - "{AIncludes}HardwareEqu.a" ¶ - "{IntAIncludes}UniversalEqu.a" ¶ - "{AIncludes}ROMEqu.a" ¶ - "{AIncludes}Slots.a" ¶ - "{AIncludes}FSEqu.a" - Asm {StdAOpts} -o "{Targ}" "{OSDir}DeviceMgr.a" +# "{ObjDir}DeviceMgr.a.o" Ä "{OSDir}DeviceMgr.a" ¶ +# "{ObjDir}StandardEqu.d" ¶ +# "{AIncludes}HardwareEqu.a" ¶ +# "{IntAIncludes}UniversalEqu.a" ¶ +# "{AIncludes}ROMEqu.a" ¶ +# "{AIncludes}Slots.a" ¶ +# "{AIncludes}FSEqu.a" +# Asm {StdAOpts} -o "{Targ}" "{OSDir}DeviceMgr.a" "{ObjDir}DispatchHelper.a.o" Ä "{ObjDir}StandardEqu.d" ¶ @@ -191,19 +190,19 @@ OSObjs = "{ObjDir}clock.a.o" "{IntAIncludes}i2cEqu.a" Asm {StdAOpts} -o "{Targ}" "{I2CDir}I2C.a" -"{ObjDir}InterruptHandlers.a.o" Ä "{ObjDir}StandardEqu.d" ¶ - "{IntAIncludes}HardwarePrivateEqu.a" ¶ - "{IntAIncludes}SysPrivateEqu.a" ¶ - "{IntAIncludes}UniversalEqu.a" ¶ - "{IntAIncludes}IOPrimitiveEqu.a" ¶ - "{AIncludes}Shutdown.a" ¶ - "{IntAIncludes}PowerPrivEqu.a" ¶ - "{IntAIncludes}EgretEqu.a" ¶ - "{IntAIncludes}PSCEqu.a" ¶ - "{IntAIncludes}AMICEqu.a" ¶ - "{IntAIncludes}GrandCentralPriv.a" ¶ - "{OSDir}InterruptHandlers.a" - Asm {StdAOpts} -o "{Targ}" "{OSDir}InterruptHandlers.a" +# "{ObjDir}InterruptHandlers.a.o" Ä "{ObjDir}StandardEqu.d" ¶ +# "{IntAIncludes}HardwarePrivateEqu.a" ¶ +# "{IntAIncludes}SysPrivateEqu.a" ¶ +# "{IntAIncludes}UniversalEqu.a" ¶ +# "{IntAIncludes}IOPrimitiveEqu.a" ¶ +# "{AIncludes}Shutdown.a" ¶ +# "{IntAIncludes}PowerPrivEqu.a" ¶ +# "{IntAIncludes}EgretEqu.a" ¶ +# "{IntAIncludes}PSCEqu.a" ¶ +# "{IntAIncludes}AMICEqu.a" ¶ +# "{IntAIncludes}GrandCentralPriv.a" ¶ +# "{OSDir}InterruptHandlers.a" +# Asm {StdAOpts} -o "{Targ}" "{OSDir}InterruptHandlers.a" "{ObjDir}IOPMgr.a.o" Ä "{ObjDir}StandardEqu.d" ¶ @@ -255,14 +254,14 @@ OSObjs = "{ObjDir}clock.a.o" Asm {StdAOpts} -o "{Targ}" "{OSDir}Universal.a" -i "{OSDir}StartMgr" -"{ObjDir}UniversalTables.a.o" Ä "{ObjDir}StandardEqu.d" ¶ - "{IntAIncludes}HardwarePrivateEqu.a" ¶ - "{IntAIncludes}UniversalEqu.a" ¶ - "{AIncludes}Slots.a" ¶ - "{IntAincludes}DepVideoEqu.a" ¶ - "{AIncludes}ROMEqu.a" ¶ - "{OSDir}UniversalTables.a" - Asm {StdAOpts} -o "{Targ}" "{OSDir}UniversalTables.a" -i "{OSDir}IoPrimitives:" +# "{ObjDir}UniversalTables.a.o" Ä "{ObjDir}StandardEqu.d" ¶ +# "{IntAIncludes}HardwarePrivateEqu.a" ¶ +# "{IntAIncludes}UniversalEqu.a" ¶ +# "{AIncludes}Slots.a" ¶ +# "{IntAincludes}DepVideoEqu.a" ¶ +# "{AIncludes}ROMEqu.a" ¶ +# "{OSDir}UniversalTables.a" +# Asm {StdAOpts} -o "{Targ}" "{OSDir}UniversalTables.a" -i "{OSDir}IoPrimitives:" "{ObjDir}VerticalRetraceMgr.a.o" Ä "{ObjDir}StandardEqu.d" ¶ @@ -282,3 +281,11 @@ OSObjs = "{ObjDir}clock.a.o" "{ObjDir}VMPatches.a.o" Ä "{OSDir}VMPatches.a" Asm {StdAOpts} -o "{Targ}" "{OSDir}VMPatches.a" + + +"{ObjDir}NKLogShim.a.o" Ä "{OSDir}NKLogShim.a" + Asm {StdAOpts} -o "{Targ}" "{OSDir}NKLogShim.a" + + +"{ObjDir}NKEventGroupWrapper.a.o" Ä "{OSDir}NKEventGroupWrapper.a" + Asm {StdAOpts} -o "{Targ}" "{OSDir}NKEventGroupWrapper.a" diff --git a/OS/OSEventMgr.a b/OS/OSEventMgr.a index 72dfb69..64aafd4 100644 --- a/OS/OSEventMgr.a +++ b/OS/OSEventMgr.a @@ -129,10 +129,11 @@ INCLUDE 'Balloons.a' ; INCLUDE 'BalloonsPriv.a' ; INCLUDE 'PowerPrivEqu.a' ; + INCLUDE 'Processes.a' Events PROC EXPORT - EXPORT InitEvents,PostEventTrap,GetOSEventTrap,OSEventAvailTrap,FlushEvents + EXPORT InitEvents,PostEventTrap,GetOSEventTrap,OSEventAvailTrap,FlushEvents,NewEMFunction IMPORT EnqueueTrap,DequeueTrap,SMgrPostMunging @@ -143,7 +144,7 @@ EvtOffset EQU 6 ; event record offset from start of ;_______________________________________________________________________ ; -; Routine: InitEvents +; Routine: InitEvents afe0 ; ; Arguments: D0 (input) -- number of elements in the event queue ; D0 (output) -- result code @@ -184,7 +185,7 @@ InitEvents move.w EventQueue,d2 ; check the first word of the EventQ ;_______________________________________________________________________ ; -; Routine: PostEvent +; Routine: PostEvent b010 ; ; Arguments: A0 (input) -- event number (16-bit) ; D0 (input) -- event message (32-bit) @@ -304,7 +305,7 @@ FillRecord MOVE.L Ticks,EvtTicks(A0) ; fill in the current time ;_______________________________________________________________________ ; -; Routine: OSEventavail +; Routine: OSEventavail b09c ; ; Arguments: A0 (input) -- pointer to user event record (32-bit) ; D0 (input) -- set of events desired (event mask) @@ -330,8 +331,9 @@ FillRecord MOVE.L Ticks,EvtTicks(A0) ; fill in the current time ;_______________________________________________________________________ OSEventAvailTrap - IMPORT ptchHMGetBalloons ; rb, start - IMPORT ptchHMCallTrackerInContext + ANDI.L #$FFFF,D0 + +OSEventAvailSkippingAndi with PowerDispRec MOVEM.L A0-A1/D0-D2,-(SP) ; we need to save these regs @@ -348,7 +350,40 @@ OSEventAvailTrap BNE.S @DoNothing ; do nothing on the reentrant case ST hmgOSEventReentrantCount(A0) ; say that we're busy - JSR ptchHMCallTrackerInContext + +; from BalloonExtensions.a: ptchHMCallTrackerInContext + + SUBQ #$8, SP + SUBQ #$2, SP + PEA.L $2(SP) + + MOVEQ.L #-$1, D0 ; like _GetFrontProcess but not quite + MOVE.L D0, -(SP) + MOVE #$39, -(SP) + _OSDispatch + + TST (SP)+ + BNE.B @wasError + SUBQ #$2, SP + + PEA.L $2(SP) + _WakeUpProcess + + TST (SP)+ + BNE.B @wasError + + SUBQ #$2, SP + MOVE #$FC, D0 ; from Balloonptch28.p: HMBalloonBulk + _Pack14 + + TST (SP)+ +@wasError AddQ #$8, SP + + ; from BalloonExtensions.a: ptchHMGetHelpGlobal + MOVE.L ExpandMem,A0 ; point to the expand mem ptr + MOVE.L ExpandMemRec.emHelpGlobals(A0),A0 ; return the global ptr on the stack + + CLR hmgOSEventReentrantCount(A0) @DoNothing MOVEM.L (SP)+,A0-A1/D0-D2 ; restore 'em, rb, end @@ -389,9 +424,12 @@ TstAutoEvent AND.W SysEvtMask,D0 ; figure in system mask for pseudo-evts MOVE.L Ticks,D1 ; check first threshold MOVE.L D1,D2 SUB.L KeyTime,D1 + CMPI.L #$8000,D1 + BGE @skip CMP KeyThresh,D1 BLT.S NoEventAvail ; br if not time yet +@skip SUB.L KeyRepTime,D2 ; check second threshold CMP KeyRepThresh,D2 BLT.S NoEventAvail ; br if not time yet @@ -439,7 +477,7 @@ NoEventAvail BSR.S FillRecord ; fill in record for null events ;_______________________________________________________________________ ; -; Routine: GetOSEvent +; Routine: GetOSEvent b1aa ; ; Arguments: A0 (input) -- pointer to user event buffer (32-bit) ; D0 (input) -- type of event desired (event mask) @@ -458,7 +496,10 @@ NoEventAvail BSR.S FillRecord ; fill in record for null events ; Other: uses D0,D1,D2,A0,A1 ;_______________________________________________________________________ -GetOSEventTrap BSR.S OldOSEventAvail ; first find the event +GetOSEventTrap ANDI.L #$FFFF,D0 + +GetOSEventSkippingAndi + BSR.S OldOSEventAvail ; first find the event BNE.S @EventDone ; don't dequeue null or update events MOVE.L A0,-(SP) ; save user's event record ptr @@ -487,7 +528,7 @@ DeleteEvt JSR DequeueTrap ; dequeue it (D0 destroyed) ;_______________________________________________________________________ ; -; Routine: FlushEvents +; Routine: FlushEvents b1ea ; ; Arguments: D0 (input) -- low word: events to remove (event mask) ; high word: events on which to stop (event mask) @@ -548,33 +589,38 @@ FlushStop MOVEM.L (SP)+,D3-D4 ; restore regs MOVE.W (SP)+, SR ; on as our result RTS - END - - - - - - - - - - - - - - - - - - - - - - - - - - - + +NewEMFunction +; b232 + MoveA.L (A7)+, A1 + CmpI #$1, D0 + BEQ.B L13 + CmpI #$2, D0 + BEQ.B L14 + CmpI #$3, D0 + BEQ.B L15 + MoveQ.L #$C, D0 + DC.W $A9C9 +L13 Move.L (A7)+, D0 + MoveA (A7)+, A0 + Move.L A1, -(A7) + Bsr GetFreeOne + Bra.B L16 +L14 MoveA.L (A7)+, A0 + Move.L (A7)+, D0 + Move.L A1, -(A7) + Bsr OSEventAvailSkippingAndi + Not.L D0 + AndI.L #$101, D0 + Bra.B L16 +L15 MoveA.L (A7)+, A0 + Move.L (A7)+, D0 + Move.L A1, -(A7) + Bsr GetOSEventSkippingAndi + Not.L D0 + AndI.L #$101, D0 +L16 Move.L D0, $4(A7) + Rts + END diff --git a/OS/PowerMgr/PowerMgr.a b/OS/PowerMgr/PowerMgr.a index 31d267e..911de97 100644 --- a/OS/PowerMgr/PowerMgr.a +++ b/OS/PowerMgr/PowerMgr.a @@ -615,7 +615,7 @@ PowerMngr PROC EXPORT ;________________________________________________________________________________________ ; -; Routine: InitPMgrVars +; Routine: InitPMgrVars c3c0 ; ; Inputs: none ; @@ -982,7 +982,7 @@ InitPmgrGlobals ;________________________________________________________________________________________ ; -; Routine: InitPMgrOp +; Routine: InitPMgrOp c446 ; ; Inputs: A3 -- pointer to Power Manager's variables ; @@ -1004,7 +1004,7 @@ InitPMgrOp LEA cmdCounts,A0 ; save pointers to the PMgrOp send/receive count ;________________________________________________________________________________________ ; -; Routine: SetupPMgrOpInterface +; Routine: SetupPMgrOpInterface c45e ; ; Inputs: none ; @@ -1046,7 +1046,7 @@ SetupPMgrOpInterface ;________________________________________________________________________________________ ; -; Routine: DoPmgrCommands +; Routine: DoPmgrCommands c49c ; ; Inputs: A3 -- Pointer to PmgrVars ; @@ -1109,7 +1109,7 @@ DoPmgrCommands ;________________________________________________________________________________________ ; -; Routine: DoDynamicSpeedChange +; Routine: DoDynamicSpeedChange c540 ; ; Inputs: A3 -- Pointer to PmgrVars ; @@ -1233,7 +1233,7 @@ GetPmgrPRAM ;________________________________________________________________________________________ -; Routine: InstallVBLs +; Routine: InstallVBLs c6de ; ; Inputs: A3 -- Pointer to PmgrVars ; @@ -1401,7 +1401,7 @@ BatWatch ;________________________________________________________________________________________ ; -; Routine: RemoveMsg +; Routine: RemoveMsg c780 ; ; Inputs: A2 - pointer to Power Manager's variables ; @@ -1464,7 +1464,7 @@ InstallMsg ;________________________________________________________________________________________ ; -; Routine: PMGRInt +; Routine: PMGRInt c79e ; ; Inputs: A1 - pointer to VIA1 base ; @@ -2249,7 +2249,7 @@ SetHDState ;________________________________________________________________________________________ ; | -; Routine: PmgrOp v +; Routine: PmgrOp ceb2 v ; ; Inputs: D1 - trap word ; @@ -2291,7 +2291,7 @@ PmgrOp ;________________________________________________________________________________________ ; -; Routine: PmgrTrap +; Routine: PmgrTrap cef6 ; ; Inputs: A0 -- pointer to Power Manager parameter block ; [word] command/reply @@ -2569,7 +2569,7 @@ pmgrPollRegs REG D3/D4/D5/D6/A0/A1/A2/A4 ;________________________________________________________________________________________ ; -; Routine: Wait4AckLo +; Routine: Wait4AckLo d09e ; ; Inputs: D2 -- timeout count ; A1 -- pointer to VIA1 base @@ -2599,7 +2599,7 @@ Wait4AckLo MOVEA.L (SP)+,A4 ; save the return address ;________________________________________________________________________________________ ; -; Routine: Wait4AckHi +; Routine: Wait4AckHi d0b8 ; ; Inputs: D2 -- timeout count ; A1 -- pointer to VIA1 base @@ -2629,7 +2629,7 @@ Wait4AckHi MOVEA.L (SP)+,A4 ; save the return address ;________________________________________________________________________________________ ; -; Routine: ReceiveByte +; Routine: ReceiveByte d0d2 ; ; Inputs: D6 -- interface type ; 0=parallel @@ -2704,7 +2704,7 @@ SendRcvDone BSET #PMreq,(A2) ; be sure /req is not asserted ;________________________________________________________________________________________ ; -; Routine: SendByte +; Routine: SendByte d136 ; ; Inputs: D1 -- byte to send ; D2 -- timeout count @@ -2769,7 +2769,7 @@ DisableBuf BRA.S @Buf2Input ; [0] parallel interface ;________________________________________________________________________________________ ; -; Routine: UnloadPollstack +; Routine: UnloadPollstack d180 ; ; Inputs: D7 -- pointer to top of poll stack ; A1 -- pointer to VIA1 base @@ -3378,7 +3378,7 @@ replyCounts DC.B 0 ; [$00] - ;________________________________________________________________________________________ ; -; _CommsPower - Communications' port power control +; _CommsPower - Communications' port power control d3a8 ; _SerialPower ($A685) - Serial port power control ; ; Enter with: D0 = bit pattern @@ -3493,7 +3493,7 @@ SerialPower ;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ djw -; Modem Sound Interrupt Handlers +; Modem Sound Interrupt Handlers d3f4 ; ; Modem sound on Tim is implemented through DFAC's aux channel. The modem demands ; and releases the sound path through the MODEM_SND_ENABLE signal (on VIA1 CB2). The @@ -3524,7 +3524,7 @@ ModemSndOnInt rts ;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; Modem Sound Interrupt Handlers | +; Modem Sound Interrupt Handlers d464 | ; V ; Modem sound on Tim is implemented through DFAC's aux channel. The modem demands ; and releases the sound path through the MODEM_SND_ENABLE signal (on VIA1 CB2). The @@ -3555,7 +3555,7 @@ ModemSndOffInt ;________________________________________________________________________________________ ; -; IdleState ($A485) - Increments/decrements the idle enable flag count and returns +; IdleState d4d2 ($A485) - Increments/decrements the idle enable flag count and returns ; the current speed. ; ; Enter with: D0 < 0, read speed @@ -4350,7 +4350,7 @@ SlpQRemove CMP.W #slpQType,SleepqType(A0) ;________________________________________________________________________________________ ; -; Routine: ResetPMGRInts +; Routine: ResetPMGRInts c752 ; ; Inputs: A1 - VIA1 base address ; @@ -4456,7 +4456,7 @@ SetSupervisorMode JMP (A1) ; Get out of here ;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; Routine: PMGRsend/recv +; Routine: PMGRsend/recv d504/d506 ; ; Inputs: A0 - data buffer ; D0 - command diff --git a/OS/PowerMgr/PowerMgr.make b/OS/PowerMgr/PowerMgr.make index 4383e53..e12a1eb 100644 --- a/OS/PowerMgr/PowerMgr.make +++ b/OS/PowerMgr/PowerMgr.make @@ -14,22 +14,22 @@ # -"{ObjDir}PowerMgr.o" Ä "{ObjDir}StandardEqu.d" ¶ - "{IntAIncludes}HardwarePrivateEqu.a" ¶ - "{IntAIncludes}UniversalEqu.a" ¶ - "{IntAIncludes}PowerPrivEqu.a" ¶ - "{AIncludes}AppleTalk.a" ¶ - "{AIncludes}Notification.a" ¶ - "{IntAIncludes}IopEqu.a" ¶ - "{IntAIncludes}EgretEqu.a" ¶ - "{IntAIncludes}AppleDeskBusPriv.a" ¶ - "{IntAIncludes}MMUEqu.a" ¶ - "{IntAIncludes}IOPrimitiveEqu.a" ¶ - "{AIncludes}LAPEqu.a" ¶ - "{IntAIncludes}DockingEqu.a" ¶ - "{AIncludes}Slots.a" ¶ - "{PowerMgrDir}PowerMgr.a" - Asm {StdAOpts} -o "{Targ}" "{PowerMgrDir}PowerMgr.a" +# "{ObjDir}PowerMgr.o" Ä "{ObjDir}StandardEqu.d" ¶ +# "{IntAIncludes}HardwarePrivateEqu.a" ¶ +# "{IntAIncludes}UniversalEqu.a" ¶ +# "{IntAIncludes}PowerPrivEqu.a" ¶ +# "{AIncludes}AppleTalk.a" ¶ +# "{AIncludes}Notification.a" ¶ +# "{IntAIncludes}IopEqu.a" ¶ +# "{IntAIncludes}EgretEqu.a" ¶ +# "{IntAIncludes}AppleDeskBusPriv.a" ¶ +# "{IntAIncludes}MMUEqu.a" ¶ +# "{IntAIncludes}IOPrimitiveEqu.a" ¶ +# "{AIncludes}LAPEqu.a" ¶ +# "{IntAIncludes}DockingEqu.a" ¶ +# "{AIncludes}Slots.a" ¶ +# "{PowerMgrDir}PowerMgr.a" +# Asm {StdAOpts} -o "{Targ}" "{PowerMgrDir}PowerMgr.a" "{ObjDir}PwrControlsPatches.o" Ä "{ObjDir}StandardEqu.d" ¶ "{IntAIncludes}HardwarePrivateEqu.a" ¶ diff --git a/OS/Queue.a b/OS/Queue.a index 91dbf92..45b33c6 100644 --- a/OS/Queue.a +++ b/OS/Queue.a @@ -87,49 +87,6 @@ ENQDONE SUBQ #2,A1 ;restore A1 ENDP -;----------------------------------------------------------------------- -; EnqueueHead -- add a queue element to the head of a queue. -;----------------------------------------------------------------------- -; -; Entry: -; A0 - points to the queue element -; A1 - points to the queue header -; All registers are preserved; there are no error conditions. -; -; The element is inserted at the beginning of the list. -; -;----------------------------------------------------------------------- -; -ENQUEUEHEAD PROC EXPORT - - MOVE SR, -(SP) ;preserve status - ADDQ #2, A1 ;point to qHead - ORI #$0700, SR ;disable interrupts for exclusion - - TST.L (A1)+ ;anything in the queue? (qHead) - BNE.S @doQinsert ;if so, skip ahead -; -; the queue is empty so make the head and tail point to the new element -; - MOVE.L A0, (A1) ;qTail - MOVE.L A0, -(A1) ;qHead - CLR.L qLink(A0) ;clear the link of the element - BRA.S @enQdone -; -; insert the element at the head of the list -; -@doQinsert MOVE.L A2, -(SP) ;preserve A2 - MOVE.L -(A1), A2 ;get ptr to old qHead - MOVE.L A2, qLink(A0) ;update new link to old head - MOVE.L A0, (A1) ;update qHead - MOVE.L (SP)+, A2 ;restore A2 -; -@enQdone SUBQ #2, A1 ;restore A1 - MOVE (SP)+, SR ;restore status and go home - RTS - - ENDP - ; ;----------------------------------------------------------------------- ; diff --git a/OS/RealTime/RealTime.make b/OS/RealTime/RealTime.make new file mode 100644 index 0000000..e69de29 diff --git a/OS/SCSIMgr/SCSIMgr.make b/OS/SCSIMgr/SCSIMgr.make index 589d04c..6077460 100644 --- a/OS/SCSIMgr/SCSIMgr.make +++ b/OS/SCSIMgr/SCSIMgr.make @@ -38,8 +38,8 @@ SCSIObjects = "{ObjDir}scsiboot.a.o" "{ObjDir}SCSIMgrInitDB.a.o" ¶ "{ObjDir}SCSIMgrDB.a.o" ¶ -"{LibDir}SCSI.lib" Ä {SCSIObjects} - Lib {StdLibOpts} -o "{Targ}" {SCSIObjects} +# "{LibDir}SCSI.lib" Ä {SCSIObjects} +# Lib {StdLibOpts} -o "{Targ}" {SCSIObjects} "{ObjDir}SCSIBoot.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/OS/SlotMgr/SlotMgr.make b/OS/SlotMgr/SlotMgr.make index fbb4032..b68a544 100644 --- a/OS/SlotMgr/SlotMgr.make +++ b/OS/SlotMgr/SlotMgr.make @@ -16,8 +16,8 @@ SlotMgrObjs = "{ObjDir}SlotInterrupts.a.o" "{ObjDir}SlotMgrInit.a.o" ¶ "{ObjDir}SlotMgr.a.o" -"{LibDir}SlotMgr.lib" Ä {SlotMgrObjs} - Lib {StdLibOpts} -o "{Targ}" {SlotMgrObjs} +# "{LibDir}SlotMgr.lib" Ä {SlotMgrObjs} +# Lib {StdLibOpts} -o "{Targ}" {SlotMgrObjs} diff --git a/OS/StartMgr/StartAlert.a b/OS/StartMgr/StartAlert.a index a48ba85..a2e6085 100644 --- a/OS/StartMgr/StartAlert.a +++ b/OS/StartMgr/StartAlert.a @@ -113,7 +113,7 @@ ; --------------------------------------------------------------------------- -; Routine AllocFakeRgns +; Routine AllocFakeRgns 4a50 ; Arguments ; Function Sets up a dummy vis and clip region for the system alert port ; --------------------------------------------------------------------------- @@ -142,7 +142,7 @@ FakeRgn DC.W 10 ;--------------------------------------------------------------------------- -; ClipBox sets the clipRegion (stored in GetParam) to the DS Alert rect. +; ClipBox 4a80 sets the clipRegion (stored in GetParam) to the DS Alert rect. ; Trashes A0 and A1. ;--------------------------------------------------------------------------- @@ -160,7 +160,7 @@ ClipBox LEA DSAlertRect+8,A0 ; point to our rect <16-Oct-85><1.3> ;--------------------------------------------------------------------------- -; Routine DSErrorHandler +; Routine DSErrorHandler 4a9e ; Arguments DSErrCode (input) System error value ; Function Creates temporary QD world on stack & uses the current Deep shit ; alert table (DSAT) to decide what to draw/do based on the system @@ -319,7 +319,7 @@ RTS2SysErr BSR OpenClip ; set clip back to full size ;--------------------------------------------------------------------------- -; FindObject takes the logical alert ID in D0 and scans through the +; FindObject 4b88 takes the logical alert ID in D0 and scans through the ; association until it finds an entry with the matching ID. It returns ; a pointer to the object body in A0, which is NIL if it couldn't ; find anything. The z-Flag will be set if we couldn't find it. @@ -344,7 +344,7 @@ FindObject MOVE.L D7,A0 ;point to DS data structure ;--------------------------------------------------------------------------- -; DrawText draws the deep shit text structure as specified by the ID in D0 +; DrawText 4ba4 draws the deep shit text structure as specified by the ID in D0 ;--------------------------------------------------------------------------- DrawText MOVE.W (A3)+,D0 ;get the text ID @@ -387,7 +387,7 @@ DrawText MOVE.W (A3)+,D0 ;get the text ID ;--------------------------------------------------------------------------- -; DrawBox draws a dialog-box-like-box or a deepshit-like-box +; DrawBox 4bdc draws a dialog-box-like-box or a deepshit-like-box ;--------------------------------------------------------------------------- DrawBox MOVE.L DSDrawProc,D0 ; is a custom dialog draw procedure specified? @@ -396,12 +396,29 @@ DrawBox MOVE.L DSDrawProc,D0 ; is a custom dialog draw procedure specified? BSET #7,DSDrawProc ; make it a one-shot RTS ; go to it -@StdProc LEA DSAlertRect,A0 ; pt A0 at rect +@StdProc MOVE D6,D0 + BSR.S FindObject + BEQ.S @old + + CMPI #12,-2(A0) + BLT.S @old + MOVE 10(A0),D0 + BSR.S FindObject + BEQ.S @old + + MOVE.L (A0)+,DSAlertRect + MOVE.L (A0),DSAlertRect+4 + PEA.L DSAlertRect + BSR NewAlertFunc + ADDQ #4,SP + +@old LEA DSAlertRect,A0 ; pt A0 at rect TST.B (A0) ; is this a system alert? (vs system error?) BPL.S DrawSysAlert ; yes, draw normal, do _MovePortTo ; we know it's a system error, so go stuff the rect w/what we need +; 4c1c DrawSysErr MOVEM.L A1/D1,-(SP) ; save registers. @@ -439,6 +456,7 @@ DrawSysErr MOVEM.L (SP)+,A1/D1 ; restore registers. RTS ; and return +; 4c6a DrawSysAlert BSR.S DrawBox2 ; draw it MOVE.L DSAlertRect,-(SP) ; push TL of rect @@ -447,6 +465,7 @@ DrawSysAlert ; use rect at (A0) +; 4c74 DrawBox2 MOVE.L A0, -(SP) ; rect for EraseRect MOVE.L A0, -(SP) ; rect for FrameRect MOVE.L A0, -(SP) ; rect for InsetRect @@ -465,6 +484,56 @@ DrawBox2 MOVE.L A0, -(SP) ; rect for EraseRect NoButtons RTS + + +NewAlertFunc + Link A6, #-$8 + MoveM.L A1-A3, -(A7) + MoveA.L $8(A6), A3 + Lea.L -$8(A6), A2 + MoveA.L (A5), A0 + Lea.L -$74(A0), A0 + Move.L (A0)+, (A2) + Move.L (A0), $4(A2) + SubQ #$2, A7 + Move (MBarHeight), (A7) + Move (A7)+, D0 + Add D0, (A2) + Move.L A3, -(A7) + Move $6(A2), D0 + Add $2(A2), D0 + AsR #$1, D0 + Move D0, -(A7) + Move $6(A3), D0 + Add $2(A3), D0 + AsR #$1, D0 + Sub D0, (A7) + Move (A2), D0 + Add $4(A2), D0 + AsR #$1, D0 + Move D0, -(A7) + Move (A3), D0 + Add $4(A3), D0 + AsR #$1, D0 + Sub D0, (A7) + _OffsetRect + Move (A3), D0 + Sub (A2), D0 + Ext.L D0 + Neg.L D0 + DivS #$3, D0 + Move.L A3, -(A7) + Clr -(A7) + Move D0, -(A7) + _OffsetRect + MoveM.L (A7)+, A1-A3 + Unlk A6 + Rts + + + + + ;--------------------------------------------------------------------------- ; DoButtons draws some buttons as specified by the buttonList data structure ; defined by the ID in D0, and then hit-tests the mouse position against @@ -683,6 +752,7 @@ CmdLoop MOVE.L SP,A0 ; Point to event record on stack _OffsetRect ; offset it BSR MBDoErase ; erase it + MOVE.B #$20,(A6) MOVE.W D3,-(SP) ; char width NEG.W (SP) ; negative movement CLR.W -(SP) ; delta V = 0 @@ -791,7 +861,7 @@ DMCmd MOVE.L #$007001B0,-(SP) ; push BR RTS ; and return Print6Hx SWAP D0 - BSR.S Print2Hx + BSR.S Print4Hx SWAP D0 Print4Hx MOVE.W D0,-(SP) diff --git a/OS/StartMgr/StartBoot.a b/OS/StartMgr/StartBoot.a index d3fa305..09fae57 100644 --- a/OS/StartMgr/StartBoot.a +++ b/OS/StartMgr/StartBoot.a @@ -294,10 +294,6 @@ BootMe PROC EXPORT EXPORT InitSys7Toolbox EXPORT OpenSlots - - BSR CheckForROMDisk ; Check if we would like to boot a ROM disk - TST.W D0 ; Did we find a bootable ROM disk? - BEQ.S @foundBootDisk ; If so then we've got startup device, now call BBs BSR FindStartupDevice ; Find the startup device & load boot blocks. ; (see StartSearch.a) @@ -350,7 +346,8 @@ MyExecMask EQU BBNewMask+BBExecMask CMP.B #MyExecMask,D1 ; Are these new executable boot blocks? BNE.S @NoExec ; If not, don't execute them -@ExecBB LEA MyIOPBA6(A6),A0 ; point to parameter block +@ExecBB BSR MessWithZones + LEA MyIOPBA6(A6),A0 ; point to parameter block MOVE.L A0,D7 ; set it where Boot blocks want it JSR BBEntry(A6) ; Execute the boot blocks @NoExec @@ -372,17 +369,13 @@ ReBoot move.w BootDrive,D3 ; Get current boot drive number MOVE.W #EjectCode,CSCode(A0) MOVE.W D3,IODrvNum(A0) ; d3 = BootDrive, must be a drive# here! _Control ; eject the bad diskette - BNE.S @DisableNextTime ; If not ejectable, don't try again move.b (sp)+,d0 ; restore DiskInPlace byte + tst -$3f0(a6) + bne.b @DisableNextTime cmpi.b #8,d0 ; were we ejectable? bge @DisableNextTime ; no, don't boot from this drive again -; ((( -------------------- Systems with HD20 -------------------- - CMP.W #$FFFE,BtDskRfN ; HD20's can pretend they're ejectable - BNE.S @1 ; Branch if it's not an HD20 -; ))) -------------------- Systems with HD20 -------------------- - @DisableNextTime MOVE.W BootMask,D0 BCLR D3,D0 @@ -400,6 +393,41 @@ ReBoot move.w BootDrive,D3 ; Get current boot drive number + + + +MessWithZones + MoveM.L D0/A0-A1, -(A7) + Move.L (ApplZone), D0 + Cmp.L (SysZone), D0 + BEQ.B (* + $4) + _InitApplZone + MoveA.L (SysZone), A0 + AddA.L #$A00000, A0 + MoveA.L A7, A1 + SubA.L (DefltStack), A1 + SubA.L #$40000, A1 + SubA.L #$64000, A1 + CmpA.L A0, A1 + BHI.B (* + $4) + MoveA.L A1, A0 + _SetApplBase + MoveA.L (SysZone), A0 + Move.L A0, (ApplZone) + Move.L A0, (TheZone) + Move.L (A0), (HeapEnd) + MoveA.L A7, A0 + SubA.L (DefltStack), A0 + SubA.L #$40000, A0 + _SetApplLimit + MoveM.L (A7)+, D0/A0-A1 + Rts + + + + + + ;________________________________________________________________________________________________ IF 0 THEN ; IMPORT IRQException ; @@ -508,239 +536,6 @@ getDiskInPlace ; find the drive queue element @done rts -;________________________________________________________________________________________________ -; CheckForROMDisk -; -; The following code supports the "Ginty" ROM disk architecture (System Disk in ROM). -; The idea is to pass control to the ROM disk so it can decide whether or not -; to boot from the ROM disk. If there is no ROM disk present or this particular machine -; does not support it then we continue as usual in the boot process. -; -; Input: nothing -; Output: D0.W = non-zero if no ROM disk was found or if one was it was non-bootable -; D0.W = zero means we found a bootable ROM disk. The code in the ROM disk -; already called FinderStartupDevice. -;________________________________________________________________________________________________ - -CheckForROMDisk - move.l UnivROMFlags,d0 ; get external features flag - btst.l #ProductInfo.SupportsROMDisk,d0 ; see if machine supports ROM disks? - beq.s @noROMDisk ; if not then just continue as usual - - bsr.s FindROMDisk ; check if we have a ROM disk - beq.s @foundROMDisk - - move.l UnivROMFlags,D0 ; get external feature flags - btst.l #ProductInfo.V8ChipBit,D0 ; are we on a VISA decoder machine? - beq.s @NoROMDisk ; if not then we're done -; -; ---- At this pt we need to check ROM space one more time but with the C/D slot bit XOR'ed in the ---- -; ---- Miscellaneous Setup Register ($50F26009), we need to do this because we cannot tell if we ---- -; ---- have a PDS/PCMCIA flash card installed or a ROM exp. SIMM. With this bit cleared no DSACK ---- -; ---- is generated by the ASIC and with it set DSACK is generated by the PDS card attached. ---- - - move.l #$50F26009,A0 ; Miscellaneous Setup Register in VIA2 space - bfchg (A0){4:1} ; complement the C/D bit field in setup register - bsr.s FindROMDisk ; check for bootable ROM disk - beq.s @foundROMDisk ; - - move.l #$50F26009,A0 ; Miscellaneous Setup Register in VIA2 space - bfchg (A0){4:1} ; set field back to original setting - bra.s @NoROMDisk ; -; -; At this point, A0 points to the beginning of the header for the RomDisk driver. -; (A0 gets set in routine FindROMDisk) -; -@foundROMDisk - with GintyHeader - - move.l HdrBootCode(A0),D0 ; get the offset to search routine - beq.s @NoROMDisk ; it's zero, so no search routine - adda.l HdrBootCode(A0),A0 ; point to search routine - jsr (A0) ; call the ROM Disk search/open routine - tst.w D0 ; see if it found the boot blocks - beq.s @FoundDevice ; ready to boot (A6 points to boot blocks) - -; ------------ If we get here, we didn't find a ROMDisk ------------ -; -@noROMDisk st d0 ; set d0 to TRUE to indicate no ROM disk -@FoundDevice - rts - - -;------------------------------------------------------------------------------------------------ -; Search through ROM looking for the special ROM disk header info. -; If found, check for boot blocks. Adapted from code in EDiskDrvr.a. -; -; Returns EQ if we found a ROM disk with boot blocks, NE if not. -; If ROM disk found then A0 contains a ptr to the ROM Disk header. -; -; Destroys D0,A0 - -FindROMDisk - movem.l d1/a2-a4,-(sp) ; save registers - - movea.l RomBase,a2 ; start searching at the base of ROM - move.l a2,d1 - addi.l #ROMSize,d1 ; end of ROM space to search -@RomDiskLoop - move.w sr,-(sp) ; save old interrupt mask - ori.w #HiIntMask,sr ; disable interrupts (stealing BusErrVct) - move.l BusErrVct,-(sp) ; save old bus error vector - lea @NotFound,a0 ; new handler address - move.l a0,BusErrVct ; setup bus error handler - movea.l sp,a4 ; mark the stack - - lea HeaderTemplate,a3 ; point to expected values - lea HdrBlockSize(a2),a0 ; point to header data - moveq.l #(HdrDeviceSize-HdrBlockSize)/4-1,d0 ; loop counter -@SigCmpLoop - cmpm.l (a0)+,(a3)+ ; compare the values - dbne d0,@SigCmpLoop ; compare the blocks -@NotFound - movea.l a4,sp ; pop stack in case of bus error - move.l (sp)+,BusErrVct ; restore bus error vector - move.w (sp)+,sr ; restore interrupt mask - addq.w #1,d0 ; see if we had a match - bne.s @NextBlock ; no, check next block - move.l a2,a0 ; save our position in ROM - moveq #0,d0 ; set cc to EQ - bra.s @Done ; return EQ -@NextBlock - adda.l #RomDiskAlign,a2 ; point to next block to check - move.l d1,a0 - cmpa.l a0,a2 ; see if end reached - blo.s @RomDiskLoop ; search the entire space - moveq #1,d0 ; set cc to NE -@Done - movem.l (sp)+,d1/a2-a4 ; restore registers - rts - - endwith ; GintyHeader - - - string asis ; no length on strings - align 2 -HeaderTemplate - dc.w 512 ; signature block size - dc.w 1 ; version number 1 - dc.b 'Ginty ' ; 12 byte signature - dc.b 'HYGWGA' ; (brought to you by et. al) - - -;______________________________________________________________________________________ -; All the 7.0 managers are installed here, the Gibbly calls us via a ROM vector at -; the start or the ROM. -; -; Sure would have been nice if each of these generic routines were commented when -; they were added.... (Sigh) Rewrote most of this code today . -; -;______________________________________________________________________________________ - -InitSys7Toolbox - _InitAllPacks ; Make sure the Packs are available at this time - - BSR.L NewGestaltSelectors ; - - ; Don't call ShutInit here since it blows away existing shutdown tasks - - BSR.L ALIASMGRINSTALL - - BSR.L SetupGlobals ; Comm Toolbox - BSR.L SetupGestalt ; - - BSR.L InitDialogMgrGlobals - BSR.L InitScrollSpeedGlobals ; scrollbar scrolling speed - BSR.L ExtBTreeInstall - BSR.L PPCINSTALL - BSR.L NMINIT - BSR.L InitValidateMenuBarSemaphore - BSR.L InitSystemMenuList - BSR.L MiscPatchesInstall - CLR.L -(SP) ; unused parameter for system builds - BSR.L __InitComponentManager - BSR.L ClearSysErrorUpdateRect ; ToolboxEventMgrPatches - BSR.L TSMgrInstall - BSR.L HelpMgrInstall - BSR.L ADDFONTSTOCHAIN ; FontFolder - - ; ADBSecondaryInitialization ; SAM (from here down...) - - BSR.L InitADBDrvr ; Another reinit - - - ; Display Manager - - IF hasDisplayMgr THEN ; <52> - SUBQ #2,A7 - _DMInstallDisplayManager ; Display Manager - ADDQ #2,A7 - ENDIF ; <52> - - ; SlotMgrSecondaryInitializationIIci - - SUB.W #spBlock.spBlockSize,SP ; Make room for a slot parameter block on the stack - MOVEA.L SP,A0 ; Point A0 to the record - BSET #fWarmStart,spBlock.spFlags(A0) ; Set warm start flag - _SecondaryInit ; Wake everybody up again - ADD.W #spBlock.spBlockSize,SP ; Remove the param block from the stack - BSR OpenSlots ; Open all slot drivers... - - ; ColorQDSecondaryInitialization - - JSR DavesRandomVideoStuff ; re-do CheckDevices and video driver patching. - MOVE.L (a5),-(sp) ; point to the same globals we are using now - _InitGraf ; catch all the new devices - _InitPalettes ; me too... - - ; SetUpIconCluts - - PEA ([ExpandMem],ExpandMemRec.emIconCluts) - JSR MakeIconData - - ; FontMgrSecondaryInitialization - - _InitFonts ; Reinit the font manager (in case a new one's just been loaded) - - ; File System Cache - - BSR AdjustBarrier ; Get the limit to bufPtr in A2 - BTST #extensionsEnabledBit,ExtensionsEnabledByte ; Have extensions been disabled? - BNE.S @normal ; -> No. Use the default limit - - MOVE.L BufPtr,d2 ; Extensions disabled. Limit the cache to 64k - SUB.L #$10000,d2 ; give the cache 64K - BRA.S @continue ; -> Join the common code - -@normal MOVE.L BootGlobals.bufPtrLimit(a5),d2 ; Get the current limit - ADD.L #elbowRoomCacheCantHave,d2 ; Reserve 32k or so to assure we can boot -@continue BSR.L CacheInstall ; Install the disk cache - ; - ; - BSR.L LateLoad ; Wait for SCSI devices present last time (that may not be ready yet) - ; Load their drivers if they come up to speed. - - ; VM Final Initialization - - ; If VM loaded, we need to call MemoryDispatch with selector (-1) so VM can hold the system heap, - ; unhold the boot stack, patch the cursor task, and enable user mode. - - TST.L VMGlobals ; Has VM installed itself? - BMI.S @noVM ; -> No. No Memory Dispatch - -@hasVM MOVEQ #-1,D0 ; Finish VM initialization selector - _MemoryDispatch ; Call VM. - BRA.S @Done ; ->> Jump to end - -@noVM LEA AfterBootSetApplBase,A0 ; Patch _SetAppBase to call _InitZone before and after - MOVE.W #$A057,D0 ; it calls the real SetAppBase. Do this only if VM is - _SetTrapAddress ,NewOS ; not installed, or you'll look like a Cyclone. - -@Done RTS ; Return to boot3 (or Gibbly) - ; SAM (End of today's mods) -; ¥¥ End of InitSys7Toolbox ¥¥ -;______________________________________________________________________________________ - ;-------------------------------------------------------------------- ; Open all slot drivers which request to be opened at Start time. ; Destroys no registers. @@ -867,30 +662,20 @@ OpenBDrvrs MOVE.B spSlot(A0),-(SP) ;Save slot RTS -AdjustBarrier ; <38> -; Adjust BootGlobals.bufPtrLimit(a5) to have: -; MAX( sysHeap.bkLim + minProcessMgrSpace, static limits (i.e. boot globals & vm limits) ) +;______________________________________________________________________________________ +; All the 7.0 managers are installed here, the Gibbly calls us via a ROM vector at +; the start or the ROM. +; +; Sure would have been nice if each of these generic routines were commented when +; they were added.... (Sigh) Rewrote most of this code today . +; +;______________________________________________________________________________________ -; Trashes: a0/d0 +InitSys7Toolbox - move.l SysZone,a0 - move.l a0,d0 ; copy baseAddr of SysZone - move.l bkLim(a0),a0 - add.l #initialSysHeapSize,d0 - cmp.l d0,a0 ; if heap is small because weÕre on a small RAM machine - bhs.s @enoughReservedForSysHeap ; pretend heap is at initialSysHeapSize because it will - ; be that big soon anyway. - move.l d0,a0 ; Set to be the minimum weÕd ever consider. -@enoughReservedForSysHeap - add.l #minProcessMgrSpace,a0 ; where the process mgr heap would end if we - ; created it right now - cmp.l BootGlobals.bufPtrLimit(a5),a0 ; processMgrHeap.bkLim > current barrier? - bls.s @dont ; if not, donÕt adjust + RTS - move.l a0,BootGlobals.bufPtrLimit(a5) ; set new barrier -@dont - rts ENDP @@ -907,7 +692,7 @@ AdjustBarrier ; <38> ;------------------------------------------------------------------------------------------ CheckPassword PROC EXPORT - + MyStack RECORD 0,DECREMENT DialogRect DS.W 4 ItemRect DS.W 4 diff --git a/OS/StartMgr/StartErr.a b/OS/StartMgr/StartErr.a index 6b2588c..eb172e1 100644 --- a/OS/StartMgr/StartErr.a +++ b/OS/StartMgr/StartErr.a @@ -235,57 +235,6 @@ SysErrInit PROC EXPORT ; ENDP ; -;---------------------------------------------------------------------- -; Routine Debugger (Arg1, Arg2...ArgN, ParamSize, CmdWord) -; Arguments Highly variable -; Function Dispatch debugger call to current installed debugger, -; else ignore. (_Debugger trap) -;---------------------------------------------------------------------- - -Debugger PROC EXPORT ; - EXPORT DebugProlog ; - - MOVEM.L A0-A7/D0-D7,SEVars ; save all regs - - BSET #7,MacJmpFlag ; in the debugger - - LINK A6,#0 ; no locals - LEA 8(A6),A0 ; pt A0 at args - MOVE.W (A0)+,D0 ; get command word - MOVE.W (A0)+,SECmdSize ; stash size of param list - BSR.S DebugProlog ; set up call for debuggers, set CC=existence - BLE.S DebugErr ; V true, so either Z or (NOT N) means no inited debugger - -; Now we know there's a debugger, so call it. -; A0 = ptr to last command parameter, A1 = ptr to debugger entry pt. - - BSET #15,D0 ; set high bit of word to flag trap call - JSR (A1) ; call debugger!!!! - -DebugAdios UNLK A6 ; restore A6 - MOVEM.L SEVars,A0-A7/D0-D7 ; restore all regs - MOVE.L (SP)+,A0 ; get return address - ADD.W SECmdSize,SP ; pop params - ADDQ.L #4,SP ; pop command word & size word - BCLR #7,MacJmpFlag ; out of the debugger - JMP (A0) ; and return - - -DebugErr MOVEQ #SENoDB,D0 ; return "no debugger" error - BRA.S DebugAdios - -; Utility for setting CC's for existance of debugger, pointing A1 to debugger code entry. -; Must preserve D0. - -DebugProlog - MOVE.L MacJmp,A1 ; get ptr in A1 - MOVE.B MacJmpFlag,D3 ; get flags - ADD.B D3,D3 ; init flag now high bit, set CC's - RTS ; and return - - ENDP ; - - ;---------------------------------------------------------------------- ; Routine ToDeepShit ; Arguments (SP) (input) Return address to exception receiver @@ -320,23 +269,15 @@ ToDeepShit PROC EXPORT ; ; Now clear stack of exception info, saving SR and PC unless re-entered. A special case <13Jul85> ; is class 0 exception on the 68000, which has 4 words of info on top of the usual SR/PC. <13Jul85> - TST.B CPUFlag ; 0-000, 1-010, 2-020, etc. <13Jul85> - BNE.S @1 ; <13Jul85> - - CMPI.W #2,D0 ; 1 or 2 means nasty bus error frame <13Jul85> - BGT.S @1 ; <13Jul85> - MOVE.L (SP)+,SE000BE ; save fcn code, access address, and instruction word <04Nov85> JTC - MOVE.L (SP)+,SE000BE+4 ; ...the other 4 bytes of the eight <04Nov85> JTC -@1 - TST.B MacJmpFlag ; minus means we're re-entering <13Jul85> - BMI.S @3 ; <13Jul85> + TST.B $BFF + BMI.S @3 MOVE (SP)+,SESR ; SR on top for all CPUs <13Jul85> MOVE.L (SP)+,SEPC ; next is the saved PC <13Jul85> - BRA.S SysErr2 ; bypass nonsaving pop <13Jul85><1.4> + BRA SysErr2 ; bypass nonsaving pop <13Jul85><1.4> @3 ADDQ.W #6,SP ; kill SR and PC <13Jul85><1.4> - BRA.S SysErr2 + BRA SysErr2 NOP ; appease the assembler gods <12> kc ENDP ; @@ -396,8 +337,6 @@ SystemError PROC EXPORT ; SysErr1 MOVE.W SR,SESR ; save SR <13Jul85> MOVE.L (SP)+,SEPC ; clean PC for fall-through to SysErr2 <13Jul85> - TST.B CPUFlag ; zero for 68000 <02Nov85> JTC - BEQ.S SysErr2 ; no need for dummy frame on old cpu <02Nov85> JTC CLR.W -(SP) ; <02Nov85> JTC ; entry point for standard system exceptions (address error, etc) @@ -407,71 +346,9 @@ SysErr2 BMI.S @0 ; yes, skip reg saving MOVE.L SP,SEA7 ; save true PC @0 ; deleted obsolete stack-cleansing instructions <13Jul85> - BSET #7,MacJmpFlag ; prevent re-entrancy, vote Republican + BSET.B #7,MacJmpFlag ; prevent re-entrancy, vote Republican - cmpi.w #13,d0 ; was it an NMI? <1.5> - bne.w @continue ; no, proceed <1.5> - TestFor RBVExists ; <1.5> - beq.s @noRBV ; <1.5> - - btst.b #ProductInfo.PGCInstalled,UnivRomFlags+3 ; see if we have a PGC chip <9><4>
- beq.s @continue ; no, handle normal NMI-- there is no parity <4> - - move.l VIA,A0 ; get VIA1 base <1.5> - eieioSTP - btst #vPGCEnb,VBufB(a0) ; is parity enabled? <1.5> - eieioSTP - bne.s @continue ; no, proceed <1.5> - eieioSTP - bclr #vPGCErr,vDirB(a0) ; make parity error bit an input <1.5> - eieioSTP - move.b VBufB(a0),d1 ; read parity error flag <2.1> - eieioSTP - bset #vPGCErr,vDirB(a0) ; back to an output <1.5> - eieioSTP - btst #vPGCErr,d1 ; was NMI caused by parity error? <1.5> - bne.s @continue ; no, restore ddr and proceed <1.5> - eieioSTP - bset #vPGCEnb,VBufB(a0) ; yes, disable parity (so we won't get int again<1.5> - eieioSTP - bra.s @parityErr ; and blast the warm start flag -@noRBV - - WITH DecoderInfo - TestFor RPUExists ; do we have RPU parity? - beq.s @continue ; no, skip... - - movea.l OSS,a0 ; get OSS address - eieioSTP - move.w OSSIntStat(a0),d1 - eieioSTP - btst #OSSIntRPU,d1 ; did the RPU cause the interrupt? - beq.s @continue ; no, handle normal NMI - eieioSTP - clr.b OSSMskRPU(a0) ; disable RPU parity interrupts <2> - eieioSTP - movea.l UnivInfoPtr,a0 - adda.l ProductInfo.DecoderInfoPtr(a0),a0 - movea.l RPUAddr(a0),a0 ; get RPU base - st.b rpuReset(a0) ; reset serial ptr - move.l (a0),d1 - bset.l #16,d1 ; clear the parity error - move.l d1,(a0) -@parityErr - IF Supports24Bit THEN ; - moveq #true32B,d0 ; 32 bit mode to look at BootGlobs <1.9> - _SwapMMUMode ; switch to 32 bit mode <1.9> - move.l BootGlobPtr,a1 ; get ptr to boot globals (near top of RAM) <1.6><1.8> - clr.l StartGlobals.sgWarmStart(a1) ; CSS clear boot-globs warm start flag - _SwapMMUMode ; switch back to previous mode (in d0) <1.9> - ELSE - move.l BootGlobPtr,a1 ; get ptr to boot globals (near top of RAM) <1.6><1.8> - clr.l StartGlobals.sgWarmStart(a1) ; CSS clear boot-globs warm start flag - ENDIF - clr.l WarmStart ; clear low memory global warm start flag <1.6> - moveq #dsParityErr,d0 ; yes, set parity error code <1.5><1.7> -@continue ; <1.5> cmpi.w #dsNoPatch,d0 ; is this Error can't find patch ? rb beq.s @PreCubeE ; change the error message then rb cmpi.w #dsBadPatch,d0 ; is this a can't load patch message ? rb @@ -482,10 +359,10 @@ SysErr2 MOVE.W D0,DSErrCode ; Save the possibly modified ErrCode -; now we've set up all regs, etc. Time to decide whether to call the debuggers -; or just call the Deepshit code + MOVE.L MacJmp,A1 + MOVE.B MacJmpFlag,D3 + ADD.B D3,D3 - BSR DebugProlog ; any debuggers? BPL.S Call2DS ; yes, but not initialized (init bit not set) BNE.S CallDB ; yes, initialized, call 'em diff --git a/OS/StartMgr/StartFail.a b/OS/StartMgr/StartFail.a index b6ece62..b224d92 100644 --- a/OS/StartMgr/StartFail.a +++ b/OS/StartMgr/StartFail.a @@ -287,23 +287,12 @@ CritErr MOVEM.L A0-A7/D0-D7,SERegs ; save all regs for debug <26Aug85> LSR.L #2,D3 ; Compute number of longs on screen. - if hasMMU then ; <1.7> - MOVEQ #true32b,D0 ; set 32-bit addressing mode - _SwapMMUMode ; - MOVE.B D0,-(SP) ; save the previous mode - endif ; <1.7> - MOVEQ #-1,D0 ; This should be black. @FillLoop MOVE.L D0,(A2)+ ; Fill a long. SUBQ.L #1,D3 ; Countdown. BHI.S @FillLoop ; Loop until done. - if hasMMU then ; <1.7> - MOVE.B (SP)+,D0 ; get the previous addressing mode back - _SwapMMUMode ; flip back to previous addressing mode - endif ; <1.7> - ; Okay, here are the values we still consider important at this point: ; ; A3 = pointer to the center of the screen. @@ -343,7 +332,7 @@ CritErr MOVEM.L A0-A7/D0-D7,SERegs ; save all regs for debug <26Aug85> BSR6 DeadMac ; plot the dead Mac icon -SkipDisplay BigJmp TMRestart,a0 ; go to Test Manager entry point <1.4><2.0><2.1> +SkipDisplay BRA.S * TinyTable DC.W $0000,$FFFF,$FFFF,$FFFF ; whiteColor DC.W $0000,$0000,$0000,$0000 ; black @@ -370,13 +359,6 @@ TinyTable DC.W $0000,$FFFF,$FFFF,$FFFF ; whiteColor ;----------------------------------------------------------------------------- FailData - if hasMMU then ; <1.7> - MOVEQ #true32b,D1 ; put in D1 for a second - EXG D1,D0 ; get true32b in D0, save D0 in D1 - _SwapMMUMode ; switch to 32-bit addressing - MOVE.B D0,-(SP) ; save the previous addressing mode - EXG D1,D0 ; get D0 back in D0 - endif ; <1.7> FailLoop ROL.L #4,D0 ; get nibble in low order @@ -409,11 +391,6 @@ chLoop MOVE.B (A1),D5 ; get the next byte DBRA D4,FailLoop ; loop until all characters are drawn - if hasMMU then ; <1.7> - MOVE.B (SP)+,D0 ; get the old addressing mode back - _SwapMMUMode ; restore the addressing mode - endif ; <1.7> - JMP (A6) ; return to caller ;---------------------------------------------------------------------------- @@ -458,12 +435,6 @@ DeadMac LEA SadMacIcon,A0 ;point to the "Sad Mac" icon <1.3> MOVE.L IconTLAddr,A2 ; figure out where the topLeft corner is <1.3> - if hasMMU then ; <1.7> - MOVEQ #true32b,D0 ; flip to 32-bit mode - _SwapMMUMode ; switch to 32-bit addressing - MOVE.B D0,-(SP) ; save the previous mode - endif ; <1.7> - MOVEQ #6,D1 ; move the icon down 6 lines <1.9> MULU D2,D1 ; <1.9> ADDA.L D1,A2 ; <1.3><1.9> @@ -476,10 +447,6 @@ DeadMac ADDA.W D2,A2 ; move down to the next screen line <1.3><1.9> DBRA D1,@BlastIcon ; keep looping until all 32 lines are copied<1.3><1.9> - if hasMMU then ; <1.7> - MOVE.B (SP)+,D0 ; switch back to previous addressing mode - _SwapMMUMode ; flip back - endif ; <1.7> RTS6 ; return to caller <1.3> diff --git a/OS/StartMgr/StartInit.a b/OS/StartMgr/StartInit.a index 5d09482..f26ef8e 100644 --- a/OS/StartMgr/StartInit.a +++ b/OS/StartMgr/StartInit.a @@ -1145,15 +1145,15 @@ MyROM MAIN Export EXPORT InitDefGamma EXPORT InitSCC EXPORT OpensDrvr - EXPORT PMSPSwOS +; EXPORT PMSPSwOS EXPORT RomLoc EXPORT StartBoot EXPORT StartInit1 - EXPORT WDCBSwOS +; EXPORT WDCBSwOS EXPORT TCOff EXPORT SetUpTimeK ; - EXPORT DynamicBoxFlag +; EXPORT DynamicBoxFlag ************************************************************************************************* * * @@ -1216,63 +1216,23 @@ GOOFYDoEject BRA.L DoEject ; branch island to eject code + STRING AsIs + DC.L 'Copyright (c) 1983-2002 Apple Computer, Inc. All Rights Reserved.' + ************************************************************************************************* * * * R E S E T / R E B O O T E N T R Y P O I N T * * * ************************************************************************************************* +; b4 -TCOff dc.l 0 ; for turning off MMU below +TCOff dc.w 0 ; for turning off MMU below Start StartBoot MOVE #$2700,SR ; Disable processor interrupts. - IF NOT ROMinRAM THEN ; - sub.l d0,d0 ; D0 = 0 - bset #CACR_DE_040,d0 ; set Data Cache Enable bit on 040s - movec d0,CACR ; attempt to enable data cache (temporarily) - movec CACR,d0 ; check and see if it's still there - btst #CACR_DE_040,d0 ; see if the bit exists in CACR - beq.s @not040 ; IF we're on a 68040 THEN - - MACHINE MC68040 ; need this for the MOVEC D0,TC below - - cinva bc ; make sure caches are invalidated - sub.l d0,d0 ; clear d0 - movec d0,CACR ; disable both instruction and data caches - movec d0,TC ; make sure that the MMU is disabled - move.l #nuBusTTxlat,D0 ; get value to translate upper nuBus space - movec d0,DTT0 ; use serialized writes on this space - move.l #ioNuBusTTxlat,D0 ; get value to translate i/o and nuBus space - movec d0,DTT1 ; use serialized writes on this space - bra.s @not030 ; step around the rest of the 020/030 cache/tc stuff - - MACHINE MC68030 ; set it back to what works for 020/030 -@not040 ; ELSE - move.l #(1< ; <60>, check what WakeUp does, does it return here again after changing clock ? @@ -1284,13 +1244,20 @@ StartBoot MOVE #$2700,SR ; Disable processor interrupts. * H A R D W A R E I N I T I A L I Z A T I O N * * * ************************************************************************************************* - +; bc + BSR6 JumpIntoROM ; init the hardware - - IF hasPwrControls THEN ; If we're on a portable, - BigBSR6 PortableCheck ; check to see if we are coming out of sleep - ENDIF - BRA.L StartTest1 ; run new universal diagnostics + + + + move #$2600, sp + moveq #0, d7 + moveq #0, d6 + move #$11, d7 + + import LASTLY_A8FE0 + BSR6 LASTLY_A8FE0 + move.l (sp),a6 StartInit1 ; Jumped to from StartTest1. ;----- @@ -1323,6 +1290,7 @@ StartInit1 ; Jumped to from StartTest1. ; ; On 68000 machines, exception vectors set up by the diagnostics are in RAM at address zero. ;----- +; de WITH StartGlobals @@ -1348,6 +1316,7 @@ getHInfo move.l a6,-(sp) ; save regs ; d2 - Bits 15..8, BoxFlag info (possibly unknown) ; d2 - Bits 7..0, Address Decoder Kind (zero if unknown) ;----- +; 108 BSR6 InitVIAs,a2 ; initialize the VIAs and RBV @@ -1358,22 +1327,18 @@ getHInfo move.l a6,-(sp) ; save regs ;---------------------------------------------------------------- ; Get logical: set up RAM, address translation tables ;---------------------------------------------------------------- +; 11a bsr ConfigureRam ; set up RAM, move sp to middle of 1st bank ;---------------------------------------------------------------- ; D7 <- CPU type in low word, logic board type in hi word ;---------------------------------------------------------------- +; 11e BSR WhichCPU ; get CPU type in low word of d7 bsr WhichBoard ; get logic board type in hi word of d7 - btst.l #hwCbMMU+16,d2 ; HwCfgFlags in high word of d2 - bne.s @hasMMU ; yes, InitMMU - ; no, InitNonMMU - bsr InitNonMMU ; init a4,a5,a6 for non MMU based machines - bra.s @done - -@hasMMU bsr.l InitMMU ; generate MMU tables, enable MMU + bsr.l InitMMU ; generate MMU tables, enable MMU ; returns a4 -> BootGlobs move.l sgTotalRAM(a4),a6 ; get top of memory @@ -1403,6 +1368,7 @@ getHInfo move.l a6,-(sp) ; save regs ; sp - in the middle of the useable logical space ; ;----- +; 136 MOVEM.L sgScratch(A4),D3-D6 ; get the extended Universal info ENDWITH ; {StartGlobals} @@ -1421,7 +1387,7 @@ getHInfo move.l a6,-(sp) ; save regs LEA HeapStart,A1 ; A1 <- pointer to end of system globals. BSR FillWithOnes ; Fill system globals with ones. - BSR InitRomVectors ; initialize ROM vectorization + BSR.L InitRomVectors ; initialize ROM vectorization MOVEM.L (SP)+,D0-D6/A0-A1 ; restore Universal info @@ -1439,8 +1405,6 @@ getHInfo move.l a6,-(sp) ; save regs MOVE.B D7,CpuFlag ; save type of CPU we have swap d7 ; - - bsr DynamicBoxFlag ; Calculate the Boxflag based on Family type and CPU speed @StoreBox move.b d7,BoxFlag ; ... and save it in lomem @@ -1448,149 +1412,17 @@ getHInfo move.l a6,-(sp) ; save regs MOVE.L A5,BufPtr ; save the top of useable memory MOVE.L A6,MemTop ; and the top of available memory - ; Here, we check to see if a special bit is set on PRAM, which tells us rb, start - ; that the user want's his ROM to run from RAM for a slightly faster machine. - ; We copy the ROM image into RAM and then re-initialize vectorization with the new RAM/ROM. - - IMPORT PramIO - - MOVEM.L D0-D6/A0-A4,-(SP) ; save Universal info - CLR.W -(SP) ; make buffer space in stack for PRAM data - MOVE.L SP,A3 ; set buffer pointer - MOVE.L #(0<<31)|\ ; read PRAM command - (1<<16)|\ ; 1 byte please - (11<<0),D3 ; from address X - BSR.L PramIO ; read PRAM - MOVE.W (SP)+,D0 ; get the byte read from PRAM - ANDI.W #$0100,D0 ; let's see if bit 1 was set in our byte - BEQ.W NoROMinRAM ; if bit is clear, don't use RAM for the ROM - - LEA BaseOfRom,A0 ; set source address - MOVE.L A0,ROMBase ; save in ROMBase since it's not setup yet - MOVE.L $40(A0),D3 ; get the ROM size in D3 - SUBA.L D3,A5 ; Subtract the ROM size from BufPtr - MOVE.L A5,D0 ; let's make sure A5 is aligned - ANDI.L #$0000000F,D0 ; mask up to 15 bytes of mis-alignement - SUBA.L D0,A5 ; and adjust A5 for 16 byte alignment - MOVE.L A5,BufPtr ; and set the new BufPtr - MOVE.L A5,A1 ; set Destination address - - MOVE.L D3,D0 ; set count - MOVEQ.L #16,D2 ; set copy amount per loop (16 for non 040) - CMPI.B #cpu68040,CPUFlag ; are we in an 040 ? - BNE.S @CopyLongs ; if not, then copy longs only - MOVEQ.L #32,D2 ; set copy amount per loop - BRA.S @Copy16 ; do the copy thing, based on BlockMove040 - NOP ; no warnings please - - ALIGN 16 ; align with a cache line - MACHINE MC68040 ; for move 16 -@Copy16 - MOVE16 (A0)+,(A1)+ ; copy 16 bytes - SUB.L D2,D0 ; decrement our count by 32 bytes - MOVE16 (A0)+,(A1)+ ; copy another 16... - BHI.S @Copy16 ; and keep copying until we have 2 Meg - -@JumpIntoRAM - LEA InRAM,A0 ; get our address in RAM (almost) - MOVE.L ROMBase,D5 ; save old ROMBase in D5 rb - SUBA.L ROMBase,A0 ; get rid of the ROM offset - MOVE.L BufPtr,A5 ; get BufPtr (ROMBase soon) in a5 - MOVE.L A5,ROMBase ; set the new ROM base - ADDA.L A0,A5 ; add offset to InRAM routine - JMP (A5) ; and go there ! - NOP ; fill me in - -@CopyLongs - MOVE.L (A0)+,(A1)+ ; copy 4 bytes - MOVE.L (A0)+,(A1)+ ; copy 8 bytes - MOVE.L (A0)+,(A1)+ ; copy 12 bytes - MOVE.L (A0)+,(A1)+ ; copy 16 bytes - SUB.L D2,D0 ; decrement our count by 16 bytes - BHI.S @CopyLongs ; and copy more if nessesary - BRA.S @JumpIntoRAM ; now jump into RAM - NOP ; just for the fun of it. - - ALIGN 16 - -InRAM - BSR InitROMVectors ; re - initialize vectorization with new ROM addr - ; Now that the ROM vectors have been re-initialized from RAM, the actual table entries still rb, start - ; point to ROM since these were created at compile time. So now we need to adjust every entry - ; in the RAM copy of the tables so that it points to its RAM equivalent. From then on - ; InitROMVectors can be called and the RAM table entries will be used, as expected. - - MOVE.L #$2010,D0 ; get start address for ROM vector adjustments - SUB.L ROMBase,D5 ; adjust our saved ROMBase, D5 is now the difference -@WalkList - MOVE.L D0,A0 ; get vector address in a0 - MOVE.L (A0),D1 ; get the table address - CMPI.L #-1,D1 ; is it an empty table ? - BEQ.S @NextTable ; if so, try the next table - - MOVE.L D1,A1 ; get the table address in a1 - MOVE.L (A1),A2 ; get decription table in a2 - MOVE.L 8(A2),D3 ; get vector count for this table in D3 - -@AdjustEntry - SUB.L D5,(A1)+ ; adjust this entry so it points in the RAM copy of ROM - DBRA D3,@AdjustEntry ; fix all entries in this table - -@NextTable - ADDI.L #4,D0 ; add offset to next vector address - CMPI.L #$2104,D0 ; have we reached the current limit ? - BNE.S @WalkList ; if not the limit, keep looking - - SUB.L D5,UnivInfoPtr ; adjust the info record so int handlers are in RAM rb - -NoROMinRAM ; rb, end - MOVEM.L (SP)+,D0-D6/A0-A4 ; restore Universal info - ; DONE, WE ARE RUNNING FROM A RAM COPY OF ROM rb, end move.l UnivInfoPtr,a1 ; reload a1 in case the info record was adjusted in RAM rb bsr SetupHWBases ; setup the hardware base address low mems BSR InitSCC ; init the SCC - move.w d2,-(sp) ; save D2 around this call - BSR InitIWM - move.w (sp)+,d2 ; restore D2 - - IF NOT hasAsyncSCSI THEN ; we do HW init later with new SCSI Manager - bsr.l InitSCSIHw ; - ENDIF - - BSR.L InitSndHW ; go initialize the sound hardware - bsr.l InitMMUGlobals ; set up MMU globals BSR6 SysErrInit ; Init exception vectors. clr.l DockingGlobals ; flag for EnableExtCache to know traps don't exist - IF has040MMU THEN ; rb - cmpi.b #cpu68040,CPUFlag ; check if we're running on an 040/050 - bne.s @notAn040 ; IF we are running on an 040/050 THEN - BSR.L InstallFPSP ; Initialize 040/050 FP emulation package -@notAn040 ; ENDIF - ENDIF ; rb - - -;---------------------------------------------------------------- -; Enable Caches, if any. -;---------------------------------------------------------------- - -; turn on Bursting for Instruction and Data cache before TimeDBRA and TimeSCCDB - - IF forRomulator THEN - Moveq.l #$0,D0 ; Set up to disable the caches if weÕre debugging. - ELSE - cmp.b #cpu68040,CpuFlag ; check if we're on an 040 - bne.s @not040 ; NO ... enable 020/030 cache(s) - - move.l #(1< rb, end 1< rb, end * all Universal variables (i.e., UnivInfoPtr, UnivROMFlags, AddrMapFlags, etc) * * * ************************************************************************************************* +; 1ce BootRetry MOVE #$2700,SR ; disable interrupts @@ -1643,7 +1475,6 @@ BootRetry MOVE #$2700,SR ; disable interrupts MOVE.L A0,SP ; Set the stack pointer there SUBA.W #BootStackSize,A0 ; Give ourselves some stack space - BSET.B #MMStartMode,MMFlags ; set for 32 bit system heap _SetApplLimit ; Don't let the System Heap crash our stack BSR.L InitMemoryDispatch ; go set up the MemoryDispatch globals @@ -1658,15 +1489,18 @@ BootRetry MOVE #$2700,SR ; disable interrupts Move.l #emRecSize,(a0) ; size ENDWITH ; + IMPORT InterC_1cc0_MoveUnivInfoToSysHeap + BSR.L InterC_1cc0_MoveUnivInfoToSysHeap + BSR.L initGestalt ; initialize Gestalt + BSR.L FiddleWithEmulator BSR.L InitIntHandler ; initialize interrupt vectors and dispatch tables - BSR.L InstallPrivTrap ; setup FPPriv if there's an FPU - - BSR.L InitPmgrVars ; initialize Power Manager variables if on a portable - ; (otherwise disable all of its traps) BSR CheckForEgretOrCuda ; Do we have an Egret/Caboose/Cuda? BNE.S @EInitDone ; -> Nope, don't be callin' shit BSR.L InitEgretOrCuda ; Initialize Egret or Cuda Manager + + IMPORT GestaltCudaFunc + BSR.L GestaltCudaFunc @EInitDone @@ -1678,19 +1512,67 @@ BootRetry MOVE #$2700,SR ; disable interrupts * able to take off as if we were a generic Macintosh. * * * ************************************************************************************************* +; 244 - - BSR InitSwitcherTable ; initialize Switcher's table (do we still need this?) - - BSR GetPRAM ; get 20 bytes PRAM, and TIME - BSR SetPRAM32 ; Always set PRAM to 32bit BSR.L InitRSRCMgr ; initialize the Resource Manager BSR.L NMInit ; Initialize the Notification Manager - BSR.L InitTimeMgr ; Initialize the Time Manager CLR.W -(SP) ; pass the INIT message to ShutDown _ShutDown ; to initialize the queue + IMPORT EXPANSIONBUSMGR_452D0 + BSR.L EXPANSIONBUSMGR_452D0 + +;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ SAM +; Install Code Fragment Mangaer (GoNative) +;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ +; 25a + + CASE ON + IMPORT GoNative + BSR.L GoNative ; Load all those NCODs! + CASE OFF + BPL.S @noPower ; -> No errors. Keep booting SAM + + MOVE.W #dsGNLoadFail,D0 ; Fatal GoNative load error. + _SysError ; Put up a dialog and die. +@noPower + +; 268 + IMPORT InterC_1690_CodeRegister + BSR.L InterC_1690_CodeRegister + + IMPORT InterC_15c0_CodePrepare2 + BSR.L InterC_15c0_CodePrepare2 + + IMPORT EXPANSIONBUSMGRFIRSTFUNC + BSR.L EXPANSIONBUSMGRFIRSTFUNC + + BSR.L CompBootStackOld ; lifted from SetUpSysAppZone + MOVE.L A0,SP + SUBA.W #BootStackSize,A0 + _SetApplLimit + + IMPORT InterC_2560 + BSR InterC_2560 + + + CLR.L -(SP) ; who wrote this? + MOVE.L (SP)+, ($D18) + MOVE.L ToolScratch, -(SP) + LEA.L SetUpTimeK, A0 + MOVE.L A0, ToolScratch + + IMPORT InterC_2090_PowerMgr + BSR InterC_2090_PowerMgr + + IMPORT InterC_2a80_EtherPrintfLib + BSR.L InterC_2a80_EtherPrintfLib + MOVE.L (SP)+, ToolScratch + + + BSR GetPRAM ; get 20 bytes PRAM, and TIME + BSR InitSlots ; inits slot cards, grays the screen(s) BSR.L InitDTQueue ; initialize the Deferred Task Manager Queue @@ -1704,79 +1586,71 @@ BootRetry MOVE #$2700,SR ; disable interrupts MOVE #$2000,SR ; supervisor state, interrupts on -;------------------------------------------------------------------------ -; Gestalt must now be initialized before IO drivers RLM -;------------------------------------------------------------------------ + IMPORT RSETKMAP + BSR.L RSETKMAP - BSR.L initGestalt ; initialize Gestalt + IMPORT InterC_2bc0_DebugPrint + BSR.L InterC_2bc0_DebugPrint - moveq #10,D0 - _NewHandle ,Sys,Clear ; Get space for a Heap utilities list - move.l A0,D0 ; Did we get it? - beq.s @noHU ; -> Nope - move.l D0,$1E0C ; Stuff it in the magic location -@noHU - - Cmpi.b #cpu68040,CPUFlag ; Are we less than an 040? - Blo.s @no040BM ; Yes? Then use original BlockMove. - Move.w #$A02E,D0 ; BlockMove trap. - BigLea BlockMove68040,A0 ; New routine. - _SetTrapAddress ; Set new routine. -@no040BM - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ SAM -; Install Code Fragment Mangaer (GoNative) -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ - - MOVE.L #gestaltSysArchitecture,d0 ; Are we running on a PowerPC machine? SAM - _Gestalt - BNE.S @NoPower ; Error, assume 68k - CMP.W #gestaltPowerPC,A0 ; PowerPC? - BNE.S @NoPower ; -> Nope, assume 68k - - CASE ON - IMPORT GoNative - BSR.L GoNative ; Load all those NCODs! - CASE OFF - BPL.S @noPower ; -> No errors. Keep booting SAM - - MOVE.W #dsGNLoadFail,D0 ; Fatal GoNative load error. - _SysError ; Put up a dialog and die. -@noPower - -;---------------------------------------------------------------- -; Install Drivers (Disk, Sound, Video). -;---------------------------------------------------------------- - - LEA DrvQHdr, A1 ; Initialize the drive queue. - BSR.L InitQueue - - BSR InitIOPStuff ; - BSR InitDeviceMgr ; Init unit I/O table and install the drivers. - BSR LoadDrivers ; load the standard drivers - - BSR.L InitSCSIMgr ; Init old and new SCSI Mgrs + MOVEQ.L #10, D0 + _NewHandle ,Sys,Immed + MOVE.L A0, D0 + BEQ.B @fail + MOVE.L D0, $1E0C +@fail BSR.L INSTALLBASSCOMMON ; Init Bass before anyone calls _InitFonts (like _InitGraf) BSR.L FORCEINITFONTSCALL ; More Bass init stuff + BSR InitCrsrMgrMiddle BSR.L InitCrsrDev ; initialize Cursor globals ; (InitCrsrDev must preceed InitADB) + + SUBQ #2, SP + MOVEQ.L #-1, D0 + _DisplayDispatch + ADDQ #2, SP + +;---------------------------------------------------------------- +; Install Drivers (Disk, Sound, Video). +;---------------------------------------------------------------- +; 300 + + LEA DrvQHdr, A1 ; Initialize the drive queue. + BSR.L InitQueue + + BSR InitDeviceMgr ; Init unit I/O table and install the drivers. + + IMPORT InitDeviceDispatch + BSR.L InitDeviceDispatch + + BTST.B #$6, ($2400) + BNE.B @definitely + BTst.B #$0, ($DD0) + BEQ.B @dont +@definitely + + BSR NewStartInitFunc + BSR.L InitSCSIMgr ; Init old and new SCSI Mgrs +@dont + + IMPORT InitExpansionMgr + BSR.L InitExpansionMgr + + IMPORT InterC_1980_Drivers + BSR.L InterC_1980_Drivers + + BSR LoadDrivers ; load the standard drivers + BSR.L InitADB ; initialize ADB interface + import InterC_1910_USBFamilyExpertLib + bsr.l InterC_1910_USBFamilyExpertLib + BSR InitCrsrMgr ; Initialize cursor variables -;---------------------------------------------------------------- -; Initialize Reliability Manager -;---------------------------------------------------------------- - - BSR.L InitReliability ; initialize the Reliability Manager - - BSR CheckForEgretOrCuda ; call check routine - BNE.S @NoEgret ; Egret not installed - BSR.L EgretDFACandPDM ; install additional Egret features -@NoEgret - BSR CheckForResetPRAM ; see if PRAM needs to be nuked + IMPORT InitBCScreen + BSR.L InitBCScreen BSR.L TEGlobalInit ; initialize TextEdit vectors @@ -1791,6 +1665,7 @@ BootRetry MOVE #$2700,SR ; disable interrupts ; for the sake of its internal side-effects. After the call, ApplZone, HeapEnd, and HiHeapMark ; must be reset. ApplLimit is set to BufPtr-DefltStack, which is fine for boot time. ;---------------------------------------------------------------- +; 35a MOVE.L SysZone,A0 ; Point to System Heap MOVE.L bkLim(A0),A0 ; Point to end of System Heap @@ -1813,36 +1688,23 @@ BootRetry MOVE #$2700,SR ; disable interrupts BSR DrawBeepScreen ; Horst BeepmanhÕs patented gray screen -; On machines with Civic, check to see if we want to boot off the composite out - - TestFor CivicExists - Beq.s @NoCivic ; don't do it for Non-Civic Based cpu's - bsr CheckForTV ; see if we need to set the "Drive CompOut Flag" -@NoCivic - MOVE.L #WmStConst,WarmStart ; write warm start constant to indicate warm start MOVEA.L BootGlobPtr,A0 ; point to bootGlobals move.l #WmStConst,StartGlobals.sgWarmStart(A0) ; flag warm start in a ; place where StarTest can see it w/o an MMU -;---------------------------------------------------------------- -; Initialize the Sound Manager -;---------------------------------------------------------------- - MOVEM.L A0-A2/A6/D0-D2,-(SP) ; save our important Address - case obj - import InitSoundMgr - bsr.l InitSoundMgr - case off - MOVEM.L (SP)+,A0-A2/A6/D0-D2 ; restore our important Address + import InterC_2780_FireWire + bsr.l InterC_2780_FireWire ;---------------------------------------------------------------- ; Initialize the File System. ;---------------------------------------------------------------- +; 3b0 MOVE #40,D0 ; Inital number of file control blocks _InitFS @@ -1850,20 +1712,33 @@ BootRetry MOVE #$2700,SR ; disable interrupts ;---------------------------------------------------------------- ; <65>, Other Terror changes... ;---------------------------------------------------------------- +; 3b6 - BSR.L SetupDockBases ; initialize docking bar base addresses

-* BSR.L SCSIDiskMode ; check if we should be in SCSI Disk Mode + BTST #$1, $2409 + BEQ.B @dont_do_mysterious_thing + IMPORT LoadPCCardLib + BSR.L LoadPCCardLib +@dont_do_mysterious_thing + + IMPORT InterC_2a20_SCSITargetMode + BSR.L InterC_2a20_SCSITargetMode + + BTst.B #5, $2408 + BEQ.B @nodiskmode + BSR.L SCSIDiskMode ; check if we should be in SCSI Disk Mode +@nodiskmode - IF hasAsyncSCSI THEN ; \/ - BSR.L ISITT ; check if we're running SCSI 4.3 - TST.B D0 ; are we? - BEQ.S @noAsyncSCSI ; -> no, don't don't initialize for new - ; style boot. BSR.L INITSCSIBOOT ; allocate some memory for SCSI booting ; and load third party SIMs (SCSI Interface ; modules -@noAsyncSCSI - ENDIF ; /\ + + IMPORT ATAMgr_5dae0 + BSR.L ATAMgr_5dae0 + IMPORT ATAMgr_5dde0 + BSR.L ATAMgr_5dde0 + + IMPORT InterC_2130_CardBus + BSR InterC_2130_CardBus ************************************************************************************************* @@ -1885,7 +1760,7 @@ BootRetry MOVE #$2700,SR ; disable interrupts ;________________________________________________________________________________________ ; -; Routine: WhichCPU +; Routine: WhichCPU 3f2 ; ; Inputs: none ; @@ -1956,60 +1831,12 @@ WhichCPU MACHINE MC68020 moveq.l #2,d7 ; setup index to see if index scaling works - jmp @CheckIndexScale-2(d7.w*2) ; decide if scaling works - -@CheckIndexScale - bra.s @NoIndexScale ; 68000/68010 don't have index scaling - -@HasIndexScale ; 68020/68030/68040 do have index scaling - sub.l d7,d7 ; D7 = 0 (testing for 040) - - bset #CACR_DE_040,d7 ; set DE (data cache enable) in CACR - movec d7,CACR ; enable data cache - movec CACR,d7 ; IF CACR != 0 THEN we're on an 040 - bclr #CACR_DE_040,d7 ; see if the bit exists in CACR - movec d7,CACR ; put it back in cache reg - beq.s @notAn040 ; NO ... check for 020/030 - - MACHINE MC68040 ; YES ... needed to execute a 040 CINVA inst. - - cinva bc ; invalidate both caches, dont push data from d-cache - ; NOTE - I-cache is still enabled here - moveq #cpu68040,d7 ; return that we're running on an 040 - rts - - MACHINE MC68020 -@notAn040 - move.w #(1<>1,d7 ; setup to shift in ccr.x - addx.l d7,d7 ; d7 := 2 if 68020, d7 := 3 if 68030 rts ; all done -@NoIndexScale ; 68000/68010 don't have index scaling - move.l sp,d7 ; mark the stack - clr.w -(sp) ; fake a 68010 exception format word - bsr.s @doRTE ; push a return address, sr, and RTE back - exg.l d7,sp ; restore the stack - sub.l sp,d7 ; d7 := -2 if 68000, d7 := 0 if 68010 - addq.l #2,d7 ; d7 := 0 if 68000, d7 := 2 if 68010 - lsr.l #1,d7 ; d7 := 0 if 68000, d7 := 1 if 68010 - rts ; all done - -@doRTE move.w sr,-(sp) ; push the SR to complete exception frame - rte ; pop the exception frame and return - - SETMACHINE - ;________________________________________________________________________________________ ; -; Routine: WhichBoard +; Routine: WhichBoard 3f6 ; ; Inputs: D7.B- CPU type ; @@ -2029,7 +1856,7 @@ WhichBoard swap d7 ; get CPU type in hi word ;________________________________________________________________________________________ ; -; Routine: SetUpTimeK +; Routine: SetUpTimeK 402 ; ; Inputs: D7.B- CPU type ; @@ -2048,62 +1875,57 @@ WhichBoard swap d7 ; get CPU type in hi word ;________________________________________________________________________________________ SetUpTimeK - cmpi.b #cpu68040,CPUFlag ; check if running on one of those nasty 040s - blt.s @doIt + MoveM.L D1-D2/A1-A4, -(A7) + Move SR, -(A7) + OrI #$700, SR + Move.L ($64), -(A7) + BTst.B #$6, ($2400) + BNE.B L8 + BTst.B #$1, ($2400) + BNE L12 + Bra L13 +L8: MoveQ.L #$0, D0 + Move ([$68FFEFD0.L],$80), D0 -; If we are 040'ish, check if the Cache Switch has requested to disable processor -; caches. The Cache Switch CDEV sets PRAM location $8A bit 7 if caches will be -; disabled. We are taking the initiative here and THIS is the place we will turn -; OFF caches for the duration. We want to make sure that we do this BEFORE we -; calculate the timing values, as they will change depending on whether caches are -; on or off. + MoveM.L D0-D2/A0, -(A7) + MoveA.L ([$68FFEFD0.L],$18), A0 - movem.l d0-d3/a0-a3,-(sp) ; save registers before mucking around - move.l UnivInfoPtr,a1 ; retrieve ProductInfo record pointer - move.l a1,a2 ; leave A1 alone - call the routine with A2 - move.l a1,a0 ; leave A1 alone - get pointer in A0 for call - adda.l ProductInfo.ClockPRAMPtr(a2),a2; get pointer to primitives table - move.l 4*cpXPRAMIO(a2),d0 ; get the offset to the routine - beq.s @restore ; if no trap-less routine, then run with caches ON - add.l ProductInfo.DecoderInfoPtr(a1),a0; required for the PramIO call - adda.l d0,a2 ; form trapless _ReadXPram subroutine address - clr.w -(sp) ; make room on the stack - movea.l sp,a3 ; set up for call to _ReadXPRam - move.l UnivROMFlags,d1 ; D1, A0, A1, A3 need to set for StandardXPramIO - move.l #$0001008A,d3 ; 1 byte at $8A - jsr (a2) ; dont have traps yet. go there directly - move.w (sp)+,d0 ; get the byte - tst.w d0 ; check if top bit is set - bpl.s @restore ; top bit not set - run with caches on + Tst.L A0 + BNE.B L10 + MoveA.L ([$68FFEFF0.L],$100), A0 - MACHINE MC68040 - CPUSHA BC ; make sure return addresses make it to memory - MACHINE MC68020 + Move.L #$80000000, D1 + CmpI.L #$1F, D0 + BGT.B L9 + ROR.L D0, D1 + Or.L D1, $14(A0) + Nop + Bra L11 +L9: SubI.L #$20, D0 + ROR.L D0, D1 + Or.L D1, $4(A0) + Nop + Bra L11 +L10: AddA.L #$10000, A0 + LsL.L #$5, D0 + Move.L $0(A0,D0.W), D1 + BClr.L #$7, D1 + Move.L D1, $0(A0,D0.W) + Nop +L11: MoveM.L (A7)+, D0-D2/A0 + Bra.B L13 +L12: MoveA.L ($DD8), A0 + AddA.L (A0), A0 + MoveA.L $E4(A0), A0 + OrI.L #$400, $24(A0) - moveq.l #0,d0 - movec d0,CACR ; turn OFF all caches -@restore - movem.l (sp)+,d0-d3/a0-a3 ; restore registers after mucking around -@doit - move.l AutoInt1,-(sp) ; Save current auto interrupt vector. - move.w sr,-(sp) ; Save current interrupt level. - ori.w #HiIntMask,sr ; disable interrupts - - TestFor GrandCentralExists ; Do we have a Grand Central - beq.b @viaIntsEnabled ; Nope, so carry on - movea.l UnivInfoPtr,a0 ; Get the GC base address from - adda.l ProductInfo.DecoderInfoPtr(a0),a0 ; the universal info - movea.l DecoderInfo.GrandCentralAddr(a0),a0 ; and then - ori.l #1< CompletedInts+1 +@dont + tst.w (a4) ; see if any more routines to time bne.s @nextRoutine ; time all routines in the table eieioSTP move.b #(0< ; -; VIATime, in the IIci/IIfx/TERROR/HORROR ROMs, lives at 40x008BC. +; VIATime 5ca, in the IIci/IIfx/TERROR/HORROR ROMs, lives at 40x008BC. ; -------- ; This means that the @loop btst.b #0,(A0) is at 40x008C8, and the dbra d0,@loop ; is at 40x008CC. This code, "half cache-line aligned, when run on an 040 and above, will execute @@ -2252,7 +2097,7 @@ VIATime ;________________________________________________________________________________________ ; -; Routine: JmpTblInit, JmpTbl2 +; Routine: JmpTblInit 5e0, JmpTbl2 5e2 ; ; Inputs: A0 - pointer to table of routine word offsets (A0-relative) ; A1 - pointer to destination jump table in RAM @@ -2277,7 +2122,7 @@ JmpTbl2 MOVEQ #0,D2 ; clear high part for arithmetic ;________________________________________________________________________________________ ; -; Routine: FillWithOnes +; Routine: FillWithOnes 5f0 ; ; Inputs: A0 - pointer to starting RAM location (must be longword aligned) ; A1 - pointer to ending RAM location (must be longword aligned) @@ -2300,7 +2145,7 @@ FillWithOnes ;________________________________________________________________________________________ ; -; Routine: CompBootStack +; Routine: CompBootStack 5fa ; ; Inputs: none ; @@ -2312,19 +2157,26 @@ FillWithOnes ;________________________________________________________________________________________ CompBootStack + btst #$06,$240B + beq.s CompBootStackOld + move.l #$007EFFE0,A0 ; 8 M - 64 K - 32 b + rts + +CompBootStackOld move.l BufPtr,d0 ; get top useable memory move.l sysZone,a0 ; get start system heap sub.l a0,d0 ; get (top useable - sys heap start) lsr.l #1,d0 ; divide by two - andi.w #$FFFE,d0 ; force it to be even - add.l d0,a0 ; get sys heap + (top - sysHeap)/2 - suba.w #BootGlobalsSize,a0 ; leave room for QuickDraw stuff. + add.l a0,d0 ; get sys heap + (top - sysHeap)/2 + sub.w #BootGlobalsSize,d0 ; leave room for QuickDraw stuff. + andi.w #$FFF0,d0 ; force it to be even + move.l d0,a0 rts ;________________________________________________________________________________________ ; -; Routine: ConfigureRAM +; Routine: ConfigureRAM 624 ; ; Inputs: D2.B- address decoder kind (from Universal) ; A0 - pointer to machine's DecoderInfo table (from Universal) @@ -2391,7 +2243,7 @@ ConfigureRAM ;________________________________________________________________________________________ ; -; Routine: SetUpSysAppZone +; Routine: SetUpSysAppZone 674 ; ; Inputs: none ; Outputs: none @@ -2406,17 +2258,6 @@ ConfigureRAM SetUpSysAppZone lea SysHeap,a0 ; point at normal system heap template - move.b MMFlags,-(sp) ; save the memory Manager flag - btst.b #MMSysHeap,MMFlags ; check type of System Heap - beq.s @do24 ; IF we want a 32 bit heap - bset.b #MMStartMode,MMFlags ; set for 32 bit system heap - btst.b #mmHighSysHeap,MMFlags ; check for the 'black hole' - beq.s @knowHeap ; IF we have 'black hole' between lowmem & sysHeap - lea SysHoleHeap,a0 ; get addr 'black hole' zone template - bra.s @knowHeap ; ENDIF -@do24 bclr.b #MMStartMode,MMFlags ; set for 24 bit system heap -@knowHeap ; ENDIF - _InitZone ; set up initial system heap Move.L theZone,SysZone ; save pointer to the new zone Move.L SysZone,RamBase ; setup RamBase to system heap @@ -2435,193 +2276,40 @@ SetUpSysAppZone MOVE.L SP,A0 ; Use the current sp when itÕs lower @3 SUBA.W #BootStackSize,A0 ; Give ourselves some stack space _SetApplLimit ; Don't let the System Heap crash our stack - MOVE.B (SP)+,MMFlags ; restore memory manager flag - - _MoreMasters ; Create 768 master pointers at the bottom of SAM - _MoreMasters ; the heap. This is approximately the number of - _MoreMasters ; relocatable objects in the system heap for - _MoreMasters ; System 7.1 and a set of standard inits. - _MoreMasters ; (We need 6 calls to MoreMasters to get 768 of them. - ; _InitZone will create one block of "4*dfltMasters" - RTS ; MPs for us.) + + +; _MoreMasters ; Create 768 master pointers at the bottom of SAM +; _MoreMasters ; the heap. This is approximately the number of +; _MoreMasters ; relocatable objects in the system heap for +; _MoreMasters ; System 7.1 and a set of standard inits. +; _MoreMasters ; (We need 6 calls to MoreMasters to get 768 of them. +; ; _InitZone will create one block of "4*dfltMasters" +; RTS ; MPs for us.) + + move.l d3,-(sp) + moveq.l #2,d3 +@trap_blk + _MoreMasters + _MoreMasters + _MoreMasters + _MoreMasters + _MoreMasters + _MoreMasters + _MoreMasters + _MoreMasters + dbf d3,@trap_blk + move.l (sp)+,d3 + rts SysHeap DC.L HeapStart DC.L HeapStart+SysZoneSize DC.W 4*dfltMasters ; Master Pointer allocation size = 128 (MPs) DC.L 0 -SysHoleHeap dc.l HoleSysHeap ; start address - dc.l HoleSysHeap+SysZoneSize ; size - dc.w 2*dfltMasters ; # master ptrs - dc.l 0 ; no growzone proc - ;________________________________________________________________________________________ ; -; Routine: CheckForResetPRAM -; -; Inputs: none -; Outputs: none -; Trashes: D0, A0, A1 -; -; Function: if the cmd-option-R-P keys are down, it resets PRAM and then reboots the machine -; -; If the byte 76 contains a value of 2 in it then some of the PRAM information will be saved. -; If the value is any other value (0,1,3) then the value will be set to zero. -; The information which is saved is: -; all PassWord information (address/size) -; 04/04 PSWD -; 0E/02 pswd checksum and flags -; AB/03 PSWD -; All AUX information 40/06 A/UX -; Sensitive Boot Parms 76/01 Reserved for StartMgr -; Default OS Type 77/01 Default OS -; Default Boot Device 78/04 Default Boot Device -;________________________________________________________________________________________ - -CheckForResetPRAM - -ck4rpRegs REG D1-D2 - -; hi-byte == size, lo-byte == address -PSWDPRAM equ $00040004 ; 4 bytes at password location $04 -PSWDChkFlg equ $0002000E ; 2 bytes at password location $0E ($0E = Checksum, $0F = Flags) -AUXPRAM equ $00060040 ; 6 bytes at A/UX location $40 -OSTypePRAM equ $00020076 ; 2 bytes at Default OS $76 ($76 = reserved/save PRAM or not, $77 = Default OS) -ClearPRAM equ $00010076 ; 1 byte at reserved byte (used if value is 1 or 3) -DefBoot equ $00040078 ; 4 bytes at Default Boot Device $78 -PSWDspace equ $000400AB ; 4 bytes at password location $AB (only use 3, but I alocate 4 on the stack) -PSWDmore equ $000300AB ; the actual 3 bytes which I use at location $AB - - movem.l ck4rpRegs, -(sp) ; \/ \/ \/ - - bsr Ck4LimitPRAMClear ; supposed to allow bypassing security with reset? - sne D2 ; D2=true if limit clear - ; /\ /\ /\ - lea @Keys,a1 ; keys to check for - lea KeyMap,a0 ; compare to the Key Down Map - moveq.l #4-1,d0 ; compare loop count -@loop cmpm.l (a0)+,(a1)+ ; check for exactly this combo - dbne d0,@loop ; examine the entire key map - bne.s @noMatch ; if not equal, don't reset PRAM - - tst.b D2 - beq.s @normNuke - bra.s @savesome -@noMatch - movem.l (sp)+, ck4rpRegs - rts ; otherwise, just return - - -; \/ \/ \/ \/ Save security-related items (mainly for AIX) thru next - -@savesome - subq.w #PSWDPRAM>>16,sp ; allocate buffer on stack - movea.l sp,a0 ; get buffer ptr - move.l #PSWDPRAM,d0 ; get #, addr PRAM bytes - _ReadXPram ; read the PSWD info - - subq.w #PSWDChkFlg>>16,sp ; - movea.l sp,a0 ; - move.l #PSWDChkFlg,d0 ; - _ReadXPram ; read the PSWD checksum & Flags - - subq.w #PSWDspace>>16,sp ; - movea.l sp,a0 ; - move.l #PSWDmore,d0 ; - _ReadXPram ; read the PSWD info - - subq.w #AUXPRAM>>16,sp ; - movea.l sp,a0 ; - move.l #AUXPRAM,d0 ; - _ReadXPram ; read the AUX info - - subq.w #OSTypePRAM>>16,sp ; - movea.l sp,a0 ; - move.l #OSTypePRAM,d0 ; - _ReadXPram ; read the Default OS - - subq.w #DefBoot>>16,sp ; - movea.l sp,a0 ; - move.l #DefBoot,d0 ; - _ReadXPram ; read the Default Boot Device - -; /\ /\ /\ /\ from prev - -@normNuke subq.w #RelPram>>16,sp ; - movea.l sp,a0 ; - move.l #RelPram,d0 ; - _ReadXPram ; read the reliability MGR info - - ; kill signatures in extended and old PRAM so that InitUtil writes default values out - - movea.l a1,a0 ; point to table data - move.l (a0)+,d0 ; get PRAM len/addr, point to data - _WriteXPRam ; kill the extended PRAM signature - lea SysParam,a0 ; standard PRAM buffer address - moveq.l #-1,d0 ; mask/data to write - move.b d0,(a0) ; kill the signature in the buffer - _WriteParam ; write the buffer to PRAM - - _InitUtil ; Init PRAM - - movea.l sp,a0 ; - move.l #RelPram,d0 ; - _WriteXPram ; restore the reliability MGR info - adda.w #RelPram>>16,sp ; clean up the stack - - tst.b D2 ; flag set telling us not to clear everything? - beq.s @normNuke3 ; no-> don't restore them (we didn't save them earlier) - -; \/ \/ \/ \/ Restore security-related items thru next - - movea.l sp,a0 ; get buffer ptr - move.l #DefBoot,d0 ; get #, addr PRAM bytes - _WriteXPram ; restore the Default Boot Device - adda.w #DefBoot>>16,sp ; clean up the stack - - movea.l sp,a0 ; - move.l #OSTypePRAM,d0 ; - _WriteXPram ; restore the Default clean of OS - adda.w #OSTypePRAM>>16,sp ; - - movea.l sp,a0 ; - move.l #AUXPRAM,d0 ; - _WriteXPram ; restore the AUX info - adda.w #AUXPRAM>>16,sp ; - - movea.l sp,a0 ; - move.l #PSWDmore,d0 ; - _WriteXPram ; restore the PSWD info - adda.w #PSWDspace>>16,sp ; - - movea.l sp,a0 ; - move.l #PSWDChkFlg,d0 ; - _WriteXPram ; restore the PSWD Checksum & Flags - adda.w #PSWDChkFlg>>16,sp ; - - movea.l sp,a0 ; - move.l #PSWDPRAM,d0 ; - _WriteXPram ; restore the PSWD info - adda.w #PSWDPRAM>>16,sp ; - -; /\ /\ /\ /\ from prev - -@normNuke3 bra Start ; re-boot the machine - - -@Keys dc.l $00800000 ; R - dc.l $08008004 ; P, Cmd, Opt - dc.l $00000000 - dc.l $00000000 - - dc.l $0004000C ; XPRAM signature len/addr - dc.l 'Gone' ; invalidate XPRam signature with this - - -;________________________________________________________________________________________ -; -; Routine: GetPRAM +; Routine: GetPRAM 6ce ; ; Inputs: none ; Outputs: none @@ -2665,54 +2353,6 @@ GetPRAM _InitUtil ; seed low memory PRAM buffer RTS -;________________________________________________________________________________________ -; -; Routine: SetPRAM32 -; -; Inputs: none -; Outputs: none -; Trashes: none -; -; Function: force Memory Manager start mode to 32-bit mode -;________________________________________________________________________________________ - -SetPRAM32 movem.l a0/d0,-(sp) ; save a0 and d0 - subq.l #4,sp ; create space on stack - move.l sp,a0 ; get pointer to useful buffer - - MOVE.L #$1008a,d0 ; Command to read 1 byte at addr 8a - _ReadXPRam ; - - move.l sp,a0 ; get pointer to useful buffer - ori.b #5,(a0) ; set PRAM to 32 bit mode - MOVE.L #$1008a,d0 ; Command to write 4 bytes at addr 8a - _WriteXPRam ; - addq.l #4,sp ; dispose space on stack - movem.l (sp)+,a0/d0 ; restore a0/d0 - rts - -;________________________________________________________________________________________ -; -; Routine: InitNonMMU -; -; Inputs: A6 - pointer to memory table in high memory -; -; Outputs: A4 - points to memory table -; A5 - points to top of useable RAM -; A6 - points to top of total RAM -; -; Trashes: none -; -; Function: sets up A4, A5, A6 for non-MMU based machines and points jSwapMMU to an RTS. -;________________________________________________________________________________________ - -InitNonMMU move.l a6,a4 ; get ptr to memory table - move.l (a4),a6 - add.l 4(a4),a6 ; calculate top of all memory - move.l a6,a5 ; top useable memory = top all memory - rts - - ************************************************************************************************* * * @@ -2723,7 +2363,7 @@ InitNonMMU move.l a6,a4 ; get ptr to memory table ;________________________________________________________________________________________ ; -; Routine: InitHiMemGlobals +; Routine: InitHiMemGlobals 70c ; ; Inputs: none ; Outputs: none @@ -2753,7 +2393,7 @@ InitHiMemGlobals ;________________________________________________________________________________________ ; -; Routine: InitGlobalVars +; Routine: InitGlobalVars 73c ; ; Inputs: none ; Outputs: none @@ -2804,18 +2444,7 @@ InitGlobalVars ; jump table. ; Move.l ROMBase,A0 ; Get ROMBase - TestFor ASCExists ; Do we really have an ASC? - Beq.s @noASC ; -> No. Set SoundBase = ROMBase - Move.l ASCBase, A0 ; We do have an ASC. Get its base from universal -@noASC Move.l A0,SoundBase ; Set up SoundBase - - IF ROMinRAM THEN - CMPI.L #$40800000,SoundBase ; if running from RAM, Set sound base to ROM rb - BHI.S @BaseOK ; if SoundBase points to higher than 40800000 rb - MOVE.L #$40800000,SoundBase ; is ok, otherwise point to real ROM rb -@BaseOK ; rb - ENDIF ;-------------------------------------- LEA VBLQueue,A1 @@ -2870,7 +2499,7 @@ InitGlobalVars ;________________________________________________________________________________________ ; -; Routine: InitCrsrVars +; Routine: InitCrsrVars 81e ; ; Inputs: none ; Outputs: none @@ -2890,7 +2519,7 @@ InitCrsrVars ;________________________________________________________________________________________ ; -; Routine: InitCrsrMgr +; Routine: InitCrsrMgr 82e ; ; Inputs: none ; Outputs: none @@ -2938,6 +2567,11 @@ InitCrsrMgr MOVE.L #$000F000F,D0 move.l (a1)+,(a0)+ ; move the bytes in move.l (a1),(a0) + RTS + +MouseBytes dc.b 4,10,15,255,255,83,77,72 + +InitCrsrMgrMiddle LEA GrafEnd,A1 ; end of cursor globals BigLea CrsrDevHandleVBL,A0 ; install cursor VBL task MOVE.L A0,-(A1) ; JCrsrTask @@ -2962,119 +2596,12 @@ InitCrsrMgr MOVE.L #$000F000F,D0 MOVE.W D0,CrsrNew ; flag cursor as changed, turn on tracking MOVE.L D0,MouseMask ; No jerkiness with $FFFFFFFF mask - IF forTNTDebug THEN -; set up a Time Manager task to call jVBLTask - -initDummyVBL - moveq.l #tmXQSize, d0 ; allocate a block in the system heap - _NewPtr ,SYS,CLEAR ; to hold the Time Manager task structure - lea dummyVBL, a1 - move.l a1, tmAddr(a0) - move.l #'eada', (a0) ; identify queue type to VM - _InsXTime - move.l #-16626, d0 - move.l jPrimeTime, a1 - jmp (a1) - - RTS - -dummyVBL - movea.l a1, a0 - move.l #-16626,d0 ; 60.15 Hz - movea.l jPrimeTime, a1 - move.l jCrsrTask,-(sp) ; return address from PrimeTime to CrsrTask - jmp (a1) ; restart time manager task - ENDIF - - RTS - -MouseBytes dc.b 4,10,15,255,255,83,77,72 - - -;________________________________________________________________________________________ -; -; Routine: InitSwitcherTable -; -; Inputs: none -; Outputs: none -; Trashes: A0,A1 -; -; Function: Installs a table telling Switcher what low memory locations to save/restore -; between applications in addition to the Switcher's own table (but always -; including the dispatch table). The Switcher's table: -; -; $100: $02 bytes (monkey lives) -; $108: $14 bytes (MemTop, BufPtr, StkLowPt, HeapEnd, TheZone) -; $130: $04 bytes (ApplLimit) -; $15C: $04 bytes (SEvtEnb, DSWndUpdate, FontFlag, IntFlag) -; $2AA: $04 bytes (ApplZone) -; $31E: $22 bytes (MinStack, DefltStack, mmDefFlags, GZRootHnd, GZRootPtr, -; GZMoveHnd, DSDrawProc, EjectNotify, IAZNotify). -; $800: $2FC bytes (ToolBox globals) -; -; Table defining our additional switchables -; -; Format is: -; address (word), byte count (word) ; save bytecount bytes at address -; . -; . -; 0 (longword) ; terminates list -;________________________________________________________________________________________ - -OurSwitch DC.W OSTable, 4*numOStrap ; OS dispatch table - DC.W ToolTable, 4*numTBtrap ; Toolbox dispatch table - DC.W $0B80, $26 ; new switchables - DC.W $0BAE, $52 ; new switchables - DC.W HFSFlags, 2 ; TFS flags (PMSP status) & Cache flags - DC.W DefVRefNum, 2 ; Default VRefNum/WDRefNum - DC.W DefVCBPtr, 4 - DC.W ScrDmpEnb, 2 - DC.W CurDirStore,4 - DC.W MBProcHndl, 4 - - DC.W $0100, $0002 ; SysCom//MonkeyLives - DC.W $0108, $0014 ; memtop,bufptr,stklowpt,etc. - DC.W $015C, $0004 ; SEvtEnb,DSWndUpdate,FontFlag,IntFlag - DC.W $031E, $0022 ; MinStack,DefltSTack,mmDefFlags,etc. - DC.W $0800, $02FC ; toolbox globals,etc. - DC.W ApplLimit, $0004 - DC.W ApplZone, $0004 - DC.W AuxWinHead, $0004 - DC.W AuxCtlHead, $0004 - DC.W BNMQHd, $0004 - DC.W MenuCInfo, $0004 - DC.W MenuDisable,$0008 - DC.W theGDevice, $0004 - -WDCBSwitch DC.W 0,0,0 ; WDCB table -PMSPSwitch DC.W 0,0,SPHdrSize-2 ; PMSP hook - DC.W 0,0 ; terminate with a long of zeroes -SwitchLen EQU *-OurSwitch - -;---------------------------------------------------------------- -; These constant values are stored in ROM rather than defined as EQUs for -; use at compile time simply because we have a brain-damaged (c.f. Jobs on HP) -; development system. -;---------------------------------------------------------------- -WDCBSwOS DC.W WDCBSwitch-OurSwitch -PMSPSwOS DC.W PMSPSwitch-OurSwitch - - -InitSwitcherTable - MOVEQ #SwitchLen,D0 ; allocate a switcher table in - _NewPtr ,SYS,CLEAR ; the system heap - MOVE.L A0,A1 ; make it the destination - LEA OurSwitch,A0 ; template table - MOVEQ #SwitchLen,D0 ; copy it - needs to be updated with - _BlockMove ; WDCBSwitch, PMSPSwitch later - - MOVE.L A1,SwitcherTPtr ; Set the pointer up for Switcher RTS ;________________________________________________________________________________________ ; -; Routine: SetupHWBases +; Routine: SetupHWBases 8be ; ; Inputs: none ; Outputs: none @@ -3121,7 +2648,9 @@ SetupHWBases lsl.w #2,d3 ; setup index into bases table move.l (4*64,a0,d3.w),(a3) ; initialize the low mem bra.s @loop ; go on to next low mem - + + + @BaseInitTable dc.w VIA1Exists,VIA ; init VIA1 base address dc.w SCCRdExists,SCCRd ; init SCC read base address @@ -3181,6 +2710,11 @@ SetupMiscSCSI bra.s @SCSIHskDone @80based ENDIF + + + btst.b #6, ($2400) + bne.b @SCSIHskDone + btst.l #SCSIDackExists,d0 ; see if we have SCSI Dack bne.s @SCSIDackDone ; if we do, it's setup ok move.l SCSIHsk,SCSIDMA ; if not, use hsk instead @@ -3200,7 +2734,7 @@ SetupMiscSCSI ;________________________________________________________________________________________ ; -; Routine: InitSlots +; Routine: InitSlots 992 ; ; Inputs: none ; Outputs: none @@ -3224,38 +2758,7 @@ InitSlots BSR.L InitSDTbl ; init slot int dispatch table ;________________________________________________________________________________________ ; -; Routine: InitIOPStuff -; -; Inputs: none -; Outputs: none -; Trashes: ??? -; -; Function: initializes the I/O system by building the Unit Table and issuing initialization -; calls to all the component drivers. -;________________________________________________________________________________________ - -InitIOPStuff - IF IopADB | hasIopScc | hasIopSwim THEN - BSR.L InitIOPMgr ; fire up the IOP manager - IF hasIopSWIM THEN - TestFor SWIMIOPExists ; see if we have a SWIM IOP - beq.s @noSwimIOP ; if not, skip it - BSR.L EnableSwimIOPInts ; Enable SWIM IOP interrupts -@noSwimIOP - ENDIF - IF hasIopScc THEN - TestFor SCCIOPExists ; see if we have a SCC IOP - beq.s @noSCCIOP ; if not, skip it - BSR.L SCCIOPBypass -@noSCCIOP - ENDIF - ENDIF - rts - - -;________________________________________________________________________________________ -; -; Routine: InitDeviceMgr +; Routine: InitDeviceMgr 9b0 ; ; Inputs: none ; Outputs: none @@ -3269,7 +2772,7 @@ InitDeviceMgr ; Compute the size of the unit table and allocate it. MOVEQ #UnitEntries,D0 ; get number of entries in unit table MOVE.W D0,UnitNtryCnt ; save for IOCore checking - MOVE.L #MaxUTEntries*4,D0 ; reserve more memory so table can grow + MOVE.L #MaxUTEntries*2,D0 ; reserve more memory so table can grow _NewPtr ,SYS,CLEAR ; allocate it and zero out the memory MOVE.L A0,UTableBase ; and save its address @@ -3278,7 +2781,7 @@ InitDeviceMgr ; Compute the size of the unit table and allocate it. ;________________________________________________________________________________________ ; -; Routine: LoadDrivers +; Routine: LoadDrivers 9c4 ; ; Inputs: none ; Outputs: none @@ -3295,55 +2798,6 @@ LoadDrivers MOVE.L SP,A0 CLR.B IOPermssn(A0) ; r/w permissions - IF hasNewAge THEN - TestFor NewAgeExists ; do we have a NewAge? - Beq.S @NoNewAge ; no ? then try old floppy - - move.l SP,A0 ; iopb on stack - clr.b IOPermssn(A0) ; clear r/w permissions - lea NewAgeName,a1 ; get new age driver name - move.l a1,IOFileName(a0) ; set it up - _Open ; and open the driver -@NoNewAge - ENDIF - - TestFor IWMExists ; do we have an IWM or SWIM? - IF hasIopSwim THEN - BNE.S @OpenSony ; -> yes, open the driver - TestFor SWIMIOPExists ; how about an IOP-based version? - ENDIF - - IF hasSwim3 THEN - BNE.S @OpenSony ; -> yes, open the driver - TestFor SWIM3Exists ; how about a SWIM3 based version? - ENDIF - BEQ.S @NoFloppy ; -> nope, no floppy controller - -@OpenSony - MOVE.L SP,A0 ; iopb on the stack - CLR.B IOPermssn(A0) ; r/w permissions - LEA DiskName,A1 - MOVE.L A1,IOFileName(A0) - _Open ;OPEN Floppy disk driver - -; -;ÑÑÑÑÑÑÑÑÑ NetBoot Driver ÑÑÑÑÑÑÑÑÑ -; -@NoFloppy - IF hasNetBoot THEN - SUBQ.W #4,SP - MOVE.L #'DRVR',-(SP) ; resource type - PEA NetBootName ; resource name - _GetNamedResource ; try to get the handle to the .netBoot driver - TST.L (SP)+ ; does the driver exist? - BEQ.S @NoNetBoot ; -> no, try don't open it - - LEA NetBootName, A1 - MOVE.W #49,D2 ; and resource ID - BSR InstallDriver ; go install the driver -@NoNetBoot - ENDIF - ; ;ÑÑÑÑÑÑÑÑÑ RAM Disk Driver ÑÑÑÑÑÑÑÑÑ ; @@ -3351,42 +2805,78 @@ LoadDrivers ; to enable the EDisk, make sure that it is included in the rom resources IF hasEDisk THEN - LEA EDiskName,A1 - MOVE.W #48,D2 ; and resource ID + LEA.L EDiskName,A1 + MOVEQ.L #$30,D2 ; and resource ID BSR InstallDriver ; go install the driver ENDIF - IF NOT forTNTDebug THEN -; -;ÑÑÑÑÑÑÑÑÑ Sound Driver ÑÑÑÑÑÑÑÑÑ -; - IF hasDSP THEN - TestFor DSPExists ; If we have a DSP, we assume we're doing sound through it. - BNE.s @DoneSoundDriver ; if we have a Cyclone/DSP then don't load sound driver - ENDIF - MOVE.L SP,A0 ; iopb on the stack - CLR.B IOPermssn(A0) ; r/w permissions - LEA SndName,A1 - MOVE.L A1,IOFileName(A0) - _Open ; OPEN sound driver -@DoneSoundDriver - ENDIF +; +;ÑÑÑÑÑÑÑÑÑ LAN Disk Driver ÑÑÑÑÑÑÑÑÑ +; - MOVE.L SP,A0 ; iopb on the stack - CLR.B IOPermssn(A0) ; r/w permissions - BSR FROVideo ; open the default video driver and setup video globals - LEA IOQElSize(SP),SP ; deallocate parameter block for device manager calls. + IMPORT InterC_1890_InitLANDisk + BSR InterC_1890_InitLANDisk + + +; +;ÑÑÑÑÑÑÑÑÑ BCScreen Driver ÑÑÑÑÑÑÑÑÑ +; + + + IF hasBCScreen THEN + + SubQ.L #$2, sp + Move.L sp, -(sp) + Move.L #$3FF, -(sp) + Move.L #$36, -(sp) + Clr.L -(sp) + Pea.L BCScreenName + Move.L #$FFFFBF7D, -(sp) + + IMPORT Interstix208c_1 + BSR.L Interstix208c_1 + + dc.w $defc, $001a + ;AddA #$1A, A7 + + ENDIF + + +; +;ÑÑÑÑÑÑÑÑÑ Backlight Driver ÑÑÑÑÑÑÑÑÑ +; IF hasPwrControls THEN - TestFor hwCbPwrMgr ; <61>, is this a Power Mgr mac ? - beq.s @noBacklight ; <61>, if not, skip - LEA BacklightName,A1 ; get the backlight driver's name + BTst.B #$0, (HWCfgFlags) + BEQ.B @noBacklight + BTst.B #$6, ($2409) + BNE.B @noBacklight + Move.L #'only', -(A7) + LEA.L BacklightName,A1 ; get the backlight driver's name MOVE.W #-16511,D2 ; and resource ID BSR InstallDriver ; go install the driver + AddQ #$4, A7 @noBacklight - ENDIF + MoveA.L A7, A0 + Clr.B $1B(A0) + Bsr (* + $128) + Lea.L $32(A7), A7 + BTst.B #$6, ($2409) + BEQ.B @skipALine + import InterC_1f40_Backlight + Bsr.L InterC_1f40_Backlight +@skipALine + + BTst.B #$3, ($DD3) + BEQ @exitDrivers + ENDIF + + + + + ; ;ÑÑÑÑÑÑÑÑÑ Serial Drivers ÑÑÑÑÑÑÑÑÑ @@ -3398,21 +2888,30 @@ LoadDrivers ; table, remaining closed and inactive until opened by a client. subq #4,sp ; allocate space for return value - move.l #'SERD',-(sp) ; push serial driver resource type - - TestFor SerialDMA - bne.b @SerialDMA - clr.w -(sp) ; classic serial driver is 'SERD' (0) - bra.b @CallSERD -@SerialDMA move.w #1,-(sp) ; SerialDMA driver is 'SERD' (1) - -@CallSERD move.w #mapTrue,ROMMapInsert ; get resource from ROM + move.l #'nsrd',-(sp) ; push serial driver resource type + move.w #1,-(sp) ; SerialDMA driver is 'SERD' (1) + move.w #mapTrue,ROMMapInsert ; get resource from ROM _GetResource move.l (sp)+,d0 ; did it get the handle? beq.b @exitDrivers - movea.l d0,a0 - movea.l (a0),a0 - jsr (a0) ; call the install code + movea.l d0,a2 + movea.l (a2),a1 + SubQ #$4, A7 + Move.L A2, -(A7) + dc.w $a9a5 ; _SizeResource + Move.L (A7)+, D1 + Move.L D1, D0 + dc.w $A440 ; _ResrvMemSys + Move.L D1, D0 + _NewHandle ,Sys + Move.L A0, D0 + BEQ.B (* + $E) + _HLock + Move.L D1, D0 + MoveA.L (A0), A1 + MoveA.L (A2), A0 + _BlockMove + jsr (a1) ; call the install code @exitDrivers rts @@ -3420,8 +2919,6 @@ LoadDrivers STRING PASCAL -DiskName DC.W '.Sony' - SndName DC.W '.Sound' ; IF hasEDisk THEN @@ -3439,6 +2936,13 @@ BacklightName DC.W '.Backlight' ENDIF + + IF hasBCScreen THEN +BCScreenName + DC.W '.BCScreen' + ENDIF + + STRING ASIS @@ -3451,7 +2955,7 @@ BacklightName ;________________________________________________________________________________________ ; -; Routine: DrawBeepScreen +; Routine: DrawBeepScreen ab0 ; ; Inputs: A5 - pointer to QuickDraw globals in boot globals space ; @@ -3480,11 +2984,24 @@ DrawBeepScreen ; of the menu bar (because the screen background is white on LCD screens vs black on CRTs) BSR.L LCDScreenChk ; is this an LCD screen ? - BEQ.S @DoNormalBeepScreen ; -> no, do the normal stuff + BEQ.B @DoNormalBeepScreen ; -> no, do the normal stuff - PEA ScreenBits+bounds(A2) ; screen rectangle - PEA gray(A2) ; fill pattern - _FillRect ; fill the screen with 50% gray + Clr.B ($B3E) + Pea.L -$74(A2) + Clr.B -(A7) + Jsr (* + $204A) + Tst.B (A7)+ + BNE.B (* + $8) + Pea.L -$18(A2) + Bra.B (* + $14) + MoveA.L ($2b6), A0 + ST.B $341(A0) + Pea.L (* + $62) + _RGBForeColor + Pea.L -$10(A2) + _FillRect + MoveQ.L #$5, D0 + DC.W $ABE0 RTS @DoNormalBeepScreen ENDIF ; @@ -3510,15 +3027,23 @@ DrawBeepScreen _PenNormal ; restore the pen - MOVE.L #$00100010, -(SP) ; rounding factor - PEA gray(A2) ; fill pattern - _FillRoundRect ; fill the screen with 50% gray + Pea.L (* + $24) + _RGBForeColor + Move.L #$100010, -(A7) + Pea.L -$10(A2) + Bra.B (* + $C) + DC.L $2F3C0010 ; '/< ' + DC.L $0010486A ; ' Hj' + DC.W $FFE8 ; ' ' + _FillRoundRect + MoveQ.L #$5, D0 + DC.W $ABE0 RTS ;________________________________________________________________________________________ ; -; Routine: FROVideo +; Routine: FROVideo b54 ; ; Inputs: A0 - pointer to ioParamBlock ; @@ -3529,6 +3054,8 @@ DrawBeepScreen ; Function: finds, reads parameters for, and opens the driver for a video sRsrc ;________________________________________________________________________________________ + DC.W $8888, $8888, $8888 + WITH spBlock,seBlock,vpBlock FROVideo MOVE.L A0,A1 ; save the param block pointer for _Open @@ -3536,8 +3063,33 @@ FROVideo MOVE.L A0,A1 ; save the param block pointer for _Open LINK A6,#-spBlockSize ; allocate space for a slot parameter block MOVE.L SP,A0 ; and point to it - BSR.S OpnVidDeflt ; open the default video device, set video params - BEQ.S @End ; -> got it + BTST.B #6, ($240B) + BEQ.B @TryDefault + + MoveM.L D0-D7/A0-A4, -(A7) + Move.L ($1FB8), -(A7) + MoveA.L ($2b6), A3 + MoveA.L $1E0(A3), A3 + Move.L $C(A3), -(A7) + Lea.L (* + $28A), A2 + Move.L A2, ($1FB8) + Move.L A2, $C(A3) + SubQ #$2, A7 + Clr.L -(A7) + Move #$2EB, D0 + _DisplayDispatch + Move (A7)+, D0 + MoveA.L ($2b6), A3 + MoveA.L $1E0(A3), A3 + Move.L (A7)+, $C(A3) + Move.L (A7)+, ($1FB8) + Tst D0 + MoveM.L (A7)+, D0-D7/A0-A4 + BNE.B @End + +@TryDefault + BSR OpnVidDeflt ; open the default video device, set video params + BEQ @End ; -> got it ; the default video device is bad, so go search for a video sRsrc... @@ -3553,27 +3105,30 @@ FROVideo MOVE.L A0,A1 ; save the param block pointer for _Open @NextVidsRsrc _sNextTypesRsrc ; search for a video sRsrc - BNE.S @FakeIt ; -> couldn't find one, so allocate a dummy screen - - BSR RdVidParam ; read the video parameters - BNE.S @NextVidsRsrc ; -> error, so go search some more + BNE @End ; -> couldn't find one, so allocate a dummy screen BSR OpensDrvr ; open the video driver BNE.S @NextVidsRsrc ; -> couldn't do it, so go look some more + MOVE $18(A1), -(SP) + BSR RdVidParam ; read the video parameters + TST D0 + BNE.S @NextVidsRsrc ; -> error, so go search some more + BSR InitVidDeflt ; initialize the default video device BNE.S @NextVidsRsrc ; -> error during initialization, so go looking + BRA.S @End + + BSR InitDummyScreenWrapper + @End UNLK A6 ; get rid of the slot parameter block RTS -@FakeIt BSR InitDummyScreen ; allocate a dummy screen, GDevice - BRA.S @End ; and return - ;________________________________________________________________________________________ ; -; Routine: OpnVidDeflt +; Routine: OpnVidDeflt bfa ; ; Inputs: A0 - pointer to Slot Manager parameter block ; A1 - pointer to ioParamBlock @@ -3604,19 +3159,21 @@ OpnVidDeflt MOVE.L A0,A2 ; save A0 CMP.W #DrSwApple,spDrvrSW(A0) ; does it have an Apple driver interface (software only)? BNE.S @Error ; -> no, keep on searching - BSR.S RdVidParam ; a video sRsrc was found, so read the video parameters - BNE.S @Error ; -> error during the read - BSR OpensDrvr ; open the video driver BNE.S @Error ; -> couldn't do it + MOVE $18(A1), -(SP) + BSR RdVidParam ; a video sRsrc was found, so read the video parameters + TST D0 + BNE.S @Error ; -> error during the read + BSR InitVidDeflt ; initialize the default video device @Error RTS ;________________________________________________________________________________________ ; -; Routine: RdVidParam +; Routine: RdVidParam c42 ; ; Inputs: A0 - pointer to Slot Manager parameter block ; A1 - pointer to ioParamBlock @@ -3629,7 +3186,8 @@ OpnVidDeflt MOVE.L A0,A2 ; save A0 ; then saved in low memory as needed. ;________________________________________________________________________________________ -RdVidParam MOVEM.L A1-A2/D3,-(SP) +RdVidParam LINK A6, #-$94 + MOVEM.L A0-A2/D3,-(SP) MOVE.B spId(A0),D3 ; save the ID CLR.B spExtDev(A0) ; no external devices @@ -3651,6 +3209,7 @@ RdVidParam MOVEM.L A1-A2/D3,-(SP) @gotBase MOVE.L spResult(A0),ScreenBytes ; save it MOVE.B D3,spId(A0) ; restore the sRsrc ID + MOVE $18(A1), -(SP) BSR GetDefVidMode ; get the default video mode MOVE.B D0,spId(A0) ; and save it @@ -3686,9 +3245,9 @@ RdVidParam MOVEM.L A1-A2/D3,-(SP) MOVEQ #0,D0 ; no errors @End MOVE.B D3,spId(A0) ; restore ID for caller - MOVEM.L (SP)+,A1-A2/D3 - TST.W D0 - RTS + MOVEM.L (SP)+,A0-A2/D3 + UNLK A6 + RTD #2 @Error MOVEQ #1,D0 ; bad video card (woof) BRA.S @End @@ -3696,7 +3255,7 @@ RdVidParam MOVEM.L A1-A2/D3,-(SP) ;________________________________________________________________________________________ ; -; Routine: OpensDrvr +; Routine: OpensDrvr d0a ; ; Inputs: A0 - pointer to Slot Manager parameter block ; A1 - pointer to ioParamBlock @@ -3755,34 +3314,76 @@ OpensDrvr MOVE.L A2,-(SP) ;________________________________________________________________________________________ InitVidDeflt - MOVEM.L D1-D2/A0-A1,-(SP) ; save all registers - CLR.L -(SP) ; make room for GDevice handle - MOVE ioRefNum(A1),-(SP) ; push the device's refNum - - BSR.S GetDefVidMode ; get the default video mode - MOVE.L D0,-(SP) ; and push it - - _NewGDevice ; allocate a new GDevice (in the system heap) - ;strips refNum and video mode - MOVE.L (SP)+,A0 ;save current device in A0 - -; install default video card as primary display device - - MOVE.L A0,TheGDevice ; make this the default destination - MOVE.L A0,DeviceList ; make this device head of list - MOVE.L A0,MainDevice ; make it the main device - MOVE.L A0,SrcDevice ; make it the default source for copyBits - MOVE.L A0,CrsrDevice ; make it the one owning the cursor - MOVE.L (A0),A1 ; point to this device - ORI.W #$B800,GDFlags(A1) ; set flags: ScrnActive,MainScrn,ScreenDevice,Allinit + MOVEM.L D1-D2/A0-A3,-(SP) ; save all registers + SubQ #$4, A7 + MoveA.L A7, A2 + Move $18(A1), -(A7) + Bsr GetDefVidMode + Move.L ($1FB8), -(A7) + MoveA.L ($2b6), A3 + MoveA.L $1E0(A3), A3 + Move.L $C(A3), -(A7) + Lea.L InitVidDeflt_RTS, A3 + Move.L A3, ($1FB8) + Move.L A3, (12) + SubQ #$4, A7 + MoveA.L A7, A3 + SubQ #$2, A7 + Move.L A3, -(A7) + Move $18(A1), -(A7) + Move.L D0, -(A7) + Clr.L -(A7) + Clr.L -(A7) + Clr.L -(A7) + Clr.L -(A7) + Move #$D23, D0 + _DisplayDispatch + Move (A7)+, D0 + MoveA.L (A7)+, A3 + Tst D0 + BNE.B @skip + SubQ #$2, A7 + Move.L A3, -(A7) + Move.L A2, -(A7) + Clr.B -(A7) + Move #$51F, D0 + _DisplayDispatch + Tst (A7)+ + BNE.B @skip + SubQ #$2, A7 + Move.L A3, -(A7) + Clr.L -(A7) + Move #$40B, D0 + _DisplayDispatch + Tst (A7)+ + BNE.B @skip + SubQ #$2, A7 + Move.L (A2), -(A7) + Move.L A2, -(A7) + Clr.B -(A7) + Move #$520, D0 + _DisplayDispatch + Tst (A7)+ + BNE.B @skip + MoveA.L (A2), A0 +@skip + MoveA.L ($2b6), A3 + MoveA.L $1E0(A3), A3 + Move.L (A7)+, $C(A3) + Move.L (A7)+, ($1FB8) + AddQ #$4, A7 BSR InitDefGamma ; initialize gamma correction for this device - MOVEM.L (SP)+,D1-D2/A0-A1 ;restore all registers + MOVEM.L (SP)+,D1-D2/A0-A3 ;restore all registers MOVEQ #0,D0 ;no error RTS +InitVidDeflt_RTS + RTS + + ;________________________________________________________________________________________ ; ; Routine: GetDefVidMode @@ -3797,14 +3398,15 @@ InitVidDeflt ;________________________________________________________________________________________ GetDefVidMode + LINK A6, #-$58 + MOVE.L spsPointer(A0),-(SP) ; save the sPointer, MOVE.B spId(A0),-(SP) ; the id, - MOVE.L A1,-(SP) ; and registers + MOVEM.L A1-A2,-(SP) ; and registers - LEA -SizesPRAMRec(SP),SP ; make room for parameter RAM info - MOVE.L SP,A1 ; and point to it + LEA -SizesPRAMRec*3(A6),A1 ; make room for parameter RAM info + MOVE.L A1,(A0) ; and point to it - MOVE.L A1,spResult(A0) ; pass the pointer to the buffer _SReadPRAMRec ; get parameter RAM record BNE.S @OneBit ; -> it's invalid, so default to one bit mode @@ -3819,11 +3421,11 @@ GetDefVidMode MOVEQ #0,D0 MOVE.B 2(A1),D0 ; get the default mode -@ValidMode LEA SizesPRAMRec(SP),SP ; clean up the stack - MOVE.L (SP)+,A1 ; restore registers, +@ValidMode MOVEM.L (SP)+,A1-A2 ; restore registers, MOVE.B (SP)+,spId(A0) ; the id, MOVE.L (SP)+,spsPointer(A0) ; and the sPointer - RTS + UNLK A6 + RTD #2 @OneBit MOVE.B #OneBitMode,2(A1) ; Set default to OneBitMode MOVE.L A1,spsPointer(A0) ; Pass pointer to buffer @@ -3834,7 +3436,7 @@ GetDefVidMode ;________________________________________________________________________________________ ; -; Routine: InitDefGamma +; Routine: InitDefGamma e64 ; ; Inputs: A0 - handle to GDevice ; @@ -3952,9 +3554,17 @@ InitDefGamma BRA.S @SetIt ; set it +InitDummyScreenWrapper ; f52 + MOVE.L (DeviceList), D0 + BEQ.B InitDummyScreen + CMPI.L #$FFFFFFFF, D0 + BEQ.B InitDummyScreen + RTS + + ;________________________________________________________________________________________ ; -; Routine: InitDummyScreen +; Routine: InitDummyScreen f62 ; ; Inputs: none ; Outputs: none @@ -4048,7 +3658,7 @@ InitDummyScreen ;________________________________________________________________________________________ ; -; Routine: AddVidDevice +; Routine: AddVidDevice 101c ; ; Inputs: A0 - pointer to Slot Manager parameter block ; A1 - pointer to ioParamBlock @@ -4081,6 +3691,7 @@ AddVidDevice MOVE ioRefNum(A1),-(SP) ; push the device's refNum BSR.S GetDefVidMode ; D0 <- the default video mode + MOVE $18(A1), -(SP) MOVE.L D0,-(SP) ; Push it _NewGDevice ; allocate a new GrafDevice (in system heap) @@ -4109,7 +3720,7 @@ AddVidDevice ;________________________________________________________________________________________ ; -; Routine: InitSCC +; Routine: InitSCC 1066 ; ; Inputs: none ; Outputs: none @@ -4130,6 +3741,10 @@ InitSCC bsr.l SCCIOPHwInit ; initialize the IOP hardware registers @NoIOP ; fall thru -- IOP boots in bypass mode ENDIF + + btst.b #3, ($DD3) + beq.b @dontInitSCC + movea.l SCCWr,a0 ; point to SCC base write address (chan B) movea.l SCCRd,a1 ; point to SCC base read address (chan B) tst.b (a1) ; synchronize SCC accesses @@ -4141,90 +3756,7 @@ InitSCC ;________________________________________________________________________________________ ; -; Routine: InitIWM -; -; Inputs: none -; Outputs: none -; Trashes: D0, D2, A0 -; -; Function: initializes the IWM/SWIM/SWIM2 floppy disk controller -;________________________________________________________________________________________ - -InitIWM TestFor IWMExists ; see if we really have an IWM - beq ExitInitIWM ; if not, nothing to init - - MOVEA.L IWM,A0 ; get floppy controller base address - -InitSWIM2 MOVE.L BusErrVct,-(SP) ; save the old bus error vector
- PEA @Resume ; and point it to ours
- MOVE.L (SP)+,BusErrVct ;
- MOVE.L SP,D2 ; save the stack pointer in case we bus error
- - MOVEQ #noDriveErr,D0 ; assume the chip isn't there
- TST.B q6L|rPhase(A0) ; access the chip (may bus error!)
- MOVEQ #noErr,D0 ; if we got here, the chip may be connected
- -@Resume MOVEA.L D2,SP ; trash the exception frame if we bus errored
- MOVE.L (SP)+,BusErrVct ; restore the previous bus error vector
- TST.W D0 ; set the CCR
- BNE ExitInitIWM ; -> IWM/SWIM/SWIM2 is not currently connected
- -; If we got here, at least we didn't bus error. That doesn't mean we really have -; a IWM/SWIM, though, so lets do some more checking... - - MOVE.B #$F8,wZeroes(A0) ; try to switch to the IWM register set - IF nonSerializedIO THEN ; - nop ; allow write to complete - ENDIF - MOVEQ #$F5-256,D2 ; - MOVE.B D2,wPhase(A0) ; write a value to the phase register - IF nonSerializedIO THEN ; - nop ; allow write to complete - ENDIF - MOVE.B D0,rPhase(A0) ; drive the bus in case the chip's not there - IF nonSerializedIO THEN ; - nop ; allow write to complete - ENDIF - CMP.B rPhase(A0),D2 ; did we get back what was originally written? - BEQ.S ExitInitIWM ; -> yes, we've got a SWIM2 - -; At this point, we know we don't have a SWIM2 connected. We either have an IWM/SWIM or no chip... - -@NotSWIM2 TST.B q7L(A0) ; select "Read Handshake" - TST.B q6L(A0) ; - MOVE.B D0,q7H(A0) ; - MOVEQ #%00111111,D2 ; mask to just the low 6 bits - AND.B q6L(A0),D2 ; and read the register - TST.B q7L(A0) ; back into a read mode - CMPI.B #%00111111,D2 ; did we get what we expected? - BNE.S ExitInitIWM ; -> no, it's isn't IWM or SWIM - - MOVEQ #IWMInitMode,D0 ; initial mode setting -@1 MOVE.B #$BE,wZeroes(A0) ; disable enabled if in ISM mode - MOVE.B #$F8,wZeroes(A0) ; switch SWIM to the IWM register set - TST.B Q7L(A0) ; and get out of write mode - TST.B MtrOff(A0) ; change the IWM mode now - TST.B Q6H(A0) ; set IWM to sense state - MOVE.B Q7L(A0),D2 ; sense the mode register - BTST #5,D2 ; no disks should be enabled - BNE.S @1 ; keep waiting - - AND.B D0,D2 ; see if low bits match mode we want - CMP.B D0,D2 - BEQ.S @2 ; if so, we are done - - MOVE.B D0,Q7H(A0) ; set to twiggy mode - TST.B Q7L(A0) ; set IWM back to sense state - BRA.S @1 ; loop back just to check - -@2 TST.B Q6L(A0) ; and back to read mode - -ExitInitIWM RTS - - -;________________________________________________________________________________________ -; -; Routine: InstallDriver +; Routine: InstallDriver 1082 ; ; Inputs: A1 - pointer to driver name string (pascal) ; D2 - driver's resource ID @@ -4250,7 +3782,7 @@ InstallDriver move.l UTableBase,a0 ; point to utable array move.l (a0,d1),a0 ; get handle to dce in a3 move.l (a0),a0 ; get pointer to dce - move.l a1,dCtlDriver(a0) ; load driver + move.l (a1),dCtlDriver(a0) ; load driver move.l (a1),a1 ; get pointer to driver move.w drvrFlags(a1),dCtlFlags(a0) ; copy data to dce @@ -4258,7 +3790,9 @@ InstallDriver move.w drvrEMask(a1),dCtlEMask(a0) move.w drvrMenu(a1),dCtlMenu(a0) - bset.b #dNeedLock,dCtlFlags+1(a0) ; set the handle bit + bclr.b #dNeedLock,dCtlFlags+1(a0) ; set the handle bit + cmpi.l #'only', $4(sp) + beq.b @exit @openDrvr move.l a2,a1 ; load pointer to driver name bra.s OpenDRVR ; open the driver (a1/) @@ -4271,7 +3805,7 @@ InstallDriver ;________________________________________________________________________________________ ; -; Routine: GetDetachDrvr, GetDetachRes +; Routine: GetDetachDrvr 10ce, GetDetachRes 10d4 ; ; Inputs: D1 - resource type (GetDetachRes) ; D2 - driver's resource ID @@ -4305,7 +3839,7 @@ GetDetachRes ;________________________________________________________________________________________ ; -; Routine: FirstEntryFree +; Routine: FirstEntryFree 10f2 ; ; Inputs: none ; @@ -4339,7 +3873,7 @@ FirstEntryFree ;________________________________________________________________________________________ ; -; Routine: OpenDRVR +; Routine: OpenDRVR 1112 ; ; Inputs: A1 - pointer to driver name string (pascal) ; @@ -4367,7 +3901,7 @@ OpenDRVR LEA -ioQElSize(SP),SP ; Allocate IO stack frame IF hasEgret THEN ;________________________________________________________________________________________ ; -; Routine: CheckForEgretOrCuda +; Routine: CheckForEgretOrCuda 1132 ; ; Inputs: none ; @@ -4391,126 +3925,66 @@ CheckForEgretOrCuda ; ENDIF -;___________________________________________________________________________ -; CheckForTV: Checks for the Cmd-Option-T-V keys down, and if so, set -; the PRAM bit that specifies we do that and Re-Boot -; -; Destroys A0-A1/D0/D1. -;___________________________________________________________________________ - WITH spBlock,SP_Params -CheckForTV - lea @TVKeys,a1 ; keys to check for - lea KeyMap,a0 ; compare to the Key Down Map - moveq.l #4-1,d0 ; compare loop count -@loop cmpm.l (a0)+,(a1)+ ; check for exactly this combo - dbne d0,@loop ; examine the entire key map - beq.s @tvmatch ; if equal, reset PRAM - rts ; otherwise, just return - -@tvmatch SUBA #spBlockSize,SP ; make an slot parameter block on stack - MOVE.L SP,A0 ; get pointer to parm block now - MOVE.B #0,spSlot(A0) ; put slot in pBlock - CLR.B spExtDev(A0) ; external device = 0 - -; Read the slot pRAM to determine what the currently saved mode is. -; The flag are in SP_FLAGS, which are in VendorUse5 byte. - - SUBA #SizesPRAMRec,SP ; allocate block for pRAM record - MOVE.L SP,spResult(A0) ; point to it - _sReadPRAMRec ; read it - Bne @ErrorReturn ; should not fail, but if so... - Move.b SP_Flags(SP),D0 ; Get the current flags - Bset #spCompOut,D0 ; Set it, which means to enable - Move.b D0,SP_Flags(SP) ; write out the sp_flags byte - MOVE.L SP,spsPointer(A0) ; set up parameter block - _sPutPRAMRec ; write the new record out - Bne @ErrorReturn ; any errors? - Adda #SizesPRAMRec+spBlockSize,SP; Deallocate buffer and - jmp Start -@ErrorReturn - Adda #SizesPRAMRec+spBlockSize,SP; Deallocate buffer and - rts - -@TVKeys dc.l $00020200 ; V, T - dc.l $00008004 ; Cmd, Opt - dc.l $00000000 - dc.l $00000000 - ENDWITH - -;________________________________________________________________________________________ -; -; Routine: DynamicBoxFlag -; -; Inputs: D7.w BoxFlag from the Universal tabke -; -; Outputs: D7.w Adjusted BoxFlag for this machine -; -; Trashes: D0-D1, A0-A1 -; -; Function: Calculates the boxflag based on box type and CPU clock rates. -; Look Ma! We have only one Universal table entry per family! -; -;________________________________________________________________________________________ - -DynamicBoxFlag - TestFor HMCDecoder ; do we have an HMC decoder? - beq.s @rts ; -> Nope, just use the boxflag from the uTables. - - MOVEM.L D0-D6/A0-A4/A6,-(SP) ; save Universal info -; CMPI.B #boxPDMEvt1,D7 ; Is this an Evt1? ; removing evt1 suprt -; BEQ.S @Done ; -> Yes, never muck with the boxflag ; - - BigBSR6 GetCPUIDReg ; Get the CPU id - BNE.S @Done ; -> Failed (can't happen) - - AND.W #%00000011,D0 ; Just look at bits 0 & 1 - - MOVE.L ([ProcessorInfoPtr],\ - ProcessorInfo.CPUClockRateHz),D1 ; Get the CPU clock rate - - MOVEQ #-1,D2 ; Clear the counter - LEA @SpeedTable,A0 ; Point to the list of clock rates -@Lupe CMP.L (A0)+,D1 ; Is the bus clock rate less than the entry? - BLS.S @GotIt ; -> Yes, go with the current delay factor - ADDQ #1,D2 - BRA.S @Lupe - -@GotIt LSL.W #2,D0 ; Mult the box bit by the size of the table - LEA (@BoxTable,D0),A0 - MOVE.B (A0,D2),D7 ; Get the boxflag - -@Done MOVEM.L (SP)+,D0-D6/A0-A4/A6 ; save Universal info -@rts RTS ; Return - -@SpeedTable ; PDM CPU clock rate mapping table - DC.L 10000000 ; 50.001 MHz - DC.L 60000000 ; 66.001 MHz - DC.L 73000000 ; 80.001 MHz - DC.L 100000000 ; 100.001 MHz - DC.L -1 ; end of table - -@BoxTable EQU * -@WLCDboxes DC.B boxPDM50WLCD ; QFC - DC.B boxPDM66WLCD - DC.B boxPDM80WLCD - DC.B boxPDM - -@notboxes DC.B boxPDM50WLCD ; QFC (wlcd post evt1) - DC.B boxPDM66WLCD - DC.B boxPDM80WLCD - DC.B boxPDM - -@shitboxes DC.B boxPDM50L ; Lego - DC.B boxPDM66L - DC.B boxPDM80L - DC.B boxPDM - -@FridgBoxes DC.B boxPDM ; Fridge - DC.B boxPDM66F - DC.B boxPDM80F - DC.B boxPDM100F - - ENDPROC ; {MyROM} - END +NewStartInitFunc +; 1148 + SubQ.L #$2, A7 + MoveA.L A7, A0 + Move.L #$20002, D0 + _ReadXPRam + Move (A7), D0 + AndI #$808, D0 + CmpI #$808, D0 + BEQ.B @skipwrite + Move #$4F48, (A7) + MoveA.L A7, A0 + Move.L #$20002, D0 + _WriteXPRam +@skipwrite + Move (A7)+, D0 + LsR #$8, D0 + AndI #$7, D0 + MoveQ.L #$1, D1 + LsL.B D0, D1 + Move.B D1, (SCSIDrvrs) + Rts + + + + +FiddleWithEmulator +; 1180 + Move.L #'ppcf', D0 + _Gestalt + BNE.B @done + Move.L A0, D0 + AndI.L #$10, D0 + BEQ.B @done + Move.L #$2000, D0 + _NewPtrSysClear + BNE.B @done + Lea.L ($68FFF000).L, A2 + Move.L A0, D0 + AddI.L #$FFF, D0 + AndI.L #$FFFFF000, D0 + Move.L D0, $E0(A2) + Move.L #$FE000000, $E8(A2) + Clr.L $EC(A2) + + MoveA.L D0, A0 + MoveA #$1000, A1 + MoveQ.L #$2, D0 + _MemoryDispatch + + import GETREALPROC + bsr.l GETREALPROC + BMI.B @done + Move.L A0, $E4(A2) +@done + Rts + + + + align 16 + end \ No newline at end of file diff --git a/OS/StartMgr/StartMgr.make b/OS/StartMgr/StartMgr.make index 2b8f9b3..767ffa7 100644 --- a/OS/StartMgr/StartMgr.make +++ b/OS/StartMgr/StartMgr.make @@ -27,7 +27,9 @@ StartMgrObjs = "{ObjDir}StartTop.a.o" ¶ "{ObjDir}StartInit.a.o" ¶ + "{ObjDir}StartInterstix.c.o" ¶ "{ObjDir}StartSearch.a.o" ¶ + "{ObjDir}StartLibGlue.c.o" ¶ "{ObjDir}StartBoot.a.o" ¶ "{ObjDir}StartFail.a.o" ¶ "{ObjDir}StartErr.a.o" ¶ diff --git a/OS/StartMgr/StartSearch.a b/OS/StartMgr/StartSearch.a index d912866..255d654 100644 --- a/OS/StartMgr/StartSearch.a +++ b/OS/StartMgr/StartSearch.a @@ -180,7 +180,7 @@ NumFlashX EQU 3 ; number of times to flash X before going FloppyRefNum EQU -5 ; floppy driver refnum IntHDRefNum EQU -33 ; refnum of driver for SCSI ID 0 -DefaultTimeOut EQU 20 ; number of seconds timeout if PRAM is pristine +DefaultTimeOut EQU 25 ; number of seconds timeout if PRAM is pristine MaxTimeOut EQU 31 ; maximum number of seconds allowed as timeout PollDelay EQU 15 ; delay (in ticks) between poll drive SCSILoads @@ -211,7 +211,7 @@ Locals RECORD {link},INCR frameSize equ * flashTime ds.l 1 ; time to flash icon -startTicks ds.l 1 ; Ticks when we first get into FindStartupDevice +startTicks ds.l 1 ; Ticks when we first get into FindStartupDevice ; 8 lower ckPartition ds.b 1 ; flag = we need to check to see if the partition #s match noDefaultDrive ds.b 1 ; flag = we have no default drive @@ -220,7 +220,7 @@ forcedBoot ds.b 1 ; flag = boot has been forced to a non-default device csPB ds CntrlParam ; pb for Control and Status -pmCommandPB ds pmCommandRec ; pb for sending SleepReq to power manager +pmCommandPB ds pmCommandRec ; pb for sending SleepReq to power manager ; 8 lower startPRAM ;(ds.l 1) lsdExtDevID ds.b 1 ; slot device ExtDevID (for SCSI target/lun) @@ -229,6 +229,8 @@ lsdRefNum ;(ds.w 1) ; SCSI device refnum lsdSlotNum ds.b 1 ; slot number lsdSRsrcID ds.b 1 ; sRsrc ID (for native SCSI, bus #; for plug-in, sRsrc ID) + ds.b 8 + link ds.l 1 ; old A4 = (A4) ENDR @@ -245,9 +247,10 @@ A4_locals EQU A4 A5_bootGlobs EQU A5 A6_bootBlocks EQU A6 + ;________________________________________________________________________________________ ; -; Routine: FindStartupDevice +; Routine: FindStartupDevice 3600 ; ; Inputs: none ; @@ -276,11 +279,19 @@ FindStartupDevice PROC EXPORT BSR LoadSlotDrivers ; Default is a slot device, execute boot code ; When booting a Mac OS, execution will continue here + MOVEQ.L #0, D7 MOVE.L Ticks, startTicks(A4) ; Init the time we got here in case we have PowerMgr BSR LoadSCSIDrivers ; Load all the drivers we can BSR WaitForPollDrive ; Wait until the boot drive has warmed up - BRA.S @FirstEntry ; First time through: keep original goal + + CLR.B -6(A4) + + BSR LoadATADrivers + + BSR OpenLANDiskDriver + + BRA @FirstEntry ; First time through: keep original goal @NextPass IF hasPwrControls THEN ; @@ -294,7 +305,7 @@ FindStartupDevice PROC EXPORT BLS.S @nosleep @sleepnow LEA pmCommandPB(A4), A0 ; A0 gets pointer to parameter block - MOVE.W #SleepReq, pmCommand(A0) ; PMGR command, Go to sleep + MOVE.W #PmgrPWRoff, pmCommand(A0) MOVE.W #4, pmLength(A0) ; Four bytes of data to send LEA pmData(A0), A1 MOVE.L A1, pmSBuffer(A0) ; pointer to send buffer @@ -307,16 +318,48 @@ FindStartupDevice PROC EXPORT ENDWITH ENDIF ; - CMPI.W #FloppyRefNum,D4 ; do we have floppy set as the default? - BEQ.S @NoChange ; -> yes, keep looking for floppies - LEA IsItAnything,A3 ; no, from now on, any device will do -@NoChange + + Move.L D7, D7 + BNE.B @twenty_six + SubA.L A0, A0 + _InternalWait + BNE.B @skip_blah + MoveQ.L #$19, D0 +@skip_blah + MulU #$3C, D0 + Add.L -$56(A4), D0 + Cmp.L (Ticks), D0 + BCS.B @twenty_six + MoveQ.L #$F, D0 + Add.L (Ticks), D0 +@before_cmp + Cmp.L (Ticks), D0 + BCC.B @before_cmp + Bra.B @after_less_stuff +@twenty_six + MoveQ.L #$1, D7 + Lea.L IsItAnything, A3 +@after_less_stuff + IMPORT ATAMgr_5d940 + Bsr.L ATAMgr_5d940 +@after_stuff + + BSR LoadSCSIDrivers ; load more drivers if we can + BSR OpenLANDiskDriver @TryAgain BSR VisualUpdate ; Update dynamic user feedback + IMPORT PMIDLERELATEDDRIVERCALL + BSR.L PMIDLERELATEDDRIVERCALL + IMPORT INTERC_2750 + BSR.L INTERC_2750 + + @FirstEntry + BSR DaFuq + BSR FindNextCandidate ; Find the next potential Startup Device. BEQ.S @NextPass ; Branch if we're at the end of the queue. @@ -351,7 +394,7 @@ FindStartupDevice PROC EXPORT ;________________________________________________________________________________________ ; -; Routine: EmbarkOnSearch +; Routine: EmbarkOnSearch 36f2 ; ; Inputs: none ; @@ -381,6 +424,7 @@ EmbarkOnSearch SUBQ.W #4,SP ; make room for parameters on the stack MOVE.L SP,A0 ; and point to them _GetDefaultStartup ; get info about the default device + CLR -4(A4) MOVE.L (SP), startPRAM(A4) ; store for later partition check MOVE.W (SP)+,D3 ; D3.L = MOVE.W (SP)+,D4 ; get the driver's refNum/ @@ -413,19 +457,8 @@ EmbarkOnSearch SUBA.L A2,A2 ; initialize the drive queue pointer - LEA IsItFloppyOrDefault,A3 ; ASSUME match default or floppy devices. + LEA IsItDefault,A3 - CASE OBJ - IMPORT Ck4OnlyLoadFromDefault ; :SCSIMgr4pt3:BootItt.a - BSR.L Ck4OnlyLoadFromDefault ; supposed to limit our search to default device? - CASE OFF - BEQ.S @ck4NoDefault - LEA IsItDefault, A3 ; match only default device -@ck4NoDefault - TST.B noDefaultDrive(A4) ; is there a default drive? - BEQ.S @HaveDefault ; -> yes - LEA IsItAnything,A3 ; no, match any device -@HaveDefault MOVE.L Ticks,flashTime(A4) ; let flash time expire immediately. CLR.W D6 ; clear visual state information. @@ -453,9 +486,8 @@ EmbarkOnSearch move.w D4, D1 ; get refNum (maybe) not.w D1 ; convert refNum to unit number sub.w #$20, D1 ; convert to SCSI ID - blt.s @exit ; out of range -> use previous value cmpi.w #$07, D1 - bgt.s @exit ; out of range -> use previous value + bhi.s @exit ; out of range -> use previous value move.b SCSIPoll, D0 and.b #$F8, D0 ; strip out old internal HD SCSI ID @@ -468,7 +500,7 @@ EmbarkOnSearch ;________________________________________________________________________________________ ; -; Routine: LoadSlotDrivers +; Routine: LoadSlotDrivers 377e ; ; Inputs: D3 - bits 31-24: -reserved- ; 23-16: default OS @@ -548,7 +580,7 @@ LoadSlotDrivers ;________________________________________________________________________________________ ; -; Routine: LoadSCSIDrivers +; Routine: LoadSCSIDrivers 37ee ; ; Inputs: D3 - bits 31-24: -reserved- ; 23-16: default OS @@ -569,9 +601,7 @@ LoadSlotDrivers LoadSCSIDrivers IF hasAsyncSCSI THEN - BSR.L ISITT ; check if we're running SCSI 4.3 - TST.B D0 ; are we? - BEQ.S @UseOldSCSI ; -> no, use the old code to load drivers + CLR.B forcedBoot(A4) PEA forcedBoot(A4) ; ptr to flag indicating a forcedBoot CLR.L -(SP) ; load all drivers @@ -589,31 +619,104 @@ LoadSCSIDrivers RTS @UseOldSCSI ENDIF - -; there is a new mechanism to disable loading of poll drive, so, check power -; user command, "command, shift, option and delete keys", if those keys are -; not down, go load the poll drive. -; Make sure that command, shift, option and delete keys are not down - MOVEQ #-1,D0 ; try to load all SCSI devices - CMPI.W #CmdShiftOptDel,KeyMap+6 ; are command, shift, option and delete keys down? - BNE.S @GoLoadD ; -> no, continue - MOVEQ #$07,D1 - AND.B SCSIPoll,D1 ; get the SCSI ID of the poll drive - BCLR D1,D0 ; and clear the bit in the available drive list -@GOLoadD move.l d6,-(sp) ; save d6 pdw - move.l a0,-(sp) ; save a0 - moveq.l #0, D6 ; allow drivers to munge heap pdw - BSR.L SCSILoad ; try to load driver(s) from disk - move.l (sp)+,a0 ; restore a0 - move.l (sp)+,d6 ; restore d6 pdw - RTS + + +LoadATADrivers + BTst.B #$7, ($B23) + BEQ @L3 + MoveM.L D1-D7/A0-A6, -(A7) + Move D4, -$8(A4) + Move.L -$C(A4), D5 + Move.L #$FF, D2 + Move.L D5, D1 + AndI #$F800, D1 + CmpI #$2000, D1 + BEQ.B @L0 + AndI.L #$FFFF00FF, D3 + CmpI #$FFCA, D5 + BEQ.B @L0 + Bra.B @L2 +@L0 _DisableDynWait + _GetTimeOut + BNE.B @L1 + MoveQ.L #$19, D0 +@L1 Move.L D0, -(A7) + MoveQ.L #$0, D0 + Move.B -$9(A4), D0 + LsL #$8, D0 + Move.B -$C(A4), D0 + Move.L D0, -(A7) + IMPORT ATAMgr_5d9b0 + BSR.L ATAMgr_5d9b0 + AddQ #$8, A7 + CmpI #$0, D0 + BEQ.B @L2 + Move D0, -$8(A4) + IMPORT ATAMgr_5d940 +@L2 BSR.L ATAMgr_5d940 + MoveM.L (A7)+, D1-D7/A0-A6 + Move -$8(A4), D4 +@L3 Rts + + + +PostATA + MoveM.L D0-D3/A0-A2, -(A7) + MoveA.L ([$2B6],$288), A2 + + Move.L A2, D0 + BEQ.B @return + Move $6(A2), D1 + MoveQ.L #$0, D2 + +@loop MoveA.L $14(A2,D2.L), A1 + Move.L A1, D0 + BEQ.B @return + Move $C8(A1), D0 + + Clr D3 + Cmp D3, D0 + BEQ.B @skip + MoveA.L $C4(A1), A0 + Move.L A0, D0 + BEQ.B @return + Jsr (A0) + Bra.B @return + +@skip AddQ #$4, D2 + SubQ #$1, D1 + BNE.B @loop + +@return MoveM.L (A7)+, D0-D3/A0-A2 + Rts + + + +OpenLANDiskDriver + Lea.L @DriverName, A1 + Lea.L -$32(A7), A7 + MoveA.L A7, A0 + Move.L A1, $12(A0) + DC.W $A000 + Tst D0 + BNE.B @L7 + Move $18(A0), D4 +@L7 Lea.L $32(A7), A7 + Rts + + STRING Pascal +@DriverName DC.B '.LANDisk' + ALIGN 2 + + + ;________________________________________________________________________________________ ; -; Routine: WaitForPollDrive +; Routine: WaitForPollDrive 38f0 ; ; Inputs: none ; @@ -655,9 +758,7 @@ WaitForPollDrive @WaitForIt IF hasAsyncSCSI THEN - BSR.L ISITT ; check if we're running SCSI 4.3 - TST.B D0 ; are we? - BEQ.S @UseOldSCSI ; -> no, use the old code to load drivers + CLR.B forcedBoot(A4) PEA forcedBoot(A4) ; ptr to flag indicating a forcedBoot PEA 1 ; only look for the startup device BSR.L ITTBOOT ; get the startup device's refnum in D0 @@ -676,47 +777,7 @@ WaitForPollDrive @UseOldSCSI ENDIF -; make sure that command, shift, option and delete keys are not down - - MOVE.W KeyMap+6,D0 ; get keys down - CMP.W #CmdShiftOptDel,D0 ; are command, shift, option and delete keys down? - BEQ.S @RawExit ; -> exit if so - - MOVEQ #$07,D1 - AND.B SCSIPoll,D1 ; Get SCSI ID of poll drive - MOVEQ #0,D0 ; Clear register - BSET D1,D0 ; Set the bit for the drive - -; Call SCSILoad with bit map in D0 and heap_munge_flag in D6 - - move.l d6,-(sp) ; save d6 pdw - move.l a0,-(sp) ; save a0 - moveq.l #0, D6 ; allow drivers to munge heap pdw - BSR.L SCSILoad ; Try to load driver for poll disk - move.l (sp)+,a0 ; restore a0 - move.l (sp)+,d6 ; restore d6 pdw - BEQ.S @MyExit ; Branch if warmed up, but driver is invalid - - MOVEQ #IntHDRefNum,D0 ; Refnum for ID 0 - SUB.W SCSIPoll,D0 ; Convert to refnum for poll drive - MOVE.W D0,D1 ; Put back in D1 for comparison - - -; Let's see if the poll hard disk is actually in the queue -@ExamDQ SUBA.L A2,A2 ; Start at beginning of drive queue -@FindIntHD - BSR NextDQEntry ; Get the next drive queue entry - BEQ.S @EndOfQueue ; Branch if we're out of queue entries - - CMP.W dqRefNum(A2),D1 ; Is it our trusty poll hard disk? - - BNE.S @FindIntHD ; Nope, see if the next one's it - -@Warm_n_Toasty ; We found the drive; it must have warmed up - BRA.S @MyExit ; That's all folks - @ckTimeout -@EndOfQueue CMP.L Ticks,D5 ; Should the poll HD be visible by now? BLO.S @NoDrivePresent ; Yes, so quit waiting for it MOVEQ.L #PollDelay,D0 ; Get number of ticks to wait before retrying @@ -739,7 +800,7 @@ WaitForPollDrive ;________________________________________________________________________________________ ; -; Routine: FindNextCandidate +; Routine: FindNextCandidate 3966 ; ; Inputs: A2 - Points to the drive queue entry which was tried last time; the search ; for an appropriate device will begin with the NEXT drive queue entry. @@ -786,7 +847,7 @@ FindNextCandidate ;________________________________________________________________________________________ ; -; Routine: NextDQEntry +; Routine: NextDQEntry 3996 ; ; Inputs: A2 - points to the drive queue entry which was tried last time (nil if ; at the end of the queue) @@ -810,7 +871,7 @@ NextDQEntry MOVE.L A2,D0 ; is the pointer NIL? ;________________________________________________________________________________________ ; -; Routine: SelectDevice +; Routine: SelectDevice 39a4 ; ; Inputs: A2 - points to the current drive queue entry ; @@ -839,7 +900,7 @@ SelectDevice ;________________________________________________________________________________________ ; -; Routine: CheckMouseEject +; Routine: CheckMouseEject 39c2 ; ; Inputs: A0 - pointer to A6-based I/O parameter block ; @@ -857,7 +918,7 @@ CheckMouseEject ;________________________________________________________________________________________ ; -; Routine: EjectMe +; Routine: EjectMe 39c8 ; ; Inputs: A0 - pointer to A6-based I/O parameter block ; @@ -876,7 +937,7 @@ DontEject RTS ; Return with status ;________________________________________________________________________________________ ; -; Routine: GetStartupInfo +; Routine: GetStartupInfo 39d6 ; ; Inputs: A0 - pointer to A6-based I/O parameter block ; A6 - pointer to buffer for holding the boot blocks @@ -904,7 +965,7 @@ GetStartupInfo ;________________________________________________________________________________________ ; -; Routine: ReactToFailure +; Routine: ReactToFailure 3a00 ; ; Inputs: D0 - error code indicating what went wrong ; D4 - default device's driver reference number @@ -941,7 +1002,7 @@ ReactToFailure ;________________________________________________________________________________________ ; -; Routine: Ck4SupportsPartition +; Routine: Ck4SupportsPartition 3a30 ; ; Inputs: A2 - pointer to the current drive queue entry (must not be nil!) ; D4 - default device's driver reference number @@ -969,6 +1030,7 @@ Ck4SupportsPartition ; now check this driver to see if it "follows new rules" and responds ; to driverGestalt status call ; + move.l (A0), A0 move.w dCtlFlags(A0), D0 ; does it Follow New Rules? btst #FollowsNewRules, D0 ; (word-relative bit #) beq.s @notSupported ; no -> skip driverGestalt call @@ -997,7 +1059,7 @@ Ck4SupportsPartition ;________________________________________________________________________________________ ; -; Routine: IsItDefault +; Routine: IsItDefault 3a8e ; ; Inputs: A2 - pointer to the current drive queue entry (must not be nil!) ; D4 - default device's driver reference number @@ -1010,9 +1072,29 @@ Ck4SupportsPartition ;________________________________________________________________________________________ IsItDefault + tst -4(A4) + bne.s @skipsomestuff + + pea.l -4(A4) + import StartLib_GetStartupDevice + jsr StartLib_GetStartupDevice + lea.l $4(SP), SP + tst D0 + bne.s @notTheDisk +@skipsomestuff + + move -4(A4), D0 + cmp 6(A2), D0 + beq.s @isTheDisk + bra.s @notTheDisk + cmp.w dqRefNum(A2), D4 ; is this driver for the default device? bne.s @notTheDisk ; no-> definitely no the disk then + import ZeroD0 + bsr ZeroD0 + bne.s @notTheDisk + move.b #1, foundDrvr(A4) ; so we know to clr ckPartition if end-of-Q tst.b ckPartition(A4) ; do we need to check the partition num? beq.s @isTheDisk ; no-> well then, it is the right disk @@ -1033,7 +1115,7 @@ IsItDefault ;________________________________________________________________________________________ ; -; Routine: IsItFloppyOrDefault +; Routine: IsItFloppyOrDefault 3adc ; ; Inputs: A2 - pointer to the current drive queue entry (must not be nil!) ; D4 - default device's driver reference number @@ -1054,7 +1136,7 @@ IsItFloppyOrDefault ;________________________________________________________________________________________ ; -; Routine: IsItFloppy +; Routine: IsItFloppy 3ae4 ; ; Inputs: A2 - pointer to the current drive queue entry (must not be nil!) ; D4 - default device's driver reference number @@ -1072,7 +1154,7 @@ ItsDefault RTS ; and return BEQ if so ;________________________________________________________________________________________ ; -; Routine: IsItAnything +; Routine: IsItAnything 3aec ; ; Inputs: A2 - pointer to the current drive queue entry (must not be nil!) ; D4 - default device's driver reference number @@ -1085,14 +1167,23 @@ ItsDefault RTS ; and return BEQ if so ;________________________________________________________________________________________ IsItAnything - CMP D0,D0 ; return BEQ + CMP 8(A2), D4 + BNE.S @beq + + BSR ZeroD0 + BNE.S @bne + +@beq MOVEQ.L #0, D0 + RTS + +@bne MOVEQ.L #1, D0 RTS ;________________________________________________________________________________________ ; -; Routine: VisualUpdate +; Routine: VisualUpdate 3b00 ; ; Inputs: flashTime(A4) - the absolute time of the next flash of the ? or X ; D6 - the current state of the icons on the screen @@ -1129,15 +1220,18 @@ VisualUpdate @NoSwitch BCHG #FlashParity,D6 ; Switch parity. BNE.S @XorQ ; Branch if we need X or ? showing. LEA DiskIcon,A0 ; plot the plain disk icon + MOVE #-20021,D0 BRA.S PlotMyIcon @XorQ TST.B D6 ; Are we showing an ? BEQ.S @ShowQ ; Branch if so. SUBQ.B #1,D6 ; Eventually, we go back to a ?. LEA XDiskIcon,A0 ; but for now, plot the disk icon with the X + MOVE #-20023,D0 BRA.S PlotMyIcon @ShowQ LEA QDiskIcon,A0 ; plot the disk icon with the question mark + MOVE #-20022,D0 BRA.S PlotMyIcon @DoneDisk RTS @@ -1145,7 +1239,7 @@ VisualUpdate ;________________________________________________________________________________________ ; -; Routine: HappyMac +; Routine: HappyMac 3b54 ; ; Inputs: none ; @@ -1158,39 +1252,15 @@ VisualUpdate HappyMac BSR.S EraseMyIcon ; erase what's on the screen where the icon goes LEA HappyIcon,A0 ; plot the happy mac icon - BSR.S PlotMyIcon - RTS + MOVE #-20020,D0 ;________________________________________________________________________________________ ; -; Routine: EraseMyIcon -; -; Inputs: none -; -; Outputs: none -; -; Trashes: none -; -; Function: erases the ICN# in the center of the main screen -;________________________________________________________________________________________ - -EraseMyIcon MOVEM.L D0-D2/A0-A1,-(SP) - BSR.S PushIconRect ; push the icon's rectangle onto the stack - MOVE.L SP,-(SP) ; and point to it - MOVE.L grafGlobals(A5),A0 ; point to the QuickDraw globals - PEA gray(A0) ; and use 50% gray as the background - _FillRect ; erase the rectangle with the desktop pattern - ADDQ.W #8,SP ; clean up the stack - MOVEM.L (SP)+,D0-D2/A0-A1 - RTS - - -;________________________________________________________________________________________ -; -; Routine: PlotMyIcon +; Routine: PlotMyIcon 3b5e ; ; Inputs: A0 - pointer to ICN# to plot +; D0 - ID of cicn to try first ; ; Outputs: none ; @@ -1199,7 +1269,27 @@ EraseMyIcon MOVEM.L D0-D2/A0-A1,-(SP) ; Function: plots an icon, centered on the main video device ;________________________________________________________________________________________ -PlotMyIcon MOVE.L A0,D2 ; save the pointer to the ICN# +PlotMyIcon + MOVE.L A0,-(SP) + MOVE #$FFFF,ROMMapInsert + SUBQ #4,SP + MOVE D0,-(SP) + _GetCIcon + MOVE.L (SP)+,D2 + MOVE.L (SP)+,A0 + + BEQ.S @useOld + + MOVE.L D2,-(SP) + BSR PushIconRect + MOVE.L SP,-(SP) + MOVE.L D2,-(A7) + _PlotCIcon + ADDQ #8,SP + _DisposeCIcon + RTS + +@useOld MOVE.L A0,D2 ; save the pointer to the ICN# ; put the source bitmap on the stack (icon's bit image) @@ -1232,6 +1322,46 @@ PlotMyIcon MOVE.L A0,D2 ; save the pointer to the ICN# RTS +;________________________________________________________________________________________ +; +; Routine: EraseMyIcon 3bbc +; +; Inputs: none +; +; Outputs: none +; +; Trashes: none +; +; Function: erases the ICN# in the center of the main screen +;________________________________________________________________________________________ + +EraseMyIcon MOVEM.L D0-D2/A0-A2,-(SP) + BSR.S PushIconRect ; push the icon's rectangle onto the stack + MOVE.L SP,-(SP) ; and point to it + + + + MOVE.L grafGlobals(A5),A2 ; point to the QuickDraw globals + TST.B ($B3E) + BNE.S @anyway + MOVE.L ExpandMem,A0 + TST.B $341(A0) + BEQ.B @otherthing +@anyway PEA.L @theColor + _RGBForeColor + PEA.L -16(A2) + BRA.S @ffs +@otherthing + PEA.L -24(A2) +@ffs + _FillRect ; erase the rectangle with the desktop pattern + ADDQ.W #8,SP ; clean up the stack + MOVEM.L (SP)+,D0-D2/A0-A2 + RTS + +@theColor DC.W $8888, $8888, $8888 + + ;________________________________________________________________________________________ ; ; Routine: PushIconRect @@ -1322,7 +1452,54 @@ XDiskIcon DC.L $7FFFFFF0,$81000108,$81007104,$81008902,$81008901,$81008901,$8100 DC.L $FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFF,$FFFFFFFE ENDWITH - ENDPROC +; ENDPROC + + + + + + + +DaFuq ; proc export ; but has no callers yet? +; IMPORT NextDQEntry +; IMPORT SelectDevice +; IMPORT GetStartupInfo + + + MOVEM.L D0-D2/A0-A2,-(SP) + SUB.L A2,A2 +@loop + MOVE #$A002,D0 + _GetOSTrapAddress + MOVE.L ROMBase,A1 + CMP.L A0,A1 + BCS.S @return + BSR NextDQEntry + BEQ.S @return + BSR SelectDevice + BSR GetStartupInfo + BRA.S @loop +@return + MOVEM.L (SP)+,D0-D2/A0-A2 + RTS + +; ALIGN 16 + + + + + + + +ZeroD0 PROC EXPORT + MOVEQ.L #0, D0 + RTS + +; ALIGN 16 + + + + @@ -1335,6 +1512,7 @@ XDiskIcon DC.L $7FFFFFF0,$81000108,$81007104,$81008902,$81008901,$81008901,$8100 ; ; Destroys D0-D2/A0-A1. ;---------------------------------------------------------------------- +; 4070 InternalWait PROC EXPORT @@ -1373,6 +1551,7 @@ MaxDispVal EQU 9 ; Entries 0-9 exist. ; ; Destroys D0/A0. ;---------------------------------------------------------------------- +; 4098 iGetTimeOut BSR.S GetRawTimeOut ; Get the current timeout parameter @@ -1387,6 +1566,7 @@ iGetTimeOut ; ; Destroys D0/A0. ;---------------------------------------------------------------------- +; 40a0 iGetWaitFlags BSR.S GetRawTimeOut ; Get the current timeout parameter @@ -1401,6 +1581,7 @@ iGetWaitFlags ; ; Destroys D0-D1/A0. ;---------------------------------------------------------------------- +; 40a8 iSetTimeOut MOVE.B D0,-(SP) ; Save timeout value @@ -1423,6 +1604,7 @@ iSetTimeOut ; ; Destroys D0-D1/A0. ;---------------------------------------------------------------------- +; 40bc iSetWaitFlags MOVE.B D0,-(SP) ; Save wait flags @@ -1479,6 +1661,7 @@ GetRawTimeOut ; ; Destroys D0/A0. ;---------------------------------------------------------------------- +; 40f0 iDisableDynWait _GetWaitFlags ; Get the current wait flags. @@ -1492,6 +1675,7 @@ iDisableDynWait ; ; Destroys D0/A0. ;---------------------------------------------------------------------- +; 4102 iEnableDynWait _GetWaitFlags ; Get the current wait flags. @@ -1505,6 +1689,7 @@ iEnableDynWait ; ; Destroys D0/A0. ;---------------------------------------------------------------------- +; 4114 iDisablePermWait _GetWaitFlags ; Get the current wait flags. @@ -1518,6 +1703,7 @@ iDisablePermWait ; ; Destroys D0/A0. ;---------------------------------------------------------------------- +; 4126 iEnablePermWait _GetWaitFlags ; Get the current wait flags. @@ -1545,6 +1731,7 @@ iEnablePermWait ; ; Destroys D0-D2/A0-A1. ;---------------------------------------------------------------------- +; 4140 GetDefaultStartup PROC EXPORT @@ -1575,6 +1762,7 @@ GetDefaultStartup PROC EXPORT ; ; Destroys D0-D2/A0-A1. ;---------------------------------------------------------------------- +; 4150 SetDefaultStartup PROC EXPORT @@ -1603,6 +1791,7 @@ SetDefaultStartup PROC EXPORT ; ; Destroys D0-D2/A0-A1. ;---------------------------------------------------------------------- +; 4160 GetOSDefault PROC EXPORT @@ -1642,6 +1831,7 @@ GetOSDefault PROC EXPORT ; creating Chaos. ; ;---------------------------------------------------------------------- +; 4170 SetOSDefault PROC EXPORT @@ -1665,104 +1855,6 @@ AppPhne EQU $09961010 ENDPROC -;________________________________________________________________________________________ -; -; Routine: Ck4LimitPRAMClear -; -; Inputs: none -; -; Outputs: Z: NE = only boot from Default device -; EQ = boot from Floppy or Default -; D0: NE = only boot from Default device -; EQ = boot from Floppy or Default -; -; Trashes: D0, A0 -; -;________________________________________________________________________________________ - -Ck4LimitPRAMClear PROC EXPORT - - IMPORT ValidatePRAM76 ; StartSearch.a - bsr ValidatePRAM76 - subq.w #2,sp ; allocate buffer on stack - movea.l sp, A0 ; get buffer ptr - MOVE.L #$00010076, D0 ; Read 1 bytes starting at loc $76 - _ReadXPRam - move.b (sp)+, D0 - and.b #1, D0 ; low bit - rts - - ENDPROC - - -;________________________________________________________________________________________ -; -; Routine: ValidatePRAM76 -; -; Inputs: none -; -; Outputs: none -; -; Trashes: none -; -; Function: Validates byte $76 of xpram: counts set bits in lower 6 and compares with -; upper two bits. If not equal, zeros out the byte. -; -; Note: Byte $76 (previously reserved but used by OSDefault stuff) is -; being defined as sensitive boot bits generally having to do with -; security issues driven by AIX but these functions can be used -; by other OSes as well. The upper two bits of byte $76 are a -; "checksum" of the other 6 bits (i.e. count of bits set). This -; is desired because of the danger if one of these bits is set -; accidentally by some bogus client. Failing this checksum will -; cause the byte to revert to 00 - a safe value. Currently defined -; bits are: -; 0: limit PRAM clear - don't clear PSWD, AUXPRAM, OSType, DefBoot -; 1: only load drivers from default device, don't boot from floppy -; 2: ignore CmdShiftOptDel -; -;________________________________________________________________________________________ -vp76trashedRegs REG D0-D2/A0 - -ValidatePRAM76 PROC EXPORT - - movem.l vp76trashedRegs, -(sp) - - subq.w #2, sp ; allocate buffer on stack - movea.l sp, A0 ; get buffer ptr - MOVE.L #$00010076, D0 ; Read 1 bytes starting at loc $76 - _ReadXPRam ; Get it from PRAM. - move.b (sp)+, D0 - - move.b #0, D2 ; zero reg for addx - moveq.l #0, D1 ; clear checksum - and.b #$3F, D0 ; get data bits (strip sum bits) -@bitloop - lsr.b #1, D0 ; get a bit - addx.b D2, D1 ; add that bit to checksum - tst.b D0 ; loop until no more bits - bne.s @bitloop - - and.b #3, D1 ; only 2 low bits are valid - - move.b (A0), D0 ; get byte 76 again - lsr.b #6, D0 ; get only checksum bits - - cmp.b D0, D1 ; valid signature? - beq @valid ; Yes, don't clear all - - move.b #00, -(sp) ; clean up bogus value - movea.l sp, A0 ; get buffer ptr - move.l #$00010076, D0 ; get #, addr PRAM bytes - _WriteXPram ; write out zeros to 76 - move.b (sp)+, D0 -@valid - movem.l (sp)+, vp76trashedRegs - rts - - ENDP - - ;---------------------------------------------------------------------- ; Get information about the current default video device. ; @@ -1779,6 +1871,7 @@ ValidatePRAM76 PROC EXPORT ; ; Destroys D0-D2/A0-A1. ;---------------------------------------------------------------------- +; 4190 GetVideoDefault PROC EXPORT @@ -1808,6 +1901,7 @@ GetVideoDefault PROC EXPORT ; ; Destroys D0-D2/A0-A1. ;---------------------------------------------------------------------- +; 41a0 SetVideoDefault PROC EXPORT diff --git a/OS/SysUtil.a b/OS/SysUtil.a index 5708b63..8a21319 100644 --- a/OS/SysUtil.a +++ b/OS/SysUtil.a @@ -219,7 +219,7 @@ ASyncPatch ; ;______________________________________________________________________ ; -; Routine: ReadParam +; Routine: ReadParam b332 ; A0 (input) -- pointer to buffer which returns parameters ; D0 (input) -- bits 0-19 indicate which of parameter bytes ; 0-19 to return in the buffer. bytes are @@ -246,7 +246,7 @@ XPLoop LSR.L #1,D0 ; read a byte for each one set ;______________________________________________________________________ ; -; Routine: WriteParam +; Routine: WriteParam b34c ; Input: A0 (input) -- pointer to PRAM buffer ; Arguments: D0 (output) -- result code ; Function: This routine writes the parameter ram copy in SysParam @@ -273,7 +273,7 @@ WriteParamTrap ;______________________________________________________________________ ; -; Routine: ReadDateTime +; Routine: ReadDateTime b374 ; A0 (input) -- pointer to buffer in which time is returned ; Arguments: D0 (output) -- result code ; Function: This routine updates Time in memory and then writes @@ -288,7 +288,7 @@ ReadDateTimeTrap ;______________________________________________________________________ ; -; Routine: SetDateTime +; Routine: SetDateTime b37e ; Arguments: D0 (input) -- 32-bit value to write to clock ; D0 (output) -- result code ; Function: This routine updates Time in memory and then writes @@ -302,7 +302,7 @@ SetDateTimeTrap ;______________________________________________________________________ ; -; Routine: Delay +; Routine: Delay b386 ; Arguments: A0 (input) -- number of tick counts to delay ; D0 (output) -- value of Ticks after delay ; interrupt level 0 is set @@ -311,19 +311,29 @@ SetDateTimeTrap ; ;______________________________________________________________________ -DelayTrap ANDI.W #$F8FF,SR ; have to let interrupts in rb - MOVE.L Ticks,D0 - ADD.L A0,D0 +DelayTrap MOVEM.L D1-D3/A0-A1,-(SP) + ANDI.W #$F8FF,SR ; have to let interrupts in rb + MOVE.L Ticks,D3 + ADD.L A0,D3 + BRA.S @enter -@1 CMP.L Ticks,D0 ; have enough ticks ticked? +@1 CLR.L -(SP) + MOVE.L #$10,-(SP) + MOVE #$FFCB,-(SP) + DC.W $AA7F ; InternalWait? + ADDQ.L #4,SP + +@enter CMP.L Ticks,D3 ; have enough ticks ticked? BHI.S @1 ; -> No. Keep waiting. (now use unsigned comparison) + MOVE.L D3,D0 + MOVEM.L (SP)+,D1-D3/A0-A1 RTS ;______________________________________________________________________ ; -; Routine: UprString +; Routine: UprString b3b4 ; Arguments: D0.W (input) -- string length ; A0.L (input) -- pointer to string to canonize ; Opcode bit 10 -- 0 - map to upper case; 1 - case sensitive @@ -363,7 +373,7 @@ USLoopEntry ;______________________________________________________________________ <27Feb85>... ; -; Routine: CmpString, RelString +; Routine: CmpString b3ca, RelString b3e0 ; Arguments: D0.L (input) -- high-order word = string 0 length ; low-order word = string 1 length ; A0.L (input) -- pointer to string 0 @@ -952,7 +962,7 @@ CmpTab ;_______________________________________________________________________ ; -; Routine: ReadPram +; Routine: ReadPram b856 ; ; Arguments: A1 (input) -- pointer to buffer where 20 bytes are placed ; all regs preserved @@ -983,7 +993,7 @@ ReadPram MOVE.L A0,-(SP) ;

;_______________________________________________________________________ ; -; Routine: InitUtil +; Routine: InitUtil b87c ; ; Arguments: D0 (output) -- result code (0 if clock was already initialized) ; @@ -1003,7 +1013,7 @@ InitUtil CLR.W -(SP) ; assume no reset of PRam values <30Oct85> LAK MOVEQ #0,D0 ; assume valid clock data CMP.B #$A8,(A1) ; is the clock data valid? - BEQ.S CkNewPram ; branch if so + BEQ.S POSTWRITE MOVE.W #PRInitErr,(SP) ; report non-zero result <30Oct85> LAK MOVEQ #4,D1 @@ -1013,8 +1023,11 @@ InitUtil CLR.W -(SP) ; assume no reset of PRam values <30Oct85> LAK BSR WritePram ; and put initial values into clk chip -CkNewPram BTST #6,HWCfgFlags ; new clock chip present? <30oct85> BBM - BEQ.S ClkXit ; exit if not <30oct85> BBM +CkNewPram LEA.L SysParam,A0 + MOVE.B #$A8,(A0) + MOVE.L #$10010,D0 + _WriteXPRam +POSTWRITE LEA GetParam,A0 ; get pointer to useful buffer <30oct85> BBM MOVE.L #$4000C,D0 ; Command to read 4 bytes at addr C <30oct85> BBM @@ -1026,10 +1039,6 @@ CkNewPram BTST #6,HWCfgFlags ; new clock chip present? <30oct85> BBM BEQ.S ClkXit ; exit if so <30oct85> BBM MOVE.W #PRInitErr,(SP) ; report non-zero result <30Oct85> LAK - MOVE.L D1,(A0) ; store out true validity bytes <30oct85> BBM - MOVE.L #$4000C,D0 ; Command to write 4 bytes at addr C <30oct85> BBM - _WriteXPRam ; <30oct85> BBM - MOVEQ #32,D1 ; starting address to clear out XPRam <30oct85> BBM @0 MOVEQ #4,D0 ; number of bytes to write SWAP D0 ; finish the command byte <30oct85> BBM @@ -1041,25 +1050,24 @@ CkNewPram BTST #6,HWCfgFlags ; new clock chip present? <30oct85> BBM CMP.B #8,D1 ; Check if we wrote the last address <30oct85> BBM BNE.S @0 ; if not loop back untill we are done <30oct85> BBM - MOVEM.L A1,-(SP) ;Save A1 LEA PRAMInitTbl,A0 ;Copy the data from the PRAMInit table. - LEA GetParam,A1 ; into the GetParam buffer. - MOVEQ #5-1,D0 ;Loop 5 times (20 bytes) -@10 MOVE.L (A0)+,(A1)+ ;Copy 4 bytes - DBRA D0,@10 ;Branch if not done. + LEA ReadTime,A1 - MOVE.L #$00140076,D0 ;Write 20 bytes beginning at PRAM address $76 - LEA GetParam,A0 ; from the buffer - _WriteXPRam ; into the PRAM. + SUB.L A0,A1 + MOVE.L A1,D0 + SWAP D0 + ORI #$76,D0 + _WriteXPRam - ; Write the default memory mgr flags to location $8A. Since this is the only xpram whose default - ; is non zero, we write it explicitly (as opposed to writing a default table full of zeros) + LEA.L GetParam,A0 + MOVE.L #'NuMc',(A0) + MOVE.L #$4000C,D0 + _WriteXPRam - LEA MMFlags,A0 ; Point A0 at the Memory Manager flags lomem - MOVE.B #MMFlagsDefault,(A0) ; Put the default MMFlags into MMFlags - MOVE.L #MMPRAMloc,D0 ; Write MMFlags to PRAM - _WriteXPRam ; Store it. - MOVEM.L (SP)+,A1 ;Restore A1 + IMPORT InterC_29c0_Wireless + MACHINE MC68030 + BSR.L InterC_29c0_Wireless +; MACHINE MC68000 ClkXit MOVE.W (SP)+,D0 ; pass back error code <30oct85> LAK BNE.S @1 ; br if we had to reset clock/pram <30oct85> LAK @@ -1070,7 +1078,7 @@ ClkXit MOVE.W (SP)+,D0 ; pass back error code <30oct85> LAK ; original 20-byte parameter RAM initialization values -PRAMInit DC.B $A8 ; old PRAM validity byte <2.7> +PRAMInit DC.B $77 ; old PRAM validity byte <2.7> DC.B 0 ; AppleTalk node ID hint for modem port <2.7> DC.B 0 ; AppleTalk node ID hint for printer port <2.7> DC.B (0<<4)+(0<<0) ; serial port usage = neither port in use <2.7> @@ -1107,7 +1115,7 @@ PRAMInit DC.B $A8 ; old PRAM validity byte <2.7> DC.B ((32/4)<<4)+ \ ; ¥ double-click time = 32 ticks <2.7> (32/4) ; ¥ caret-blink time = 32 ticks <2.7> - DC.B 3 ; ram cache size in 32K blocks (96k default) + DC.B 32 ; ram cache size in 32K blocks (96k default) DC.B (1<<7)+ \ ; ¥ color desk pattern = 1 (use if CQD around) <2.7>
(1<<6)+ \ ; ¥ mouse scaling = 1 (on) <2.7> @@ -1118,7 +1126,7 @@ PRAMInit DC.B $A8 ; old PRAM validity byte <2.7> ;Start Manager PRAMInitTbl DC.B 00 ; [$76] Reserved. DC.B 01 ; [$77] Default OS. - DC.W $FFFF,$FFDF ; [$78-$7B] Default boot. + DC.W $0000,$6666 ; [$78-$7B] Default boot. ;Sound Manager? DC.W 0 ; [$7C-$7D] Sound alert id @@ -1135,9 +1143,35 @@ PRAMInitTbl DC.B 00 ; [$76] Reserved. ;Reserved DC.B 0,0 ; [$88-$89] + +OtherDamnTable + DC.L $25000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000070 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000000 + DC.L $00000001 + DC.W $000A + ;________________________________________________________________________________________ ; -; Routine: ReadTime +; Routine: ReadTime b9a2 ; ; Inputs: none ; @@ -1166,7 +1200,7 @@ ReadTime MOVEM.L A0/A2-A3/D1-D2/D4-D5,-(SP) ;

;________________________________________________________________________________________ ; -; Routine: WriteTime +; Routine: WriteTime b9ca ; ; Inputs: "Time" contains the 32-bit time value to write to the clock ; @@ -1194,7 +1228,7 @@ WriteTime MOVEM.L A0/D1-D5,-(SP) ;

;________________________________________________________________________________________ ; -; Routine: InitCPHardware +; Routine: InitCPHardware b9e6 ; ; Inputs: none ; @@ -1220,7 +1254,7 @@ InitCPHardware ;

;_______________________________________________________________________ ; -; Routine: WritePram +; Routine: WritePram ba06 ; ; Arguments: SysParam contains the 20 bytes to write. ; all regs preserved @@ -1252,7 +1286,7 @@ WritePram MOVE.L A0,-(SP) ;

;----------------------------------------------------------------------------- -; SysEnvirons call. +; SysEnvirons call. ba30 ; ; Fix File Date Patch# Fix Routine(s) Routine(s) Fixed ;AppleSystemPatch PatchIIROM.a 28Mar87 #PABM150 (SysEnvirons) (SysEnvirons) @@ -1485,163 +1519,4 @@ Exit MOVE.W D2,D0 ; put error number in D0 RTS ; return to caller (Return address should be on stack) ENDPROC ; SysEnvirons - -;----- <2.4> -; -; The Reliability Manager -; -; This new "manager" is responsible for monitoring the operation of the machine -; and recording pertinent information in parameter RAM. -; -; Written by Bob Herold, May 24, 1989 -; -;----- - -;----- -; InitReliability - sets time of 1st power on, and initializes the Usage Statistics time -; manager task -; -; The time of 1st power on is kept as the number of 48 hour periods since Jan 1 1989. To -; calculate this, we first get the number of seconds since Jan 1 1989. On 020 and higher -; machines, we could divide by the number of seconds in 48 hours. To work on 68000 -; machines, we separate out factors of two to get the divisor into the 16 bit range: -; -; # 48 hrs since Jan 1 1989 = (# secs since Jan 1 1989) / (# secs in 48 hours) -; = (# secs) / (60 * 60 * 24 * 2) -; = (# secs) / (2*2*15) * (2*2*15) * (2*2*2*3) * 2 -; = (# secs) / (15 * 15 * 3) * 2^^8 -; = ((# secs) / 2^^8) / (15 * 15 * 3) -;--- - -InitReliability PROC EXPORT - IMPORT RelTimeTask, RelDeferredTimeTask - - IF hasPowerMgr THEN - rts - ELSE - -;--- -; Initialize the 'time of 1st power on' -;--- - - subq #RelPram>>16,sp ; allocate buffer on stack - move.l Time,d1 ; get current # secs - sub.l #Jan1st89,d1 ; get # secs since Jan 1 1989 - blo.s @doneStart ; if earlier, clock chip set wrong! - movea.l sp,a0 ; get buffer ptr - move.l #RelPram,d0 ; get #, addr PRAM bytes - _ReadXPram ; read 'em and weep - move.l (sp),d0 ; get 'da bytes - and.l #Rel1stMask,d0 ; mask all except 1st powered on time - bne.s @doneStart ; if already set, do nothing - lsr.l #8,d1 ; divide # secs by 2^^8 - divu.w #15*15*3,d1 ; get # 48 hour periods (see comment above) - moveq #Rel1stBit,d0 ; get shift count - lsl.l d0,d1 ; shift our value into position - and.l #Rel1stMask,d1 ; mask unneeded high bits - and.l #-1-Rel1stMask,(sp) ; zero our bits in result - or.l d1,(sp) ; overlay our value into result - move.l #RelPram,d0 ; get #, addr PRAM bytes - _WriteXPram ; write out 1st power on time -@doneStart addq #RelPram>>16,sp ; de-allocate buffer - -;--- -; Set up time manager task for power on time measurement -;--- - - WITH RelGlobals - - moveq #rlRecSize,d0 ; get size Reliability Mgr globals - move.b d0,d1 ; save for later - _NewPtr ,sys,clear ; allocate space for it - bne.s @done ; don't bother if no room - move.l ExpandMem,a1 ; get ptr to low memory expansion - move.l a0,ExpandMemRec.emReliability(a1) ; save ptr to Reliability globals there - move.b d1,rlGlobalsSize(a0) ; save size of globals - move.b #rlRecVers,rlGlobalsVers(a0); save version number of globals - bclr #usRelTaskRun,UnSwitchedFlags; signal we are timing - -; Initialize a deferred task queue element to schedule execution of the original Time Manager -; task, now called RelDeferredTimeTask. Pass a pointer to the Time Manager task in dtParm so -; that the original code still gets its expected parameter in A1. - - move.w #dtQType,rlDeferredTask.qType(a0) - lea RelDeferredTimeTask,a1 - move.l a1,rlDeferredTask.dtAddr(a0) - lea rlTimeBlock(a0),a1 - move.l a1,rlDeferredTask.dtParm(a0) - - lea rlTimeBlock(a0),a0 ; point to time manager task block - lea RelTimeTask,a1 ; point to our time task - move.l a1,tmAddr(a0) ; stuff it into task block - _InsXTime ; install our task - move.l #RelMsCount,d0 ; get # ms between calls - clr.l tmWakeUp(a0) ; signal its the first time - _PrimeTime ; fire up time mgr task -@done rts - - ENDWITH ; {RelGlobals} - - ENDIF - - ENDPROC ; {InitReliability} - - -;----- -; RelTimeTask - the time manager task for doing all this reliability stuff -; -; Called by the Time Manager -; -; Entry -; a0 - points to this routine (not too useful, huh?) -; a1 - points to task block (now there's something useful!) -; -; -; RelDeferredTimeTask - the deferred Time Manager task for doing all this reliability stuff -; -; Called by the Deferred Task Manager -; -; Entry -; A1 - dtParm points to the originating Time Manager task block -;--- - -RelTimeTask PROC EXPORT - -; If PRAM is in Egret/CUDA, _ReadXPram and _WriteXPram require interrupts enabled -; to execute efficiently. Therefore, the periodic Reliability task now uses the -; Deferred Task Manager to be more interrupt-friendly. - -; This helps MIDI SysEx dumps and other interrupt tasks run more punctually. - - lea tmXQSize(a1),a0 ; deferred task element follows TM task element - _DTInstall - rts - - - entry RelDeferredTimeTask - -RelDeferredTimeTask - - subq #RelPram>>16,sp ; allocate buffer on stack - movea.l sp,a0 ; get buffer ptr - move.l #RelPram,d0 ; get #, addr PRAM bytes - _ReadXPram ; read 'em and weep - move.l (sp),d0 ; get 'da bytes - move.l d0,d1 ; save a copy - and.l #RelPwrMask,d0 ; mask to get power on time - addq.l #1,d0 ; increment power on time - and.l #RelPwrMask,d0 ; mask again, in case of rollover - and.l #-1-RelPwrMask,d1 ; zero power on time bits - or.l d0,d1 ; replace the power on time bits - move.l d1,(a0) ; put new PRAM value in buffer - move.l #RelPram,d0 ; get #, addr PRAM bytes - _WriteXPRAM ; write 'em back - addq #RelPram>>16,sp ; deallocate buffer - move.l a1,a0 ; get ptr to task block - move.l #RelMsCount,d0 ; get # ms between calls - _PrimeTime ; re-fire up time mgr task - rts - - ENDPROC ; {RelTimeTask} - END diff --git a/OS/TrapDispatcher/Dispatch.a b/OS/TrapDispatcher/Dispatch.a index 8c78499..1010215 100644 --- a/OS/TrapDispatcher/Dispatch.a +++ b/OS/TrapDispatcher/Dispatch.a @@ -225,6 +225,7 @@ Dispatcher proc export export BadTrap import SysErr1 import BlockMove68020 + import FLUSHCRANGE If hasNewHeapMgr Then import PramIO ; endif @@ -233,7 +234,7 @@ Dispatcher proc export ;_______________________________________________________________________ ; -; Routine: ATrap68020 +; Routine: ATrap68020 dfa0 ; ; Function: Dispatch A-line emulator traps to Mac system. ; @@ -328,7 +329,7 @@ EMT1010 equ ATrap68020 ;_______________________________________________________________________ ; -; Routine: FindTableEntry +; Routine: FindTableEntry e01c ; ; Function: Return address of trap entry in the dispatch table. (flushes Inst cache on 020). ; @@ -342,13 +343,21 @@ EMT1010 equ ATrap68020 FindTableEntry _AssumeEq OldDisp,ToolDisp-1 ; OldDisp is next to, and lower than ToolDisp lsl.w #16-ToolDisp,d1 ; ccr.c <- ToolDisp, ccr.n <- OldDisp - bpl.s @oldTrap ; if OldDisp = 0, it's an old style trap + bpl.s @newOldTrap ; if OldDisp = 0, it's an old style trap bcc.s @osTrap ; if ToolDisp = 0, it's a new style OS trap ; otherwise, it's a new style ToolBox trap @toolTrap andi.w #numTrapMask,d0 ; clear all but trap bits lea (ToolTable,d0.w*4),a1 ; index into the Toolbox table - bra CacheFlush ; flush inst cache and return (destroys only reg D1) + rts + +@newOldTrap bcc.s @oldTrap + move.l d0,d1 + btst.l #11,d1 + bsr.s @toolTrapInstead + subi #$c000,d1 + cmpi #$1000,d1 + rts @oldTrap andi.w #$01FF,d0 ; clear irrelevant bits moveq.l #-$0057,d1 ; setup to check for ToolBox range @@ -358,17 +367,18 @@ FindTableEntry addq.w #$0057-$004F,d1 ; d1 := TrapNum - $004F ble.s @osTrap ; $0000 É $004F are OS traps subq.w #$0054-$004F,d1 ; d1 := TrapNum - $0054 +@toolTrapInstead bne.s @toolTrap ; $0054 is an OS trap, $50É$53,$55,$56 are tool box @osTrap andi.w #$00FF,d0 ; only 8 bits for OS trap numbers lea (OSTable,d0.w*4),a1 ; index into the OS table - bra.s CacheFlush ; flush inst cache and return (destroys only reg D1) + rts Title 'Dispatch - Get / Set Trap Address' IMPORT TrapAddressBits ; rb ;_______________________________________________________________________ ; -; Routine: GetTrapAddress +; Routine: GetTrapAddress e062 ; ; Function: Return trap address from dispatch table. ; @@ -383,10 +393,8 @@ kComeFromHeader equ (kBranchOverJMPLOpcode << 16) + kJMPLOpcode ; GetTrapAddressTrap ; rb - bsr TrapAddressBits ; makes sure trap word is correct begin - move ccr,-(sp) ; save condition register - bsr.s OldGetTrapAddress ; call the old GetTrapAddress - move (sp)+,ccr ; get condition codes back + bsr.s FindTableEntry + move.l (a1),a0 bcs.s @done ; come-from patches bypass our trickery @next cmp.l #kComeFromHeader,(a0) ; does this have the come-from header? @@ -397,17 +405,10 @@ GetTrapAddressTrap ; rb moveq #0,d0 ; must zero the result code again rts -OldGetTrapAddress ; ; end - - bsr.s FindTableEntry ; locate the dispatch table entry - movea.l (a1),a0 ; get the routine address from the table - moveq.l #noErr,d0 ; return with success - rts ; all done - ;_______________________________________________________________________ ; -; Routine: SetTrapAddress +; Routine: SetTrapAddress e07a ; ; Function: Load new trap vector into dispatch table. ; On 020 machines, flush the cache as well. @@ -423,29 +424,28 @@ SetTrapAddressTrap ; rb move.l (a0),d2 ; get header of trap, and check for bus errors <5>begin - bsr TrapAddressBits ; makes sure trap word is correct rb + bsr.s FindTableEntry ; locate the dispatch table entry + + exg.l d0,a0 bcs.s OldSetTrapAddress ; come-from patches bypass our trickery cmp.l #kComeFromHeader,d2 ; headers can only be used on come-from patches <5> beq.s @illegalHeader ; saw a header, so I must system error <5> - movem.l d0-d1/a0,-(sp) ; save trap address, number, and bits - bsr OldGetTrapAddress ; call the old GetTrapAddress - move.l #0,a1 ; no come-froms found yet -@next + movea.l (a1),a0 + cmp.l #kComeFromHeader,(a0)+ ; does this have the come-from header? - bne.s @done ; no we are done + bne.s OldSetTrapAddress +@next move.l a0,a1 ; remember this address move.l (a0),a0 ; go on to the next - bra.s @next -@done - movem.l (sp)+,d0-d1/a0 ; restore trap address, number, and bits + cmp.l #kComeFromHeader,(a0)+ ; does this have the come-from header? + beq.s @next + move.l d0,(a1) - cmp.l #0,a1 ; any come-froms found? - beq.s OldSetTrapAddress ; no, go do the real SetTrapAddress - move.l a0,(a1) ; set the trap address - move.l jCacheFlush,-(sp) ; get the cache flush vector <9> - rts ; call it, and then return to the trap dispatcher <9> + lea -2(a1),a0 + lea 6,a1 + bra.l FLUSHCRANGE @illegalHeader move.w #dsBadPatchHeader,d0 ; get error code <5> @@ -453,16 +453,13 @@ SetTrapAddressTrap ; rb OldSetTrapAddress - bsr.s FindTableEntry ; locate the dispatch table entry - move.l a0,(a1) ; install the new routine address into the table + move.l d0,(a1) ; install the new routine address into the table moveq.l #noErr,d0 ; return with success - - move.l jCacheFlush,-(sp) ; get the cache flush vector <9> - rts ; call it, and then return to the trap dispatcher <9>end + rts ;_______________________________________________________________________ ; -; Macros: CacheFlush, vCacheFlush +; Macros: CacheFlush e0c2, vCacheFlush e0c2, DummyCacheFlush e0c6 ; ; Function: Flush the 68020 Cache. For programs that do self modifying code, etc. ; @@ -481,13 +478,6 @@ CacheFlush rts ; jump through the vector vCacheFlush - move.l d1,-(SP) ; save this f*&%$ng register <5> - movec.l cacr,d1 ; get current cache state of 68020 - addq.w #1<<3,d1 ; flush the instruction cache <1.4> - movec.l d1,cacr ; write back to the control register - move.l (SP)+,d1 ; restore register <5> - rts ; all done - vCacheFlush68040 ; 68040 cache flushing for self-modifying programs <3> ; NOTE - since the 040 I-Cache never gets "dirty", it only needs to be invalidated. <3> @@ -502,6 +492,9 @@ vCacheFlush68040 ; 68040 cache flushing for self-modifying programs <3> rts ; return to caller - no registers destroyed <3> MACHINE MC68020 ; reset to previous MACHINE directive <3> + +DummyCacheFlush + rts Title 'Dispatch - InitDispatcher' ;_______________________________________________________________________ @@ -666,18 +659,14 @@ OSLoop move.l (a2)+,d1 ; get the next entry from the ROM dispatch table EndIf ; Not NewBuildSystem ; now install the trap dispatcher + btst.b #2,$240a + beq.s @noInstallFlusher + lea DummyCacheFlush,a0 + move.l a0,jCacheFlush +@noInstallFlusher + lea EMT1010,a0 ; point to the dispatcher - TestFor has68kEmulator ; Are we emulating a 68020? SAM - beq.s @noEmu ; -> Nope. - lea Rts020Disp,A1 ; Point A1 to an rts (hopefully near some cache resident code) - bra.s @StuffFlush ; -> Install it - -@noEmu cmpi.b #cpu68040,CpuFlag ; check if we need to install 040 Cache Flush routine <3> - bne.s @notAn040 ; NO ... perform 020/030 cache-flush <3> - lea vCacheFlush68040,a1 ; YES ... get addr. of 040 cache flush routine <3> -@StuffFlush move.l a1,jCacheFlush ; ... and install it <3> -@notAn040 ; <3> move.l a0,Line1010 ; install the Line-A exception handler IF forRomulator THEN ; register the Line-A handler with the nub @@ -711,60 +700,5 @@ BadTrap ; rb, start from PatchProtector.a -TrapAddressBits proc export - -; TrapAddressBits -; -; In: -; d0.w trap number -; d1.w [GS]etTrapAddress trap word -; -; Out: -; d1.w (modified) [GS]etTrapAddress trap word -; ccr CC if it is not a come-from, CS if it is a come-from - -; bits in trap numbers and Set/GetTrapAddress opcodes - -TrapNumber record 0 -toolboxBit equ 11 - endr - -TrapAddressOpcode record 0 -newBit equ 9 -toolboxBit equ 10 - endr - - btst #TrapAddressOpcode.newBit,d1 ; is this N[GS]etTrapAddress? - bnz.s @notFullWord ; yes, donÕt handle it - btst #TrapAddressOpcode.toolboxBit,d1 ; is this normal [GS]etTrapAddress? - bz.s @notFullWord ; yes, donÕt handle it - -@fullWord - ; adjust the trap bits - - bset #TrapAddressOpcode.newBit,d1 ; is this NGetTrapAddress? - btst #TrapNumber.toolboxBit,d0 ; is the trap a Toolbox trap? - bnz.s @toolbox ; yes, leave the bit set - bclr #TrapAddressOpcode.toolboxBit,d1 ; clear bit for OS -@toolbox - - cmp.w #$C000,d0 ; is this a come-from trap word? - blo.s @notComeFrom ; no, it is not - cmp.w #$D000,d0 ; is it a come-from trap word? - bhs.s @notComeFrom ; no, it is not -@comeFrom - ; oooh... carry is set for us, we can return - rts - -@notFullWord -@notComeFrom - and #$FE,ccr ; clear the carry bit - rts - - endproc - -; rb, end - - end diff --git a/OS/Universal.a b/OS/Universal.a index cf33da2..126ba67 100644 --- a/OS/Universal.a +++ b/OS/Universal.a @@ -427,7 +427,7 @@ JumpIntoROM @TryAgain moveq.l #0,d2 ; figure it out from scratch bsr6 GetHardwareInfo ; figure out what we are running on btst.l #ROMExists,d0 ; see if we have a ROM - beq.s @TryAgain ; if not, we're screwed, but try again anyway + beq.s norom ; if not, we're screwed ; Now figure out what the new base of ROM should be, @@ -453,6 +453,7 @@ intoROM ; now we are in ROM adda.l d3,sp ; relocate the stack to rom addresses +norom lea GotBusError,a0 ; get the handler address move.l a0,d0 ; value to search for @loop cmp.l -(a0),d0 ; check for a match @@ -478,8 +479,6 @@ intoROM ; now we are in ROM @TryAgain moveq.l #0,d2 ; figure it out from scratch bsr6 GetHardwareInfo ; figure out what we are running on - btst.l #ROMExists,d0 ; see if we have a ROM - beq.s @TryAgain ; if not, we're screwed, but try again anyway IF NOT ROMinRAM THEN ; rb bsr6 InitVIAs ; initialize the VIAs (turns off vOverlay) @@ -502,33 +501,14 @@ intoROM ; now we are in ROM move.l d0,d3 ; save a copy of d0 move.l #EgretFWMask,d0 ; mask for Egret Firmware {rbm}<2> and.l d1,d0 ; isolate the field {rbm}<2> - sub.l #Egret8,d0 ; see if we have Egret FW {rbm}<2> - beq.w @DoEgretInit ; do Egret 8 FW INIT, LC/si {rbm}<2> - sub.l #Egret8,d0 ; see if we have Caboose FW {rbm}<2> - beq.s @CudaDone ; just exit Quadra900 {rbm}<2> PN - sub.l #Egret8,d0 ; see if we have Cuda FW {rbm}<2> + beq.s @CudaDone + + cmpi.l #$3000000, D0 bne.s @CudaDone ; if not, just exit {rbm}<2> IF NOT ROMinRAM THEN ; rb BigBSR6 CudaInit ;Setup Cuda Sysnc Ack with System {rbm}<2> - bra.s @CudaDone ; ENDIF ; rb -@DoEgretInit ; - movea.l DecoderInfo.VIA1Addr(a0),a1 ; get VIA 1 base address - move.w #4000,d0 ; -@wait - eieioSTP - tst.b (a1) ; sync to hardware for 1.2µS per access - - dbra d0,@wait ; Egret must see idle before command, it's busy - ; doing ADB reset for 3mSec so delay in idle state - eieioSTP - move.l #(NopCmd<<16)|pseudoPkt,d0 ; - moveq #0,d2 ; no bytes to send - bsr6 SendEgretCmd ; send the command to disable async. messages - moveq.l #0,d2 ; figure it out from scratch - bsr6 GetHardwareInfo ; restore all the registers we trashed - move.l d0,d3 ; by calling SendEgretCmd @CudaDone move.l d3,d0 ; restore d0 @@ -922,11 +902,10 @@ intoROM ; now we are in ROM ALIGN 16 ; <60><62> rb, for the 040 emulator... dc.l 0,0,0,0 ; end of list - dc.l (GotBusError-BaseOfRom)+$40A00000 ; base of Elsie II ROM rb - dc.l (GotBusError-BaseOfRom)+$00A00000 ; base of Elsie ROM <51> dc.l (GotBusError-BaseOfRom)+$40000000 ; alternate base of normal ROM <58> rb dc.l (GotBusError-BaseOfRom)+$40800000 ; base of normal ROM dc.l (GotBusError-BaseOfRom)+$00000000 ; base of overlay ROM + dc.l (GotBusError-BaseOfRom)+$FFC00000 ; base of NewWorld ROM? GotBusError btst.l #beok,d7 ; indicate that bus error occured move.l a5,a7 ; restore stack @@ -935,7 +914,7 @@ GotBusError btst.l #beok,d7 ; indicate that bus error occured ;_______________________________________________________________________ ; -; Routine: InitVIAs +; Routine: InitVIAs aad8 ; Inputs: A0 - Pointer to table of base addresses ; A1 - Pointer to ProductInfo record for this machine ; D0 - Flags indicating which base addresses are valid @@ -962,9 +941,6 @@ InitVIAs movea.l VIA1Addr(a0),a2 ; get VIA base address rb movea.l a1,a3 ; get product info ptr rb adda.l VIA1InitPtr(a3),a3 ; point to the init info rb - - btst.l #PSCExists,d0 ; is this a Cyclone ? rb rb, start - beq.s @WombatVIAInit ; if not, check if we're a Wombat ; ; This change is valid only for the Cyclone VIA1 Info Table... ; The other machine tables will have to be updated to follow this initialization @@ -972,14 +948,16 @@ InitVIAs ; in a different order than in previous ROMS... THIS MUST BE UPDATED!!!! ; gjs ???? ; - eieioSTP - move.b (a3)+,vDirA(a2) ; init direction for port A gjs eieioSTP move.b (a3)+,vBufA(a2) ; init output port A gjs eieioSTP - move.b (a3)+,vDirB(a2) ; init direction for port B gjs + move.b (a3)+,vDirA(a2) ; init direction for port A gjs + nop eieioSTP move.b (a3)+,vBufB(a2) ; init output port B gjs + eieioSTP + move.b (a3)+,vDirB(a2) ; init direction for port B gjs + nop eieioSTP move.b (a3)+,vPCR(a2) ; init peripheral control reg rb eieioSTP @@ -987,53 +965,7 @@ InitVIAs eieioSTP move.b #$7F,vIER(a2) ; Disable all VIA interrupts. rb eieioSTP - bra.s @VIA1done ; cool, keep going rb -@WombatVIAInit ; - IF hasDJMEMC THEN ; rb - cmpi.b #djMEMCDecoder,d2 ; are we on a Wombat? - bne.s @doOldVIAInit ; if not, initialize VIAs the old way - eieioSTP - move.b (a3)+,vBufA(a2) ; init output port A - eieioSTP - move.b (a3)+,vDirA(a2) ; init direction for port A - eieioSTP - move.b #$1C,vACR(a2) ; enable shift-out on ACR - eieioSTP - move.b #0,vSR(a2) ; preset shift register with an ADB resetCmd - eieioSTP - move.b (a3)+,vBufB(a2) ; init output port B - eieioSTP - move.b (a3)+,vDirB(a2) ; init direction for port B - eieioSTP - move.b -2(a3),vBufB(a2) ; (re-)init output port B - eieioSTP - move.b (a3)+,vPCR(a2) ; init peripheral control reg - eieioSTP - move.b (a3)+,vACR(a2) ; init auxiliary control reg - eieioSTP - move.b #$7F,vIER(a2) ; Disable all VIA interrupts. - eieioSTP - bra.s @VIA1done ; cool, keep going - ENDIF ; rb - -@doOldVIAInit ; rb, start - eieioSTP - move.b (a3)+,vBufA(a2) ; init output port A - eieioSTP - move.b (a3)+,vDirA(a2) ; init direction for port A - eieioSTP - move.b (a3)+,vBufB(a2) ; init output port B - eieioSTP - move.b (a3)+,vDirB(a2) ; init direction for port B - eieioSTP - move.b (a3)+,vPCR(a2) ; init peripheral control reg - eieioSTP - move.b (a3)+,vACR(a2) ; init auxiliary control reg - eieioSTP - move.b #$7F,vIER(a2) ; Disable all VIA interrupts. - eieioSTP - @VIA1done btst.l #VIA2Exists,d0 ; see if we have VIA2 beq.s @VIA2done ; if not, skip it @@ -1071,10 +1003,12 @@ InitVIAs move.b d3,vBufA(a2) ; init output port A eieioSTP move.b (a3)+,vDirA(a2) ; init direction for port A + nop eieioSTP move.b (a3)+,vBufB(a2) ; init output port B eieioSTP move.b (a3)+,vDirB(a2) ; init direction for port B + nop eieioSTP move.b (a3)+,vPCR(a2) ; init peripheral control reg eieioSTP @@ -1102,70 +1036,12 @@ InitVIAs eieioSTP @VIA2done - btst.l #RBVExists,d0 ; see if we have an RBV - beq.s @RBVdone ; if not, skip it - - movea.l RBVAddr(a0),a2 ; get RBV base address - eieioSTP - move.b #$7F,RvIER(a2) ; disable all interrupts - eieioSTP - move.b #$8F,RvDataB(a2) ; initialize data reg. B <1.3> - eieioSTP - - BTST #MSCChipBit,D1 ; are we using an MSC variant? - BEQ.S @NoMSC ; -> no, continue on - -; This is the point where we check to see if an external FPU is attached to -; the system. In the case of Escher, the onboard FPU will power up disabled, -; but we want to enable it here if we don't detect anything else sitting on -; the coprocessor bus. -; -; The idea is to move VBR DOWN the difference between the F-Line and -; BusError, so that if you were to execute an F-Line instruction and -; couldn't handle it, you would end up fetching the address of the -; BusErrVector and going thru the BusErrVector. The BusErr handler -; expects A6 to contain the address of where it should return TO. - - movec VBR,d3 ; retrieve VBR - sub.l #Line1111-BusErrVct,d3 ; temporarily move VBR down - movec d3,VBR ; shuffle VBR for F-Line test - moveq #1,d3 ; non-zero value in D3 for later comparison - move.l a7,a5 ; sp to restore if you dont have an FPU - move.l a6,a3 ; save return address - bset #beok,d7 ; set bus error expected flag - lea @noFPU,a6 ; where to come back to if you dont have an FPU - - FNOP ; execute suspect command - clr.l d3 ; if you got here, you already have an FPU - -@noFPU tst.b d3 ; - beq.s @ignore ; already using an FPU so ignore internal - bclr #MSCEnableFPU,RvDataB(a2);enable onboard FPU -@ignore - movec VBR,d3 ; return VBR to it's old value - add.l #Line1111-BusErrVct,d3 - movec d3,VBR ; ... so everyone is happy - bclr #beok,d7 ; release bus error expected flag - move.l a3,a6 ; restore return address - - MOVE.B #$7F,RvSEnb(A2) ; disable all slot interrupts - eieioSTP - RTS6 ; -@NoMSC ; - - eieioSTP - move.b #1< - eieioSTP - move.b #$FF,RvSEnb(a2) ; set all slots to be interrupt enabled - eieioSTP -@RBVdone - rts6 ;_______________________________________________________________________ ; -; Routine: GetHardwareInfo +; Routine: GetHardwareInfo ab4e ; Inputs: D2 - Bits 15..8, BoxFlag info (only if decoder kind <> 0) ; D2 - Bits 7..0, Address Decoder Kind (zero if unknown) ; A6 - return address @@ -1205,6 +1081,13 @@ GetHardwareInfo bra HasNoCPUIDReg ; ->CONTINUE in GetHardwareInfo using old recognition method rb @foundCPUIDReg ; ENDIF + + cmpi.l #'Hnfo',([$68FFEFD0],$70) ; NKHWInfo.Signature, fix this later + bne.s @tryOldWay + import InfoNanoKernel + biglea InfoNanoKernel,a1 + bra Matched +@tryOldWay biglea CPUIDProductLookup-4,a2 ; get address of CPUID product lookup table @MatchLoop ; LOOP (through product info entries to match CPU ID) addq.w #4,a2 ; bump to next entry @@ -1217,10 +1100,6 @@ GetHardwareInfo btst #11,d0 ; is the complete CPU ID in the CPUID register? beq Matched ; -> yes, we've got it - cmpi.b #PrattDecoder,\ ; IF Decoder is a Pratt THEN - DecoderKind(a1) ; Found Match - beq Matched ; { For Now just handle one case } - movea.l DecoderInfoPtr(a1),a0 ; get the pointer to this machine's decoder table adda.l a1,a0 move.l DefaultBases(a0),d0 ; and get the default bases flags @@ -1271,7 +1150,7 @@ GetHardwareInfo movea.l a3,a2 ; restore our place in the table bra.s @MatchLoop ; go look for another candidate to check Matched ; END - bra.s FoundMatch ; yea!!! rb + bra.s FoundMatch ; yea!!! rb UnknownCPU bra.s UnknownCPU ; Ack! @@ -1280,19 +1159,137 @@ UnknownCPU bra.s UnknownCPU ; Ack! HasNoCPUIDReg ; fall through to @MatchLoop tst.b d2 ; check address decoder kind - beq.s FindDecoder ; if unknown decoder, search for it. + beq FindDecoder ; if unknown decoder, search for it. ; The ProductKind and DecoderKind are setup in D2, find the matching ProductInfo record. biglea ProductLookup-4,a0 ; point before the first product to check for @MatchLoop addq.w #4,a0 ; point to next product to check for move.l (a0),d0 ; see if end of list reached - beq.s FindDecoder ; if end, look start over, looking for decoder first + beq FindDecoder ; if end, look start over, looking for decoder first lea (a0,d0.l),a1 ; a1 := pointer to ProductInfo record cmp.w ProductKind(a1),d2 ; see if product and decoder match bne.s @MatchLoop ; if not, keep searching FoundMatch + Move.L BasesValid1(A1), D0 + BTst.L #$1E, D0 + BEQ @skipAllThis + MoveA.L ([$68FFEFD0],$8), A0 ; NKHWInfo.UniversalInfoTableBase + Move.B $12(A1), D0 + Move.B D0, $12(A0) + Move $14(A1), D0 + Move D0, $14(A0) + Move.B $16(A1), D0 + Move.B D0, $16(A0) + Move $10(A1), D0 + Or D0, $10(A0) + MoveA.L (A0), A2 + AddA.L A0, A2 + Move.L $24(A1), D0 + Or.L D0, $24(A0) + Or.L D0, -$1C(A2) + Move.L $28(A1), D0 + Or.L D0, $28(A0) + Or.L D0, -$18(A2) + Move.L $2C(A1), D0 + Or.L D0, $2C(A0) + Or.L D0, -$14(A2) + MoveA.L A1, A2 + SubA.L A0, A2 + Move.L A1, D0 + MoveA.L $8(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $8(A0) + MoveA.L D0, A1 + MoveA.L $4(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $4(A0) + MoveA.L D0, A1 + MoveA.L $C(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $C(A0) + MoveA.L D0, A1 + MoveA.L $38(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $38(A0) + MoveA.L D0, A1 + MoveA.L $3C(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $3C(A0) + MoveA.L D0, A1 + MoveA.L $40(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $40(A0) + MoveA.L D0, A1 + MoveA.L $44(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $44(A0) + MoveA.L D0, A1 + MoveA.L $48(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $48(A0) + MoveA.L D0, A1 + MoveA.L $4C(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $4C(A0) + MoveA.L D0, A1 + MoveA.L $50(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $50(A0) + MoveA.L D0, A1 + MoveA.L $64(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $64(A0) + MoveA.L D0, A1 + MoveA.L $5C(A1), A1 + Tst.L A1 + BEQ.B (* + $4) + AddA.L A2, A1 + Move.L A1, $5C(A0) + MoveA.L D0, A2 + MoveA.L A2, A1 + Move.B $68(A1), D0 + Move.L D0, $68(A0) + MoveQ.L #$0, D0 + Move ([$68FFEFD0],$76), D0 ; NKHWInfo.CPU_ID + Move D0, $58(A0) + biglea CPUIDProductLookup,a2 + Lea.L $8(A2), A2 + Tst.L (A2) + BEQ.B @is_single_entry_table + Cmp.L (A2), D0 + BNE.B (* + -$A) + Move.L $4(A2), D0 + Bra.B @common_path +@is_single_entry_table + Move.L $60(A1), D0 +@common_path + Move.L D0, $60(A0) + MoveA.L A0, A1 +@skipAllThis movea.l DecoderInfoPtr(a1),a0 ; get offset to DecoderInfo record adda.l a1,a0 ; make it absolute @@ -1331,39 +1328,16 @@ MapFound movea.l d0,a2 ; now save return address in A2 and.l VIAIdMask(a1),d0 ; mask them cmp.l VIAIdMatch(a1),d0 ; see if they match bne.s @MatchLoop ; if not, try the next product - bra.s FoundMatch ; if found, return the info + bra FoundMatch ; if found, return the info CheckBases move.l DefaultBases(a0),d0 ; get the default base flags movea.l a6,a0 ; save return address - btst.l #RBVExists,d0 ; see if RBV might be allowed - beq.s @RBVDone ; if not, don't test for one - movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l RBVAddr(a1,a2.l),a2 - lea RvIER(a2),a2 ; base address of RBV VIER register - bsr6 TestForRvIER ; see if RBV exists - beq.s @RBVDone ; if found, has RBV and VDAC - bclr.l #RBVExists,d0 ; no RBV, clear the bit - bclr.l #VDACExists,d0 ; if no RBV, then assume no VDAC either -@RBVDone - - bclr.l #VIA2Exists,d0 ; see if VIA2 might be allowed + bclr.l #VIA2Exists,d0 beq.s @VIA2Done ; if not, don't test for one movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l VIA2Addr(a1,a2.l),a2 ; get VIA2 base address - - IF hasPSC THEN ; rb - btst.l #PSCExists, D0 ; do we have PSC? rb, start - Beq.s @noPSC ; no, do horror style VIA2 init - - - lea PSCVIA2IER(a2),a2 ; base address of PSC VIA2 VIER register - Bra.s @gotVIA2 - -@noPSC ; - ENDIF ; rb - + movea.l VIA2Addr(a1,a2.l),a2 lea VIER(a2),a2 ; base address of VIA2 VIER register @gotVIA2 ; rb, end bsr6 TestForVIER ; see if VIA2 exists @@ -1371,31 +1345,6 @@ CheckBases bset.l #VIA2Exists,d0 ; has VIA2, set the bit @VIA2Done - IF hasIopSwim THEN ; rb - bclr.l #SWIMIOPExists,d0 ; see if SWIMIOP might be allowed - beq.s @SWIMIOPDone ; if not, don't test for one - movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l SWIMIOPAddr(a1,a2.l),a2 - bsr6 TestForIOP ; see if SWIM IOP exists - bne.s @SWIMIOPDone ; if not found, has regular IWM - bclr.l #IWMExists,d0 ; no regular IWM, clear the bit - bset.l #SWIMIOPExists,d0 ; has SWIMIOP, set the bit -@SWIMIOPDone - ENDIF ; rb - - IF hasIopScc THEN ; rb - bclr.l #SCCIOPExists,d0 ; see if SCCIOP might be allowed - beq.s @SCCIOPDone ; if not, don't test for one - movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l SCCIOPAddr(a1,a2.l),a2 - bsr6 TestForIOP ; see if SCC IOP exists - bne.s @SCCIOPDone ; if not found, has regular SCC - bset.l #SCCIOPExists,d0 ; has SCCIOP, set the bit - bclr.l #SCCrdExists,d0 ; no regular SCC, clear the bit - bclr.l #SCCwrExists,d0 ; no regular SCC, clear the bit -@SCCIOPDone - ENDIF ; rb - bclr.l #SCSIDMAExists,d0 ; see if SCSIDMA might be allowed beq.s @SCSIDMADone ; if not, don't test for one movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info @@ -1435,57 +1384,12 @@ CheckBases @SCSI96Done ENDIF ; rb - bclr.l #RPUExists,d0 ; see if RPU might be allowed - beq.s @RPUDone ; if not, don't test for one - movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l RPUAddr(a1,a2.l),a2 - bsr6 TestForRPU ; see if SCSI DMA exists - bne.s @RPUDone ; if not found, no parity chip - bset.l #RPUExists,d0 ; has SCSI DMA, set the bit -@RPUDone - movea.l a0,a6 ; restore return address movea.l a1,a0 ; get product info pointer adda.l DecoderInfoPtr(a0),a0 ; get decoder info pointer CheckOptionals move.l HwCfgWord(a1),d2 ; access hardware cfg flags <8> - btst.l #hwCbFPU+16,d2 ; should FPU be installed - beq.s FPUDone ; branch if it shouldn't be installed - movea.l a6,a2 ; save return address - bra TestForFPU ; see if FPU installed -FPUReturn movea.l a2,a6 ; restore return address - beq.s FPUDone ; branch if FPU found - bclr.l #hwCbFPU+16,d2 ; otherwise,clear FPU installed flag - -FPUDone - - bset.l #beok,d7 ; allow bus errors - movea.l a7,a5 ; mark the stack for bus error handler - - bclr.l #SonicExists,d0 ; see if Sonic might be allowed - beq.s @SonicDone ; if not, don't test for one - move.l a1,d1 ; save a1 - move.l SonicAddr(a0),a1 ; get Sonic Base Address - movea.l a6,a2 ; save return address - bsr6 TestForSonic ; see if Sonic exists - movea.l a2,a6 ; restore return address - move.l d1,a1 ; restore a1 - bne.s @SonicDone ; if not found, no Sonic chip - bset.l #SonicExists,d0 ; has Sonic, set the bit -@SonicDone - - bclr.l #PatchROMExists,d0 ; see if PatchRom might be allowed .start - beq.s @PatchROMDone ; if not, don't test for one - move.l a1,d1 ; save a1 - move.l PatchRomAddr(a0),a1 ; get PatchRom Base Address - movea.l a6,a2 ; save return address - bsr6 TestForPatchRom ; see if PatchRom exists - movea.l a2,a6 ; restore return address - move.l d1,a1 ; restore a1 - bne.s @PatchRomDone ; if not found, no PatchRom chip - bset.l #PatchRomExists,d0 ; has PatchRom, set the bit .end -@PatchROMDone ; External features checked after CheckOptionals so that d1 can be used as a scratch register CheckFeatures ; <11> @@ -1498,7 +1402,7 @@ CheckFeatures ; <11> ;_______________________________________________________________________ ; -; Routine: GetExtHardwareInfo +; Routine: GetExtHardwareInfo ab4e ; ; Inputs: A0 - Pointer to DecoderInfo record for this machine ; A1 - Pointer to ProductInfo record for this machine @@ -1538,32 +1442,6 @@ CheckExtBases1 move.l DefaultBases1(a0),d0 ; get the default base flags for #32-63 movea.l a6,a0 ; save return address -;--------------- -; Call "TestForÉ" routines here to verify devices for #32-63 -;--------------- -; begin fau -; See if we have a Muni - - btst.l #MuniExists-32,d0 ; see if MUNI might be allowed - beq.s @MuniDone ; if not, don't test for one - movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l (MUNIAddr,a1,a2.l),a2 ; get MUNI's base addresses - bsr6 TestForMUNI ; and go test for it - beq.s @MUNIDone ; if found, has MUNI - bclr.l #MUNIExists-32,d0 ; no MUNI, clear the bit -@MUNIDone - -; See if we have a BART - - btst.l #BartExists-32,d0 ; see if BART might be allowed - beq.s @BartDone ; if not, don't test for one - movea.l DecoderInfoPtr(a1),a2 ; get offset to decoder info - movea.l (BartAddr,a1,a2.l),a2 ; get BART's base addresses - bsr6 TestForBART ; and go test for it - beq.s @BartDone ; if found, has BART - bclr.l #BartExists-32,d0 ; no BART, clear the bit -@BartDone -; end fau movea.l a0,a6 ; restore return address movea.l a1,a0 ; get product info pointer adda.l DecoderInfoPtr(a0),a0 ; get decoder info pointer @@ -1929,7 +1807,7 @@ CheckForNiagra ;_______________________________________________________________________ ; -; Routine: CheckForUnknown +; Routine: CheckForUnknown aec6 ; Inputs: A0 - Pointer to DecoderInfo record for this decoder ; A1 - Pointer to next entry in DecoderLookup table ; A5, A7, D7, VBR - setup for bus error handler @@ -1952,7 +1830,7 @@ CheckForUnknown ;_______________________________________________________________________ ; -; Routine: TestForVIER, TestVIERWrap +; Routine: TestForVIER aeca, TestVIERWrap aecc ; Inputs: A2 - Address of the VIER register to test ; D2 - offset of alternate address to check for (wrap around) ; Used by TestVIERWrap, set to zero for TestForVIER. @@ -1986,10 +1864,12 @@ TestVIERWrap ; A2 := address of VIER register to test rol.w #8,d1 ; save it in the next byte st.b d1 ; test pattern := $FF move.b d1,(a2) ; set all bits of VIER + nop eieioSTP @loop neg.b d1 ; pattern of bit to clear eieioSTP move.b d1,(a2) ; clear the lowest order bit + nop add.b d1,d1 ; shift the test pattern beq.s @exit ; exit when all bits shifted out neg.b d1 ; convert to mask of bits that should be set @@ -2003,6 +1883,7 @@ TestVIERWrap ; A2 := address of VIER register to test @exit ror.w #8,d1 ; get saved VIER value eieioSTP move.b #$7F,(a2) ; prepare to restore (clear all bits) + nop eieioSTP move.b d1,(a2) ; restore original VIER value eieioSTP @@ -2011,196 +1892,7 @@ TestVIERWrap ; A2 := address of VIER register to test ;_______________________________________________________________________ ; -; Routine: TestForRvIER -; Inputs: A2 - Address of the RvIER register to test -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if not a valid RvIER register, or bus error. -; - 1 (beq) if valid RvIER register found. -; -; Destroys: D1, D2 -; Called by: BSR6 -; -; Function: Checks to see if the specified I/O register is a RBV IER -; (interrupt enable) register, by first setting all bits of -; the register, and then clearing each bit individually. -; There are some reserved bits in the RvIER register, which -; are ignored by this test. -; -;_______________________________________________________________________ - -TestForRvIER ; A2 := address of RvIER register to test - move.b (a2),d1 ; save old RvIER value - rol.w #8,d1 ; save it in the next byte - st.b d1 ; test pattern := $FF - eieioSTP - move.b d1,(a2) ; set all bits of RvIER -@loop - neg.b d1 ; pattern of bit to clear - eieioSTP - move.b d1,(a2) ; clear the lowest order bit - add.b d1,d1 ; shift the test pattern - beq.s @exit ; exit when all bits shifted out - neg.b d1 ; convert to mask of bits that should be set - eieioSTP - move.b (a2),d2 ; get the RvIER value - eor.b d1,d2 ; compare them - andi.b #$9F,d2 ; ignore the reserved bits - beq.s @loop ; if match found, keep testing -@exit ror.w #8,d1 ; get saved RvIER value - eieioSTP - move.b #$7F,(a2) ; prepare to restore (clear all bits) - eieioSTP - move.b d1,(a2) ; restore original RvIER value - eieioSTP - lsr.w #8,d1 ; 0 if RvIER found - rts6 - -;_______________________________________________________________________ -; -; Routine: TestForSCC -; Inputs: A2 - Base write address of the SCC to test for. -; D2 - offset to SCC read base address from write base -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if SCC not found, or bus error. -; - 1 (beq) if valid SCC found. -; -; Destroys: D1 -; Called by: BSR6 -; -; Function: Checks to see if the specified I/O registers point to an -; SCC. The read and write addresses may be specified separatly -; since some address decoders require this. An SCC is detected -; by writing a two byte signature to the time constant register -; and reading it back. The old value is saved and restored to -; make this test non-destructive. In order to meet SCC timing -; requirements on systems like the Mac Plus that do not provide -; a hardware holdoff, extra delays are introduced between SCC -; accesses. -; -;_______________________________________________________________________ - -TestForSCC ; A2 := address of SCCrd - ; D2 := offset of SCCwr-SCCrd - eieioSTP - tst.b bCtl(a2,d2.l) ; reset register pointer to reg 0 - ror.b #8,d1 ; kill some time, non-destructive - - eieioSTP - move.b #13,bCtl(a2) ; point to register 13, time const high - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b bCtl(a2,d2.l),d1 ; save old time const high byte - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b #12,bCtl(a2) ; point to register 12, time const low - lsl.l #8,d1 ; make room for low byte, kill time - eieioSTP - move.b bCtl(a2,d2.l),d1 ; save old time const low byte - ror.b #8,d1 ; kill some time, non-destructive - - eieioSTP - move.b #13,bCtl(a2) ; point to register 13, time const high - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b #'G',bCtl(a2) ; load in signature high byte - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b #12,bCtl(a2) ; point to register 12, time const low - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b #'D',bCtl(a2) ; load in signature low byte - ror.b #8,d1 ; kill some time, non-destructive - - eieioSTP - move.b #13,bCtl(a2) ; point to register 13, time const high - lsl.l #8,d1 ; make room for byte, kill time - eieioSTP - move.b bCtl(a2,d2.l),d1 ; read back signature high byte - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b #12,bCtl(a2) ; point to register 12, time const low - lsl.l #8,d1 ; make room for byte, kill time - eieioSTP - move.b bCtl(a2,d2.l),d1 ; read back signature low byte - subi.w #'GD',d1 ; see if signature matched - ror.l #8,d1 ; setup to restore, kill some time - - eieioSTP - move.b #12,bCtl(a2) ; point to register 12, time const low - ror.l #8,d1 ; position saved low byte of time const - eieioSTP - move.b d1,bCtl(a2) ; restore original time const low byte - ror.b #8,d1 ; kill some time, non-destructive - eieioSTP - move.b #13,bCtl(a2) ; point to register 13, time const high - lsr.l #8,d1 ; get the high byte - eieioSTP - move.b d1,bCtl(a2) ; restore original time const high byte - - lsr.l #8,d1 ; test signature for match - rts6 ; all done - -;_______________________________________________________________________ -; -; Routine: TestForIOP -; Inputs: A2 - Base address of IOP to test for. -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if IOP not found, or bus error. -; - 1 (beq) if valid IOP found. -; -; Destroys: D1, D2 -; Called by: BSR6 -; -; Function: Checks to see if the specified I/O registers point to an -; IOP. Since the IOP chip generates it's own DSACK, a Bus -; Error may occur if it doesn't exist, which would cause this -; routine to return through the bus error handler, indicating -; that an IOP doesn't exist. If no bus errors occur, we -; verify that a long word read from the IOPRamData register -; causes the IOPRamAddr register to incement by 4. All of the -; IOP registers used are saved and restored, making this test -; non-destructive. -; -;_______________________________________________________________________ - -TestForIOP ; A2 := Base address of IOP to test - eieioSTP - move.b iopStatCtl(a2),d1 ; save status/ctl register value - moveq.l #(1< - eieioSTP - move.b d2,iopStatCtl(a2) ; enable register pointer incrementing - eieioSTP - tst.l iopRamData(a2) ; read and ignore 4 bytes of Ram - eieioSTP - move.w iopRamAddr(a2),d2 ; save updated Ram Address register value - eieioSTP - move.w d1,iopRamAddr(a2) ; restore Ram Address register value - subq.w #4,d2 ; back off the 4 byte increment - sub.w d1,d2 ; check for increment - swap d1 ; get status ctl reg - andi.b #-1-(1< rb, from Terror... ;_______________________________________________________________________ thru matching ; -; Routine: TestForSCSI96 +; Routine: TestForSCSI96 af06 ; Inputs: A2 - Base address of SCSI Port to test. ; A6 - return address ; A5, A7, D7, VBR - setup for bus error handler @@ -2266,195 +1958,9 @@ TestForSCSI96 ; A2 = Base address of SCSI port to test - ;_______________________________________________________________________ ; -; Routine: TestForRPU -; Inputs: A2 - Base address of RPU to test for. -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if RPU not found, or bus error. -; - 1 (beq) if valid RPU found. -; -; Destroys: D1,D2 -; Called by: BSR6 -; -; Function: Checks to see if the RPU (Ram Parity Unit) is present by writing -; to the WWP bit of the chip (the only r/w bit) and reading back, -; making sure bus capacitance doesn't make it look valid. -; -;_______________________________________________________________________ -TestForRPU ; - eieioSTP - tst.b (a2) ; x First 4 reads are unique - eieioSTP - tst.b (a2) ; x - eieioSTP - tst.b (a2) ; PDCA Read out the parity daisy chain bits - eieioSTP - tst.b (a2) ; PDCB and toss them (no where to save them) - - eieioSTP - st.b rpuReset(a2) ;reset the RPU serial pointer - eieioSTP - move.b (a2),d2 ;save the WWP bit - - eieioSTP - st.b rpuReset(a2) ;reset the RPU serial pointer - eieioSTP - st.b (a2) ;set the WWP bit - eieioSTP - clr.b rpuReset(a2) ;force bus low, reset pointer - moveq #1,d1 ;check bit 0 - eieioSTP - and.b (a2),d1 ;read WWP bit - seq.b d1 ;d1=FF if WWP bit was 0 - beq.s @exit ;exit if WWP bit=0 - - eieioSTP - st.b rpuReset(a2) ;reset the RPU serial pointer - clr.b (a2) ;clear the WWP bit - eieioSTP - st.b rpuReset(a2) ;force bus high, reset pointer - moveq #1,d1 ;check bit 0 - eieioSTP - and.b (a2),d1 ;read WWP bit - -@exit - eieioSTP - st.b rpuReset(a2) ;reset pointer for exit - move.b d2,(a2) ;restore WWP bit - tst.b d1 ;test result - eieioSTP - rts6 - -;_______________________________________________________________________ -; -; Routine: TestForMUNI -; Inputs: A2 - Address of the MUNI Control register to test -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if not a valid MUNI Control register, or bus error. -; - 1 (beq) if valid MUNI Control register found. -; -; Destroys: D1, D2 -; Called by: BSR6 -; -; Function: Checks to see if the specified MUNI Control register -; exists by writing to it and seeing if we get a bus error. -; If we do, then we have no MUNI. -; Since the MUNI chip generates it's own -; DSACK, a Bus Error may occur if it doesn't exist, which would -; cause this routine to return through the bus error handler, -; indicating that it doesn't exist. For now we just simply test -; to see if we can read the control register without getting -; a bus error. If we are successful, we assume that the chip -; exists. This test may need to be improved in the future. -; -; -;_______________________________________________________________________ - -TestForMUNI ; A2 := address of MUNI register to test - eieioSTP - tst.l MUNI_Control(a2) ; try to read the control register - eieioSTP - cmp.b d1,d1 ; if no bus error, assume that it exists - rts6 - - - -;_______________________________________________________________________ -; -; Routine: TestForBart -; Inputs: A2 - Address of BART -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if no BART, or bus error. -; - 1 (beq) if BART found. -; -; Destroys: D1, D2 -; Called by: BSR6 -; -; Function: Checks to see if BART exists by accessing it and seeing if -; we get a bus error. If we do, then we don't have a BART. This -; test should be extended in the future to check the version register -; in BART. -; -; -;_______________________________________________________________________ - -TestForBart ; A2 := address of BART register to test - eieioSTP - tst.b (a2) ; try to read BART - cmp.b d1,d1 ; if no bus error, assume that it exists - eieioSTP - rts6 - - - -; fau start -;_______________________________________________________________________ -; -; Routine: TestForFPU -; Inputs: A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if FPU not found. -; - 1 (beq) if FPU available. -; -; Destroys: A6, D1, sfc -; Called by: BRA -; -; Function: Checks to see if an FPU is installed. -; -; NOTE: this routine is BRA'nched to, not BSR6'ed, so that A6 is -; available for trashing in this routine. -; -; NOTE2: this needed to be changed because with an 040LC you're -; no longer guaranteed to have an on-board FPU. -;_______________________________________________________________________ -TestForFPU - - IF ROMinRAM THEN ; rb - movec CACR,d1 ; MacsBug does not like the fpu rb - cmp.b d1,d1 ; code when booting from RAM rb - bra FPUReturn ; rb - ELSE ; rb - -; New, Improved method of on-the-fly checking for and FPU - - movec VBR,d1 ; retrieve VBR - -; The idea is to move VBR DOWN the difference between the F-Line and -; BusError, so that if you were to execute an F-Line instruction and -; couldn't handle it, you would end up fetching the address of the -; BusErrVector and going thru the BusErrVector. The BusErr handler -; expects A6 to contain the address of where it should return TO. - - sub.l #Line1111-BusErrVct,d1; temporarily move VBR down - movec d1,VBR ; shuffle VBR for F-Line test - moveq #1,d1 ; non-zero value in D1 for later comparison - lea @noFPU,a6 ; where to come back to if you dont have an FPU - eieioSTP - FNOP ; execute suspect command - eieioSTP - clr.l d1 ; if you got here, you have an FPU - -@noFPU move.l d1,a6 ; save D1 - movec VBR,d1 ; return VBR to it's old value - add.l #Line1111-BusErrVct,d1 - movec d1,VBR ; ... so everyone is happy - move.l a6,d1 ; restore D1 - tst.b d1 ; return CCR.Z to CheckOptionals -@exit bra FPUReturn ; and return to CheckOptionals fau end - - ENDIF ; rb - -;_______________________________________________________________________ -; -; Routine: GetVIAInputs +; Routine: GetVIAInputs af12 ; Inputs: A0 - Pointer to Decoder Info record for this decoder ; D0 - DefaultBases flags for this decoder ; A6 - return address @@ -2495,6 +2001,7 @@ GetVIAInputs and.b AvoidVIA1A(a0),d1 ; if we need to avoid any output, don't make them input eieioSTP move.b d1,vDirA(a1) ; change bits to inputs + nop eieioSTP move.b vBufA(a1),d1 ; get port A inputs eieioSTP @@ -2514,6 +2021,7 @@ GetVIAInputs and.b AvoidVIA1B(a0),d1 ; if we need to avoid any output, don't make them input eieioSTP move.b d1,vDirB(a1) ; change bits to inputs + nop eieioSTP move.b vBufB(a1),d1 ; get port B inputs eieioSTP @@ -2539,6 +2047,7 @@ GetVIAInputs and.b AvoidVIA2A(a0),d1 ; if we need to avoid any output, don't make them input eieioSTP move.b d1,vDirA(a1) ; change bits to inputs + nop eieioSTP move.b vBufA(a1),d1 ; get port A inputs eieioSTP @@ -2558,6 +2067,7 @@ GetVIAInputs and.b AvoidVIA2B(a0),d1 ; if we need to avoid any output, don't make them input eieioSTP move.b d1,vDirB(a1) ; change bits to inputs + nop eieioSTP move.b vBufB(a1),d1 ; get port B inputs eieioSTP @@ -2569,69 +2079,9 @@ GetVIAInputs @noVIA2 rts6 ; all done -;_______________________________________________________________________ -; -; Routine: TestForSonic -; Inputs: A1 - Base address of Sonic to test. -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if Sonic not found, or bus error. -; - 1 (beq) if Sonic found. -; -; Destroys: none -; Called by: BSR6 -; -; Function: Checks to see if we have a Sonic Ethernet chip. An access to a non-existent -; address MUST cause us to BusError. -; -;_______________________________________________________________________ - -TestForSonic ; A1 = Base address of Sonic Chip to test - eieioSTP - tst.b (a1) ; try to read the Command Register - eieioSTP - bset #7,(a1) ; send a SW Reset to Sonic - eieioSTP - - cmp d1,d1 ; set ccr.z because no bus error if we made it here - - rts6 ; return with flags set - - -;_______________________________________________________________________ -; -; Routine: TestForPatchROM -; Inputs: A1 - Base address of PatchROM to test. -; A6 - return address -; A5, A7, D7, VBR - setup for bus error handler -; -; Outputs: ccr.z - 0 (bne) if PatchROM not found, or bus error. -; - 1 (beq) if PatchROM found. -; -; Destroys: a1 -; Called by: BSR6 -; -; Function: Checks to see if we have a PatchROM. An access to a non-existent -; address MUST cause us to BusError. -; -;_______________________________________________________________________ - -TestForPatchROM ; A1 = Base address of PatchROM to test - eieioSTP - tst.b (a1) ; try to read the first byte - eieioSTP - movea.l $4(a1),a1 ; load signature into a1 - eieioSTP - exg a1,d1 ; because we have no free registers - cmpi.l #'romp',d1 ; set ccr.z if signtures match - exg a1,d1 ; because we have no free registers - rts6 ; return with flags set - - ;__________________________________________________________________________________________________ ; -; Routine: GetCPUIDReg +; Routine: GetCPUIDReg afb4 ; ; Inputs: A6 - return address ; A5, A7, D7, VBR - setup for bus error handler @@ -2662,198 +2112,17 @@ TestForPatchROM ; A1 = Base address of PatchROM to test IF hasCPUIDRegister THEN ; rb rb GetCPUIDReg - IF ROMinRAM THEN ; rb - move.l #$A55A2830,d0 ; ¥¥¥ HACK, force Cyclone, make your rb - cmp.w d0,d0 ; ModifyReadOnly hack here. Cyclone rb - jmp (a6) ; needs this because the MMU is rb - ENDIF ; hiding the CPUIDReg one we booted rb - - - - IF forSmurf THEN - - ; Read the CPUID bits from the via register. Orwells/djmemc both have - ; via addrs at $50F0000 (but for smurfs, use $50000000) - - - movea.l #$50000000,a2 ; get the VIA1 base address - - ;now get the cpuid bits from the via register - move.b vBufA(a2),d2 ; save port A - lsl.w #8,d2 ; make room for direction bits - move.b vDirA(a2),d2 ; save direction bits - move.b d2,d1 ; get prior direction bits - move.b #0,vDirA(a2) ; change bits to inputs - move.b vBufA(a2),d1 ; get port A inputs - move.b d2,vDirA(a2) ; restore direction bits - lsr.w #8,d2 ; get saved port A - move.b d2,vBufA(a2) ; restore port A - - ; d1.b now contains the cpuid bits. so use $56 to mask out leaving us with the - ; cpuid bits PA6, PA4, PA2, PA1 - - andi.b #$56,d1 ; d1.b now contains the cpu id bits from the via - - ; now find out if we are on a machine with a djmemc decoder or and orwell. - ; djmec have a 12 bit register, bits 11..9 contain the version number for the djmemc... - ; Game Plan: read from the 12 bit register. if bits 11..9 = 010 then djmec - - lea #MEMCAddr,a2 ; Orwell or djmec decoder addr. - - move.l MEMCIntleaveEnable(a2),d0 ; read the 12 bit register at the base of DJMEMC/Orwell - andi.w #$0E00,d0 ; mask out all bits except version bits at bit 11..9 - cmpi.w #$0200,d0 ; the version number for djmec is 010 for bits 11..9 - - beq.s @tryCentris610 ; if equal than on djmec machine..via id bits will match - ; those for wombat machines -@tryQ700 - cmpi.b #$40,d1 ; is it a quadra700 - bne.s @tryQ900 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1235,D0 ; return emulator CPU ID - BRA @success -@tryQ900 - cmpi.b #$50,d1 ; is it a quadra900 - bne.s @tryQ950 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1236,D0 ; return emulator CPU ID - BRA @success -@tryQ950 ; if here it must be Q950 - - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1237,D0 ; return emulator CPU ID - BRA @success - - -@tryCentris610 - cmpi.b #$40,d1 ; is it a Centris610? - bne.s @tryCentris650 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1204,D0 ; return emulator CPU ID - BRA @success - -@tryCentris650 - cmpi.b #$46,d1 ; is it a Centris650? - bne.s @tryQ800 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1200,D0 ; return emulator CPU ID - BRA @success -@tryQ800 - cmpi.b #$12,d1 ; is it a Quadra800? - bne.s @tryQ610 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1201,D0 ; return emulator CPU ID - BRA @success - -@tryQ610 - cmpi.b #$44,d1 ; is it a Quadra610? - bne.s @tryQ650 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1202,D0 ; return emulator CPU ID - BRA @success - -@tryQ650 ;if here assume Smurf card is in Q650 - MOVE.W #(cpuIDRISC)|\ ; CPU ID: RISC design center - $1203,D0 ; return emulator CPU ID - BRA @success - - - ENDIF ; forSmurf - - LEA CPUIDReg,A2 ; Get CPU ID reg address - - ; FIRST - try to read it as a LONG. , - MOVE.L (A2),D0 ; read the register (bus err if it doesn't exist) - MOVEQ #0,D1 ; clear pattern register -@FlipBits ; LOOP (to write different patterns in CPUID reg) - MOVE.L D1,(A2) ; write next pattern to CPUID register location - CMP.L (A2),D0 ; does it read back the same as the first time? - BNE.S @tryPDMIDReg ; -> no. try reading it the other way. - NOT.L D1 ; flip the bits in the write pattern - BNE.S @FlipBits ; -> try the next write pattern - SWAP D0 ; look at the signature - CMPI.W #cpuIDSig,D0 ; is it a valid signature? - BNE.S @tryPDMIDReg ; -> no. try reading it the other way. - SWAP D0 ; look at the decoder-specific stuff - bra @success ; yay, we're done. - -@tryPDMIDReg ; SECOND - see if it's a byte-wide only reg (like on PDM) - move.b (a2), d0 ; read high byte (bus err if it doesn't exist) - move.b #$6a, (a2) ; write/read to be sure it's really there - cmp.b (a2), d0 ; match previous read? - bne @noCPUIDReg ; no. must not really be the CPUID reg. - lsl.l #8, d0 ; shift high byte over - - move.b 1(a2), d0 ; read next byte - move.b #$6f, 1(a2) ; write/read to be sure it's really there - cmp.b 1(a2), d0 ; match previous read? - bne @noCPUIDReg ; no. must not really be the CPUID reg. - lsl.l #8, d0 ; shift next byte over - - move.b 2(a2), d0 ; read next byte - move.b #$65, 2(a2) ; write/read to be sure it's really there - cmp.b 2(a2), d0 ; match previous read? - bne @noCPUIDReg ; no. must not really be the CPUID reg. - lsl.l #8, d0 ; shift next byte over - - move.b 3(a2), d0 ; read last byte - move.b #$20, 3(a2) ; write/read to be sure it's really there - cmp.b 3(a2), d0 ; match previous read? - bne @noCPUIDReg ; no. must not really be the CPUID reg. - - swap d0 ; check the signature - cmpi.w #cpuIDSig, d0 ; is it valid? - bne @noCPUIDReg ; nope, exit with Z cleared. - swap d0 ; yay! we're probably a PDM! (how cool if we are.) - - cmpi.w #$3010, d0 ; could we be an EVT2 but don't know it? - bne @success ; nope - - move.b $50F32008, d1 ; read SCSI DMA ctl reg - movea.w d1, a2 ; remember the original setting - ori.b #$0C, d1 ; poke the extra bits - move.b d1, $50F32008 ; save the updated value - nop - move.b $50F32008, d1 ; read SCSI DMA ctl reg again - andi.b #$0C, d1 ; did they stick? - beq.s @success ; nope, don't dick with the CPUID - - move.w a2, d1 ; restore the original setting - move.b d1, $50F32008 - nop - -@ck4FastSCSI - move.b #$02, $50f11030 ; do cResetChip cmd - nop - move.b #$00, $50f11030 ; cNOP required after HW or SW reset - - move.b #$40, $50f110b0 ; turn on Features enable then, - move.b #$80, $50f11030 ; send a DMA NOP command then, - nop - cmp.b #$A2, $50f110e0 ; read the SCSI chip ID - an FC96? - beq.s @isFastSCSI ; yes -> we have Fast SCSI (i.e. we're on a Cold Fusion) - -@noFastSCSI - move.b #$02, $50f11030 ; cResetChip again - nop - move.b #$00, $50f11030 ; cNOP required after HW or SW reset - - move.b #$11, d0 ; we're an AMIC2 - change CPUID to $3011 - bra.s @success ; - -@isFastSCSI - move.b #$02, $50f11030 ; cResetChip again - nop - move.b #$00, $50f11030 ; cNOP required after HW or SW reset - - move.b #$13, d0 ; we're a Cold Fusion - change CPUID to $3013 - -@success - IF forSTP601 THEN - ori.w #(cpuIDRISC),d0 - ENDIF - CMP.W D0,D0 ; set ccr.z to indicate success -@noCPUIDReg JMP (A6) ; END + move.l ([$68FFEFD0],$70),d0 ; NKHWInfo.Signature + cmpi.l #'Hnfo',d0 + bne.s @noHnfo + move ([$68FFEFD0],$76),d0 ; NKHWInfo.CPU_ID + bra @eq +@noHnfo + bra.s @ne +@eq + cmp d0,d0 +@ne + rts6 ENDIF ; rb end diff --git a/OS/VerticalRetraceMgr.a b/OS/VerticalRetraceMgr.a index 25a2c1d..ea70f78 100644 --- a/OS/VerticalRetraceMgr.a +++ b/OS/VerticalRetraceMgr.a @@ -86,7 +86,7 @@ VBLCore proc export ;_______________________________________________________________________ ; -; Trap: _VINSTALL +; Trap: _VINSTALL bb40 ; ; Arguments: A0 (input) : address of vertical retrace control block ; D0 (output): error code - 0 no error @@ -115,7 +115,18 @@ VBLCore proc export ; Registers Used: D0,D1,D2,A0,A1 <30Apr85> ;_______________________________________________________________________ -VInstall lea VBLQueue,a1 ; get address of queue <1.4> +VInstall + + lea VBLQueue+2,a1 +@loop move.l (a1),d1 + beq.s @dontflunk + move.l d1,a1 + cmp.l a0,a1 + bne.s @loop + moveq.l #0,d0 + rts + +@dontflunk lea VBLQueue,a1 ; get address of queue <1.4> VInstallCommon ; common code shared with SlotVInstall cmpi.w #vType,VBLType(a0) ; is it the proper type? @@ -159,7 +170,7 @@ VTypeError moveq.l #VTypErr,d0 ; flag the error ;_______________________________________________________________________ ; -; The VREMOVE trap routine removes a vertical retrace control block from the +; The VREMOVE bba2 trap routine removes a vertical retrace control block from the ; VBL queue. On entry, A0 points to the control block. D0 returns the error ; code; all other registers are preserved. ; @@ -177,7 +188,7 @@ AnRTS rts ; return Dequeue error code ;_______________________________________________________________________ <1.3> ; -; we put the code for the VBL interrupt handler next +; we put the code for the VBL interrupt handler next bbb8 ; ; NOTE: This handler expects that the interrupt is still pending, and clears ; it by clearing the CA1 interrupt flag on VIA 1 (base address passed @@ -199,6 +210,7 @@ PseudoVBLInt VBLInt eieioSTP move.b #1< @@ -332,7 +367,7 @@ SlotVInstall ;_______________________________________________________________________ ; -; Trap: _SlotVRemove +; Trap: _SlotVRemove bc76 ; ; Arguments: A0 (input) : address of vertical retrace control block ; D0 (input) : video card slot ($0..$E possible) @@ -353,7 +388,7 @@ SlotVRemove bsr.s GetSlotVBLQHdr ; find the VBL Queue for the slot ;_______________________________________________________________________ ; -; Trap: _AttachVBL +; Trap: _AttachVBL bc86 ; ; Arguments: D0 (input) : new video card slot for system VBL ($0..$E possible) ; D0 (output): error code @@ -371,7 +406,7 @@ AttachVBL bsr.s GetSlotVBLQHdr ; find the VBL Queue for the slot ;_______________________________________________________________________ ; -; Trap: _DoVBLTask +; Trap: _DoVBLTask bc90 ; ; Arguments: D0 (input) : video card slot ($0..$E possible) ; D0 (output): error code @@ -406,7 +441,7 @@ DoVBLTask bsr.s GetSlotVBLQHdr ; find the VBL Queue for the slot ;_______________________________________________________________________ ; -; Routine: InitVBLQs +; Routine: InitVBLQs bcae ; ; Arguments: none ; @@ -415,7 +450,7 @@ DoVBLTask bsr.s GetSlotVBLQHdr ; find the VBL Queue for the slot ; Registers Used: A0 ;_______________________________________________________________________ -InitVBLQs LEA DoVBLTask,A0 ; and save hook to +InitVBLQs LEA.L DoVBLTask,A0 ; and save hook to MOVE.L A0,JVBLTask ; VBL task execute routine CLR.L ScrnVBLPtr ; init main screen ptr save global RTS ; exit to caller diff --git a/Patches/MiscPatches.a b/Patches/MiscPatches.a index 55e0901..c869fdc 100644 --- a/Patches/MiscPatches.a +++ b/Patches/MiscPatches.a @@ -155,6 +155,8 @@ include 'fontPrivate.a' ; include 'universalEqu.a' include 'PowerPrivEqu.a' + include 'Processes.a' + include 'TextServices.a' PwrCycCount EQU $AA ; <1> @@ -168,7 +170,7 @@ PwrCycCount EQU $AA ; <1> ;___________________________________________________________________________________ ; -; Routine: SynchIdleTime +; Routine: SynchIdleTime bcc0 ; ; Inputs: none ; @@ -243,25 +245,52 @@ SynchIdleTimeProc PatchProc _SynchIdleTime _PPC ; PPC trap WITH PMgrRec,PowerDispRec ; - BRA.S @Done ; branch always because we are SM ROM - Testfor hwCbPwrMgr ; do we have a power manager? + BTST.B #0,$DD5 BEQ.S @Done ; no power cycling - MOVE.L PMgrBase,A0 ; Get the Power Manager Globals - MOVE.W PwrCycSyncCount(A0),D0 ; Get the number of syncIdle before IdleMind - ADDI.W #1,PMgrScratch.SyncCounter(A0) ; Increment scratch counter - CMP.W PMgrScratch.SyncCounter(A0),D0 ; Have we done enough SyncIdles - BLT.S @Done - CLR.W PMgrScratch.SyncCounter(A0) ; reset counter MOVEQ #IdleMindDisp,D0 ; Set the selector to IdleMind _PowerDispatch @Done - rts + + BTst.B #$1, ($2409) + BEQ.B @skipDriverCall + IMPORT PMIdleRelatedDriverCall + MACHINE MC68030 + Bsr.L PMIdleRelatedDriverCall +@skipDriverCall + + MoveA.L ([$2B6],$288), A0 + Move.L A0, D0 + BEQ.B @return + MoveM.L D1-D3/A1-A2, -(A7) + Move $6(A0), D1 + MoveQ.L #$0, D2 + +@loop MoveA.L $14(A0,D2.L), A1 + Move.L A1, D0 + BEQ.B @continue + Move $C8(A1), D0 + Clr D3 + Cmp D3, D0 + BEQ.B @continue + MoveA.L $C4(A1), A2 + Move.L A2, D0 + BEQ.B @continue + Jsr (A2) + Bra.B @exit +@continue AddQ #$4, D2 + SubQ #$1, D1 + BNE.B @loop + +@exit MoveM.L (A7)+, D1-D3/A1-A2 + +@return Rts + ENDPROC ; SynchIdleTimeProc ;___________________________________________________________________________________ ; -; Routine: InitApplication <1.6> +; Routine: InitApplication bd40 <1.6> ; ; Inputs: none ; @@ -314,30 +343,48 @@ CleanupApp PatchProc _CleanupApplication MOVE.L applZone,A0 ; point to zone hdr MOVE.L A0,-(SP) ; push start ptr MOVE.L (A0),-(SP) ; push zone trailer - _sbKillSomeCaches + MOVE.W #sbKillSomeCaches,D0 + _SplineMgr ; like _sbKillSomeCaches but with non-quick move ADDQ #4,SP ; ignore result - IF hasCommToolbox THEN - ; - ; Clean up CommToolbox if necessary - ; - import CleanUpCommToolbox - JSR CleanupCommToolbox - ENDIF - IF hasEditionMgr THEN ; <36> - ; - ; Check if app was doing Edition Manager stuff that needs cleaning up - ; - MOVE.L ExpandMem, A0 ; get expanded memory area - MOVE.L ExpandMemRec.emDataPub(A0), D0 ; get dp globals - BEQ.S @noEditionMgr ; if not allocated, no need to do cleanup - SUBQ #2,SP ; place holder for result - _QuitEditionPack ; call pack11 clean up - TST.W (SP)+ ; ignore result -@noEditionMgr - ENDIF - + MoveA.L ExpandMem, A0 + MoveA.L $64(A0), A0 + + Tst.L $70(A0) + BEQ.B @skipAll + + SubQ #$8, SP + Clr -(SP) + Pea.L $2(SP) + + _GetCurrentProcess + + Tst (SP)+ + BNE.B @dont + + Clr -(SP) + Pea.L $2(SP) + Clr -(SP) + + _InlineAware + + Tst.B (SP)+ + BEQ.B @dont + + Clr -(SP) + Move #$2, -(SP) + Pea.L $4(SP) + + Move #$16, D0 + _TSMDispatch + AddQ #$2, SP +@dont + + AddQ #$8, SP +@skipAll + + ; ; Clean up Compoents and Component insetances belong to this app. ; @@ -346,10 +393,8 @@ CleanupApp PatchProc _CleanupApplication ; ; Clean up the Palette Manager if there is one. ; - CMP.W #$3FFF,ROM85 ; do we have color QD? - BHI.S @noPMgrExit - _PMgrExit -@noPmgrExit + MOVE.W #selectPMgrExit,D0 ; _PMgrExit + _PaletteDispatch ; ; Clean up Sound Manager @@ -409,107 +454,5 @@ CleanupApp PatchProc _CleanupApplication ENDPROC ; CleanupApp -;___________________________________________________________________________________ -; -; FUNCTION get70MgrAttr(selector : OSType; VAR response : LONGINT) : OSErr; -; -; Generic Gestalt function for testing for existence of System 7.0 -; features. Since this patch is for 7.0 only, it always returns 1 in the -; response. If your particular feature requires more bits set in the -; response, don't use this routine. Currently, this is the function -; for the gestaltDBAccessMgrAttr and gestaltEditionMgrAttr selectors. -; -; Registers A0 and A1 are destroyed. -; -;___________________________________________________________________________________ - -get70MgrAttr PROC - - MOVE.L (SP)+,A0 ; return address - MOVE.L (SP)+,A1 ; address of result - - MOVE.L #1,(A1) ; 7.0 features always under 7.0! - - ADDA.W #4,SP ; pop the selector type - MOVE.W #noErr,(SP) ; it always works - JMP (A0) - - ENDPROC ; get70MgrAttr - - - -;___________________________________________________________________________________ -; -; Additional patch code goes here -; -;___________________________________________________________________________________ - -;___________________________________________________________________________________ -; -; dimg entry - Dictionary Manager -; -;___________________________________________________________________________________ - -DictionaryDispatch PatchProc _DictionaryDispatch - -DictionaryHandle EQU ExpandMemRec.emDictionaryMgrPackHandle -DictionaryUseCount EQU ExpandMemRec.emDictionaryMgrUseCount - - MOVE.L ExpandMem,A1 ; get expand mem into A1 - MOVE.L DictionaryHandle(A1),A0 ; move the handle to the code into A0 - ADD.W #DictionaryUseCount,A1 ; A1 = pointer to use count - _ProcHelper ; let ProcHelper take over - - ENDPROC ; DictionaryDispatch - -;___________________________________________________________________________________ -; -; Install Gestalt functions for gestaltDBAccessMgrAttr, gestaltEditionMgr, -; gestaltStandardFileAttr, and gestaltAppleEventsAttr -; -; !!!! all just return 1 for system 7.0 !!!!! -; -;___________________________________________________________________________________ - -MiscPatchesInstall InstallProc - - IMPORT get70MgrAttr - - IF hasDataAccessMgr THEN ; <37> - MOVE.L #gestaltDBAccessMgrAttr, D0 ; Data Access Manager - lea get70MgrAttr, A0 - _NewGestalt - ENDIF - - - IF hasEditionMgr THEN ; <37> - MOVE.L #gestaltEditionMgrAttr, D0 ; Edition Manager - lea get70MgrAttr, A0 - _NewGestalt - ENDIF - - MOVE.L #gestaltStandardFileAttr, D0 ; Standard File - leaResident get70MgrAttr, A0 - _NewGestalt - - IF hasAppleEventMgr THEN ; <37> - MOVE.L #gestaltAppleEventsAttr, D0 ; AppleEvent Manager - lea get70MgrAttr, A0 - _NewGestalt - ENDIF - -;___________________________________________________________________________________ -; Gestalt function for the dictionary manager. -; just returns 1 for CubeE -;____________________________________________________________________________________ - MOVE.L #gestaltDictionaryMgrAttr, D0 ; Dictionary Manager - lea get70MgrAttr, A0 - _NewGestalt - - - RTS - - ENDPROC - END ; of file \ No newline at end of file diff --git a/QuickDraw/ColorQD.make b/QuickDraw/ColorQD.make index a2c059b..bca464a 100644 --- a/QuickDraw/ColorQD.make +++ b/QuickDraw/ColorQD.make @@ -28,8 +28,8 @@ CQDObjs = "{ObjDir}CheckDevicesINIT.a.o" Rez {StdROpts} -o "{Targ}" "{ColorQDDir}CQD.r" -i "{QDPatchesDir}" -"{LibDir}CQD.lib" Ä {CQDObjs} - Lib {StdLibOpts} -o "{Targ}" {CQDObjs} +# "{LibDir}CQD.lib" Ä {CQDObjs} +# Lib {StdLibOpts} -o "{Targ}" {CQDObjs} "{ObjDir}CheckDevicesINIT.a.o" Ä "{ColorQDDir}CheckDevicesINIT.a" diff --git a/Toolbox/AliasMgr/AliasMgr.make b/Toolbox/AliasMgr/AliasMgr.make index c79f535..3c71c83 100644 --- a/Toolbox/AliasMgr/AliasMgr.make +++ b/Toolbox/AliasMgr/AliasMgr.make @@ -20,8 +20,8 @@ AliasMgrObjects = "{ObjDir}alDlogUtil.a.o" "{ObjDir}FolderMgr.a.o" -"{LibDir}AliasMgr.lib" Ä {AliasMgrObjects} - Lib {StdLibOpts} -o "{Targ}" {AliasMgrObjects} +# "{LibDir}AliasMgr.lib" Ä {AliasMgrObjects} +# Lib {StdLibOpts} -o "{Targ}" {AliasMgrObjects} "{ObjDir}alDlogUtil.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/Toolbox/ComponentMgr/ComponentMgr.make b/Toolbox/ComponentMgr/ComponentMgr.make index 2b32c2f..32316ba 100644 --- a/Toolbox/ComponentMgr/ComponentMgr.make +++ b/Toolbox/ComponentMgr/ComponentMgr.make @@ -22,8 +22,8 @@ ComponentMgrObjects = "{ObjDir}ThingManagerDispatcher.a.o" "{ObjDir}ThingSearch.c.o" ¶ "{ObjDir}ThingFiles.c.o" ¶ -"{LibDir}ComponentMgr.lib" Ä {ComponentMgrObjects} - Lib {StdLibOpts} {ComponentMgrObjects} -o "{Targ}" +# "{LibDir}ComponentMgr.lib" Ä {ComponentMgrObjects} +# Lib {StdLibOpts} {ComponentMgrObjects} -o "{Targ}" "{ObjDir}ThingManagerDispatcher.a.o" Ä "{ComponentMgrDir}ThingManagerDispatcher.a" ¶ diff --git a/Toolbox/ControlMgr/ControlMgr.a b/Toolbox/ControlMgr/ControlMgr.a index 3bb9d69..d55a93d 100644 --- a/Toolbox/ControlMgr/ControlMgr.a +++ b/Toolbox/ControlMgr/ControlMgr.a @@ -255,6 +255,7 @@ CMGR PROC EXPORT ; External Routines used by Control Manager ; IMPORT GetNewRgn + IMPORT FlushCRange ; ; FUNCTION NewControl( window: windowPtr; @@ -302,8 +303,6 @@ NewControl MOVE.L A0,(A4) ;also, its the function result MOVE.L (A3),A2 ;handle -> pointer - TST.B MMU32Bit ; are we in 32-bit mode? DAF - BEQ.S @1 ; nope, so continue DAF SF.B contrlVis(A2) ; set this temporarily, so SetCtlColor won't try to draw DAF MOVE.L A3,-(SP) ; push controlHandle DAF MOVE.L #-1,-(SP) ; push -1 to make a new rec with default CTab DAF @@ -371,8 +370,6 @@ GetCDefProc MOVE.W (A4),D0 ;get resource ID AND #$000F,D0 ;use only low 4 bits - TST.B MMU32Bit ; is it in 32-bit mode? DAF - BEQ.S @1 ; nope, so hide in hi-byte DAF MOVE.L A0,-(SP) ; save A0 DAF MOVE.L D0,-(SP) ; save D0 too DAF SUBQ #6,SP ; get placeholder for auxCtlHndl, and boolean result DAF @@ -385,10 +382,7 @@ GetCDefProc MOVE.L (SP)+,D0 ; restore D0 (with variant) DAF MOVE.B D0,acReserved(A0) ; put variant in auxRec DAF<1.6> MOVE.L (SP)+,A0 ; restore A0 DAF - BRA.S @2 ; all done DAF -@1 - MOVE.B D0,(A0) ;keep in high byte of handle -@2 + ADDQ #4,A0 ;bump to next field CLR.L (A0)+ ;init dataHandle @@ -470,9 +464,7 @@ CallControl MOVE.W (SP)+,10(SP) ; move from top of stack to placeholder DAF MOVE.L (A3),A0 ;get pointer to control structure - MOVE.L ContrlDefHandle(A0),D0 ;get handle of controlProc DAF - _StripAddress ;clean variant code out of hi byte DAF - MOVE.L D0,A0 ;copy to an A-reg DAF + MOVE.L ContrlDefHandle(A0),A0 ;get handle of controlProc DAF TST.L (A0) ;needs reloading? BNE.S SkipCLoad ;if not,skip @@ -497,7 +489,12 @@ SkipCLoad _GetHandleSize ; How big is our CDEF Handle fau cmp.l #32,D0 ; Is it "small" chp bhi.s @RealCDEF ; no, don't flush the cache fau - jsr ([jCacheFlush]) ; else, flush the caches. fau + move.l A0,-(SP) + move.l (A0),A0 + move.l D0,A1 + bsr.l FlushCRange ; else, flush the caches. fau + move.l (SP)+,A0 + @RealCDEF ; fau _HLock ; lock it down MOVE.L (A0),A0 ;get cDefProc ptr @@ -527,8 +524,6 @@ NoDControl GetCVariant ; DAF MOVE.L 4(SP),A0 ; get ctl handle - TST.B MMU32Bit ; are we in 32-Bit mode? DAF - BEQ.S @1 ; no, so do it the old way DAF SUBQ #6,SP ; leave room for result and boolean DAF MOVE.L A0,-(SP) ; push the controlHandle DAF PEA 6(SP) ; point to result placeholder DAF @@ -538,12 +533,7 @@ GetCVariant ; DAF MOVE.L (A0),A0 ; get the auxRecPtr DAF CLR.W D0 ; clear top byte DAF MOVE.B acReserved(A0),D0 ; get variant code DAF<1.6> - BRA.S @2 ; DAF -@1 - MOVE.L (A0),A0 ; get ctl ptr - MOVE.B ContrlDefHandle(A0),D0 ; get selector parameter - AND.W #$000F,D0 ; lo nybble only -@2 + MOVE.W D0,8(SP) ; return result MOVE.L (SP)+,A0 ; get return addr ADDQ #4,SP ; flush parameters @@ -569,18 +559,10 @@ EraseControl _NewRgn ;allocate a new region MOVE.L (SP),A4 ;keep the region in A4, keep on stack - TST.B MMU32Bit ;are we in 32-bit mode? <1.3> - BEQ.S @24bit ;no, donÕt call new message <1.3> MOVEQ #CalcWholeCtlMsg,D0 ;message is calculate whole regions <1.2> MOVE.L A4,D1 ;the region is the parameter <1.2> - BSR.S CallControl ;send it the message <1.2> - BRA.S @doneCalc ; <1.2> -@24bit ; <1.3> - MOVEQ #CalcCtlMsg,D0 ;message is calculate regions - MOVE.L A4,D1 ;the region is the parameter - BCLR #31,D1 ;hi-bit clear means whole thing - BSR.S CallControl ;send it the message -@doneCalc + BSR CallControl ;send it the message <1.2> + ; ; paint white to erase control and add it to the windowÕs update region ; @@ -657,9 +639,6 @@ DontEraseControl ; <3> MOVE.L (A0),A0 ; get auxCtlRec ptr MOVE.L acCTable(A0),-(SP) ; push default colors hndl <1.6> - TST.B MMU32Bit ; are we in 32-bit mode? <1.4/DAF> - BEQ.S @CtlRec24 ; nope, so get rid of it the easy, old-fashioned way <1.4/DAF> - LEA AuxCtlHead,A1 ; get the head of the auxCtlList (offset is zero so this works!) @10 MOVE.L (A1),A2 ; get the handle to the auxCtlRec @@ -684,11 +663,6 @@ DontEraseControl ; <3> MOVE.L A2,A0 ; release the auxCtlRec _DisposHandle ; ADDQ #4,SP ; get rid of the extra window pointer pushed above - BRA.S @CtlRecDone ; - -@CtlRec24 - _SetCtlColor ; set this controlÕs colors to default (and delete) -@CtlRecDone ; ; delete it from the windowÕs controlList @@ -991,7 +965,7 @@ GetCTitle MOVEQ #0,D0 ;clear high part MOVE.B (A0),D0 ;get length of string ADDQ.L #1,D0 ;include the length byte, too - _BLOCKMOVE ;move it in place + _BLOCKMOVEDATA ;move it in place RTS ;all done! ; ; PROCEDURE SetCTitle(theControl: controlHandle; theTitle: Str255); @@ -1034,7 +1008,7 @@ CopyCTitle ; <3> MOVE.L (A3),A1 ;get control pointer LEA ContrlTitle(A1),A1 ;point to title string ADDQ #1,D0 ;dont forget the length byte - _BlockMove ;move it in + _BlockMoveData ;move it in ; ; make it visible if it used to be ; @@ -1221,8 +1195,6 @@ DragCon1 ; JSR GetNewRgn ;allocate a new region - TST.B MMU32Bit ;are we in 32-bit mode? <1.3> - BEQ.S @24bit ;no, donÕt call new message <1.3> MOVEQ #CalcWholeCtlMsg,D0 ;message is calculate whole regions <1.2> TST.W DragFlag ;if weÕre called as real MoveControl, <1.2> BEQ.S @0 ;then we picked the right message <1.2> @@ -1230,16 +1202,7 @@ DragCon1 @0 ; <1.2> MOVE.L (SP),D1 ;the region is the parameter <1.2> BSR.S CallControl ;send it the message <1.2> - BRA.S @doneCalc ; <1.2> -@24bit ; <1.3> - TST.W DragFlag ;if weÕre called as real MoveControl, - SNE (SP) ;high bit off means we want whole thing - MOVE.L (SP),D1 ;parameter goes in D1 - MOVEQ #CalcCtlMsg,D0 ;tell controlProc to calculate it regions - BSR CallControl ;tell the control about it -; - CLR.B (SP) ;clear high byte of region -@doneCalc + MOVE.L (SP)+,A4 ;keep it in A4 ; ; set up the parameters for dragging the region around (careful -- extra reg diff --git a/Toolbox/DataAccessMgr/DataAccessMgr.make b/Toolbox/DataAccessMgr/DataAccessMgr.make index dca8355..589e77b 100644 --- a/Toolbox/DataAccessMgr/DataAccessMgr.make +++ b/Toolbox/DataAccessMgr/DataAccessMgr.make @@ -25,8 +25,8 @@ DataAccessRTTObjs = "{ObjDir}DataAccessResultsHandlers.a.o" DataAccessCompObjs = "{ObjDir}DataAccessCompletion.a.o" -"{LibDir}DataAccessMgr.lib" Ä "{ObjDir}DataAccessPackEntry.a.o" - Lib {StdLibOpts} -o "{Targ}" "{ObjDir}DataAccessPackEntry.a.o" +# "{LibDir}DataAccessMgr.lib" Ä "{ObjDir}DataAccessPackEntry.a.o" +# Lib {StdLibOpts} -o "{Targ}" "{ObjDir}DataAccessPackEntry.a.o" "{RsrcDir}DataAccessMgr.rsrc" ÄÄ {DataAccessMgrPackObjs} diff --git a/Toolbox/DataAccessMgr/DataAccessPackEntry.a b/Toolbox/DataAccessMgr/DataAccessPackEntry.a index 93882cc..7e5fdf7 100644 --- a/Toolbox/DataAccessMgr/DataAccessPackEntry.a +++ b/Toolbox/DataAccessMgr/DataAccessPackEntry.a @@ -47,7 +47,8 @@ Pack13Globals EQU ExpandMemRec.emPack13Globals @globalsOK MOVE.L Pack13Handle,A0 ; A0 = handle to PACK MOVE.L ExpandMem, A1 ; A1 = expanded memory area ADD.W #Pack13Globals,A1 ; A1 = pointer to PACK use count - _ProcHelper ; let ProcHelper take over + MOVE.L $668, -(SP) + RTS ; ; Attempt to call Database Access Manager before InitDBPack diff --git a/Toolbox/DeskMgr/DeskMgr.a b/Toolbox/DeskMgr/DeskMgr.a index 89daad6..679f4d3 100644 --- a/Toolbox/DeskMgr/DeskMgr.a +++ b/Toolbox/DeskMgr/DeskMgr.a @@ -237,6 +237,8 @@ SearchWindow MOVE windowKind(A0),D0 ; get the unit number from window BPL.S noGoodSearch ; if not sys. kind, ignore it NOT D0 ; flip it (bitwise) + CMP UnitNtryCnt,D0 + BPL.S noGoodSearch ASL #2,D0 ; * 4 MOVE.L UTableBase,A0 ; point to the driver table MOVE.L 0(A0,D0),A0 ; get the handle @@ -255,12 +257,12 @@ SendDrvrMsg MOVEQ #64,D0 ;message 64 is "feedEvent" ; SendDCommon - LINK A6,#-32 ;get some space for the control p-block - LEA IORefNum-32(A6),A0 ;point A0 at the block + LINK A6,#-$32 ;get some space for the control p-block + LEA IORefNum-$32(A6),A0 ;point A0 at the block MOVE.W DCtlRefNum(A1),(A0)+ ;set up the refNum MOVE.W D0,(A0)+ ;set up the control "opCode" MOVE.L A3,(A0) ;set up event ptr as parameter - LEA -32(A6),A0 ;point to pBlock + LEA -$32(A6),A0 ;point to pBlock _Control ,IMMED ;make the control call ; UNLK A6 ;de-allocate parameter block @@ -304,11 +306,11 @@ DiskHandler tst.w EvtMessage(A3) ;if an Eject event, jsr (A0) ;eject the disk bra.s DoneSysEvt ;mark as taken, no error -@1 SUB.W #24,SP ;allocate 24 bytes on stack +@1 SUB.W #64,SP MOVE.L SP,A0 ;point to it MOVE.W EvtMessage+2(A3),IODrvNum(A0) ;get the "disk ID" parameter _MountVol ;tell OS to do its thing - ADD.W #24,SP ;deallocate space on stack + ADD.W #64,SP ;deallocate space on stack MOVE.W D0,EvtMessage(A3) ;return result to application BRA DoneSEvt ;always return "FALSE" @@ -652,10 +654,14 @@ SystemTask ; begin roll-in HMSystemTaskPatch patch <11> - IMPORT ptchHMGetBalloons ; <11> + MOVE.L ExpandMem,A0 + MOVE.L $78(A0),D0 + BEQ.S @BalloonsOff - JSR ptchHMGetBalloons ; what is the state of What Is? mode? <11> - BEQ.S @BalloonsOff ; no, let's not scan for a content window <11> + CLR -(SP) + _HMGetBalloons + TST.B (SP)+ + BEQ.S @BalloonsOff SUBQ #2,SP ; make room for a dummy OSErr <11> _HMBalloonBulk ; <11> @@ -668,7 +674,7 @@ SystemTask IMPORT NMTask ; JSR NMTask ;Give time to Notification Manager - MOVEM.L D3/A3,-(SP) ;save some work registers + MOVEM.L D2-D4/A3-A4,-(SP) ;save some work registers ; ; if this is a re-entrant call, just punt ; @@ -701,7 +707,9 @@ SystemTask NotSWindow MOVE.L UTableBase,A3 ;point to the driver table + MOVE.L A3,A4 MOVE.W UnitNtryCnt,D3 ;get number of entries + MOVE.L D3,D4 ; ; here is the main loop for SystemTask. For each driver that's installed, see if ; it needs time. If so, send it the RUN message. @@ -729,9 +737,10 @@ SysTLoop MOVEQ #0,D0 ;zero high part of D0 MOVE.W DCtlDelay(A1),D0 ;get delay tick count BEQ.S DoItNow ;if zero, always do it - ADD.L DCtlCurTicks(A1),D0 ;figure out next time to call it - CMP.L Ticks,D0 ;has that time passed yet? - BGT.S NextTSys ;if not, don't call it + MOVE.L Ticks,D2 + SUB.L DCtlCurTicks(A1),D2 + CMP.L D0,D2 + BCS.S NextTSys ; ; its time to give it a call ; @@ -741,12 +750,18 @@ DoItNow ; ; here is the bottom of the main loop. See if there are any more entries to process ; + CMP.L UTableBase,A4 + BNE.S NotSWindow + + CMP UnitNtryCnt,D4 + BNE.S NotSWindow + NextTSys SUBQ.W #1,D3 BGT.S SysTLoop ;loop if there's more to do _SetPort ;restore it CLR.B TaskLock ;flag that we're done -TaskDone MOVEM.L (SP)+,D3/A3 ;restore work registers +TaskDone MOVEM.L (SP)+,D2-D4/A3-A4 ;restore work registers RTS ;return to caller ; ; PROCEDURE SystemMenu(menuResult: LongInt); @@ -774,8 +789,8 @@ SystemMenu SWAP D1 ;put the high word back MOVE.L D1,-(SP) ;move it onto the stack PEA (SP) ;push the address - IMPORT CHANGEMENURESULTFORINPUTMETHOD - JSR CHANGEMENURESULTFORINPUTMETHOD ;and send it to the input method + MOVE #35,D0 + _TSMDispatch ;and send it to the input method ADDQ #4,SP ;get rid of space for menuresult MOVE.L (SP)+,(SP) ;strip parameter RTS ;return to caller @@ -893,8 +908,8 @@ DoneSEdit OpenDeskAcc CLR.W 8(SP) ;return 0 as the default - SUB #32,SP ;get 32 bytes for a parameter block - MOVE.L 36(SP),IOFileName(SP) ;set up name + SUB #$32,SP ;get 32 bytes for a parameter block + MOVE.L $36(SP),IOFileName(SP) ;set up name CLR.W IODrvNum(SP) ;use default volume MOVE.W #$0040, IOFileType(SP) ;clear type byte, special permissions to ID OpenDeskAcc CLR.L IOOwnBuf(SP) ;use system buffer @@ -904,7 +919,7 @@ OpenDeskAcc BNE.S DoneOpenDAcc ;if an error, don't return refNum MOVE.W IORefNum(SP),D0 ;get the refNum - MOVE D0,40(SP) ;return the refNum + MOVE D0,$3A(SP) ;return the refNum ; figure out the DCE ptr @@ -926,7 +941,7 @@ OpenDeskAcc _ShowWindow ;show it! DoneOpenDAcc - ADD.W #32,SP ;strip the pBlock + ADD.W #$32,SP ;strip the pBlock MOVE.L (SP)+,(SP) ;strip parameter RTS @@ -935,11 +950,11 @@ DoneOpenDAcc CloseDeskAcc MOVE.W 4(SP),D0 ;get the refNum - SUB #30,SP ;get space for param block + SUB #$32,SP ;get space for param block MOVE.W D0,IORefNum(SP) ;set up refNum MOVE.L SP,A0 _Close ;close it! - ADD #30,SP ;pop off param block + ADD #$32,SP ;pop off param block TwoByteExit MOVE.L (SP)+,A0 ADDQ #2,SP diff --git a/Toolbox/DialogMgr/DialogMgr.make b/Toolbox/DialogMgr/DialogMgr.make index 47356d9..cf754c2 100644 --- a/Toolbox/DialogMgr/DialogMgr.make +++ b/Toolbox/DialogMgr/DialogMgr.make @@ -19,8 +19,8 @@ DialogMgrObjects = "{ObjDir}DialogMgr.a.o" "{ObjDir}DialogDispatch.a.o" -"{LibDir}DialogMgr.lib" Ä {DialogMgrObjects} - Lib {StdLibOpts} -o "{Targ}" {DialogMgrObjects} +# "{LibDir}DialogMgr.lib" Ä {DialogMgrObjects} +# Lib {StdLibOpts} -o "{Targ}" {DialogMgrObjects} "{ObjDir}DialogMgr.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/Toolbox/DisplayMgr/DisplayMgr.make b/Toolbox/DisplayMgr/DisplayMgr.make index 1c78b94..f056098 100644 --- a/Toolbox/DisplayMgr/DisplayMgr.make +++ b/Toolbox/DisplayMgr/DisplayMgr.make @@ -52,8 +52,8 @@ DisplayMgrCOpts = -b2 {StdCOpts} -i {DisplayMgrDir} -i {ProcessMgrDir} DisplayMgrAOpts = {StdAOpts} -"{DispalyMgrLibDir}DisplayMgr.lib" Ä {DisplayObjs} - Lib {LibWarnings} -o {Targ} {DisplayObjs} +# "{DispalyMgrLibDir}DisplayMgr.lib" Ä {DisplayObjs} +# Lib {LibWarnings} -o {Targ} {DisplayObjs} "{DispalyMgrLibDir}DisplayMgrExtensionLib.o" Ä {DisplayExtensionObjs} diff --git a/Toolbox/ExpansionBusMgr/ExpansionBusMgr.Make b/Toolbox/ExpansionBusMgr/ExpansionBusMgr.Make index c45fd4a..3972c9e 100644 --- a/Toolbox/ExpansionBusMgr/ExpansionBusMgr.Make +++ b/Toolbox/ExpansionBusMgr/ExpansionBusMgr.Make @@ -24,8 +24,8 @@ ExpansionBusObjs = "{ObjDir}ExpansionBusMgr.a.o" ExpansionBusMgrCOpts = -b2 {StdCOpts} -i {ExpansionBusMgrDir} ExpansionBusMgrAOpts = {StdAOpts} -"{ExpansionBusMgrLibDir}ExpansionBusMgr.lib" Ä {ExpansionBusObjs} - Lib {LibWarnings} -o {Targ} {ExpansionBusObjs} +# "{ExpansionBusMgrLibDir}ExpansionBusMgr.lib" Ä {ExpansionBusObjs} +# Lib {LibWarnings} -o {Targ} {ExpansionBusObjs} "{ObjDir}ExpansionBusMgr.a.o" Ä "{ObjDir}StandardEqu.d" ¶ "{ExpansionBusMgrDir}ExpansionBusMgr.a" diff --git a/Toolbox/FontMgr/FontMgr.make b/Toolbox/FontMgr/FontMgr.make index 572f95f..ad1c8c4 100644 --- a/Toolbox/FontMgr/FontMgr.make +++ b/Toolbox/FontMgr/FontMgr.make @@ -61,8 +61,8 @@ FontMgrObjs = "{ObjDir}fnt.c.o" "{ObjDir}FontMgr.a.o" -"{LibDir}FontMgr.lib" Ä {FontMgrObjs} - Lib {StdLibOpts} {FontMgrObjs} -o "{Targ}" +# "{LibDir}FontMgr.lib" Ä {FontMgrObjs} +# Lib {StdLibOpts} {FontMgrObjs} -o "{Targ}" "{ObjDir}FontFolderExtension.a.o" Ä "{IntAIncludes}LinkedPatchMacros.a" ¶ diff --git a/Toolbox/GetMgr/GetMgr.a b/Toolbox/GetMgr/GetMgr.a index 31eda02..96ce8a9 100644 --- a/Toolbox/GetMgr/GetMgr.a +++ b/Toolbox/GetMgr/GetMgr.a @@ -181,13 +181,14 @@ VisState EQU -1 ; flag for resource's vis state DAF Align EQU -2 ; another byte to re-align stack frame DAF IsACPort EQU -4 ; flag for color port -GetNewCWindow LINK A6,#IsACPort ; build stack frame - MOVE #-1,IsACPort(A6) ; flag the color port +GetNewCWindow MOVEQ.L #-1,D0 ; color port BRA.S GNWShare ; =>dive into common code -GetNewWindow LINK A6,#IsACPort ; build stack frame - CLR IsACPort(A6) ; flag black and white port -GNWShare MOVE.L A3,-(SP) ; preserve a work register +GetNewWindow MOVEQ.L #0,D0 ; black and white port + +GNWShare LINK A6,#IsACPort ; build stack frame + MOVE D0,IsACPort(A6) ; flag port + MOVE.L A3,-(SP) ; preserve a work register CLR.L result(A6) ; set result to NIL SUBQ #4,SP ; make space for result @@ -496,18 +497,18 @@ LoadMDEF MOVE.W #MapTRUE,ROMMapInsert ; get the MDEF from the ROM map _GetResource ; get it! - MOVE.L (A3),A0 ; get pointer to menu - MOVE.L (SP)+,MenuDefHandle(A0) ; install the defProc handle (which may be NIL) - - MOVE.L A3,-(SP) ; push the menu handle - _CalcMenuSize ; calculate the size of the menu - ; ; Now try to load a menu color table with the same ID as the menu's ; move.b #1, -(sp) ; force Resource Load to true _SetResLoad + MOVE.L (A3),A0 ; get pointer to menu + MOVE.L (SP)+,MenuDefHandle(A0) ; install the defProc handle (which may be NIL) + + MOVE.L A3,-(SP) ; push the menu handle + _CalcMenuSize ; calculate the size of the menu + subq #4, sp ; make room for the result move.l #'mctb', -(sp) ; push resource type move.w 8(a6), -(sp) ; push menuID @@ -584,6 +585,7 @@ GetNewMBar ; loop, getting and inserting one menu at a time + BRA.S skipAllThis GetMBLoop SUBQ #4,SP ;make room for result MOVE.L (A3),A0 ;get pointer to mBarDef @@ -595,8 +597,9 @@ GetMBLoop CLR.W -(SP) ;insert at end of menuBar _InsertMenu - MOVE.L (A3),A0 ;get ptr to mBarDef ADDQ #1,D3 ;bump to next menu +skipAllThis + MOVE.L (A3),A0 ;get ptr to mBarDef CMP (A0),D3 ;done yet BLT.S GetMBLoop ;loop until done diff --git a/Toolbox/MenuMgr/MenuMgr.make b/Toolbox/MenuMgr/MenuMgr.make index ca51e1d..a86ae09 100644 --- a/Toolbox/MenuMgr/MenuMgr.make +++ b/Toolbox/MenuMgr/MenuMgr.make @@ -29,8 +29,8 @@ MenuMgrObjs = "{ObjDir}MenuMgr.a.o" Link {StdLOpts} {StdAlign} -rt MDEF=0 -o "{Targ}" "{ObjDir}StandardMDEF.a.o" || Exit 1 -"{LibDir}MenuMgr.lib" Ä {MenuMgrObjs} - Lib {StdLibOpts} -o "{Targ}" {MenuMgrObjs} +# "{LibDir}MenuMgr.lib" Ä {MenuMgrObjs} +# Lib {StdLibOpts} -o "{Targ}" {MenuMgrObjs} "{ObjDir}StandardMDEF.a.o" Ä "{ObjDir}StandardEqu.d" ¶ diff --git a/Toolbox/Munger/Munger.a b/Toolbox/Munger/Munger.a index 8d6c990..15c8b85 100644 --- a/Toolbox/Munger/Munger.a +++ b/Toolbox/Munger/Munger.a @@ -267,7 +267,7 @@ bm ; local, faster block move <4May85> SUBQ.L #1,D0 ; only move <=1 byte? <4May85> BLE.S @0 ; small move? <4May85> ADDQ.L #1,D0 ; fix up subtract above <4May85> - _BlockMove ; move 'em on out <4May85 + _BlockMoveData ; move 'em on out <4May85 RTS ; adios <4May85> @0 ; <4May85> BLT.S zeroErr ; nothing to move <4May85> @@ -324,7 +324,7 @@ doDelete ADD.L D3,A0 ; l1 BSR bm ; use our blockmove <4May85> -; _BlockMove ; <4May85> +; _BlockMoveData ; <4May85> MOVE.L A2,A0 ; reset size MOVE.L D5,D0 ; new size @@ -483,7 +483,7 @@ clone2Common ADD.L D2,A0 ; add in offset (=0 most times) EXG A0,A1 ; switch source/dest MOVE.L D1,D0 ; restore length - _BlockMove ; counts on D0 being returned 0 + _BlockMoveData ; counts on D0 being returned 0 MOVE.L (SP)+,A0 ; get handle for return noRoom diff --git a/Toolbox/NotificationMgr/NotificationMgr.make b/Toolbox/NotificationMgr/NotificationMgr.make index fdda2ac..65256eb 100644 --- a/Toolbox/NotificationMgr/NotificationMgr.make +++ b/Toolbox/NotificationMgr/NotificationMgr.make @@ -16,8 +16,8 @@ NotificationMgrObjs = "{ObjDir}NotificationMgr.c.o" "{ObjDir}SetProcessorLevel.a.o" -"{LibDir}NotificationMgr.lib" Ä {NotificationMgrObjs} - Lib {StdLibOpts} -o "{Targ}" {NotificationMgrObjs} +# "{LibDir}NotificationMgr.lib" Ä {NotificationMgrObjs} +# Lib {StdLibOpts} -o "{Targ}" {NotificationMgrObjs} diff --git a/Toolbox/ResourceMgr/ResourceMgr.a b/Toolbox/ResourceMgr/ResourceMgr.a index a47e154..44ed185 100644 --- a/Toolbox/ResourceMgr/ResourceMgr.a +++ b/Toolbox/ResourceMgr/ResourceMgr.a @@ -1011,9 +1011,6 @@ RMGRVersion DC.W 1 ; Resource Manager version number InitRSRCMgr ST SysMap ; flag that resources are not inited CLR.L TopMapHndl ; tell the res mgr that it's start time - Move.B MMFlags,-(SP) ; save the memory Manager flag - BSET.B #MMStartMode,MMFlags; set for 32 bit system heap - move.l ExpandMem,a0 ; init override flags kc clr.b ExpandMemRec.emScanOverrideMaps(a0) ; turn off ScanOverrideMaps kc clr.w ExpandMemRec.emLastMapOverridden(a0) ; flush override cache. kc @@ -1023,7 +1020,6 @@ InitRSRCMgr ST SysMap ; flag that resources are not inited _InitResources ; Init ROM resource file ADDQ #2, SP ; Assume success - MOVE.B (SP)+,MMFlags ; restore memory manager flag RTS @@ -1109,7 +1105,7 @@ InitResources ;_______________________________________________________________________________ ; -; Routine: RomOverRide (utility) +; Routine: RomOverRide 65446 (utility) ; ; Arguments: None ; @@ -1126,13 +1122,41 @@ ROVR EQU $524F7672 ; ROVR = 'ROvr' (type of override rsrc) RomOverRide ; new routine <27aug85> BBM SUBQ #4,SP ; Save room on stack for handle - MOVE.L #ROVR,-(SP) ; rsrc type for override + PEA ROVR ; rsrc type for override + MOVE.W #0,-(SP) ; rsrc ID of 0 + MOVE #-1,RomMapInsert + _GetResource ; get the override rsrc + SUBQ #4,SP ; Save room on stack for handle + PEA ROVR ; rsrc type for override MOVE.W #0,-(SP) ; rsrc ID of 0 _GetResource ; get the override rsrc + MOVEQ.L #0,D1 MOVE.L (SP)+,D0 ; Check to see if it exists - BEQ.S ROvrOut ; if handle is zero then just return + BEQ.S @Lx MOVE.L D0,A0 ; get ready to execute this resource MOVE.L (A0),A0 ; dereference handle + + Move $8(A0), D1 +@Lx MoveA.L (SP)+, A1 + Move.L A1, D2 + BEQ.S @L0 + MoveA.L (A1), A0 + Move $8(A0), D2 +@L0 Cmp D2, D1 + BHI.S @L2 + Tst.L D0 + BEQ.S @L1 + Cmp.L A1, D0 + BEQ.S @L1 + Move.L A1, -(SP) + Move.L D0, -(SP) + _ReleaseResource + MoveA.L (SP)+, A1 +@L1 Move.L A1, D0 + BEQ.S ROvrOut +@L2 MoveA.L D0, A0 + MoveA.L (A0), A0 + FPCallROvr ; FlashPort hint attachment point JSR (A0) ; and execute handle ROvrOut RTS ; and return @@ -1280,7 +1304,7 @@ ReDoMap ; new routine moveq #$20,d0 ; size of null map lea NullRF,a0 ; get null map from rom move.l (A4),A1 ; Dereference handle to destination - _BlockMove ; move map down + _BlockMoveData ; move map down move.w #1,MRefNum(a1) ; and stuff the rom map refnum (so getcurmap works) clr.w -(sp) ; get a buffer on the stack to read in index @@ -1783,7 +1807,7 @@ vNewMap ; Def to build dispatch entry <27oct85> BBM ADDA.L #HdrSize,A0 ; ... finish calc for source LEA HSCache,A1 ; Destination for blockmove MOVE.L #PreSize,D0 ; size for blockmove <11jul85> BBM - _BlockMove ; move the key data to the stack + _BlockMoveData ; move the key data to the stack MOVEA.L A0,A1 ; restore A1 SUBA.L #HdrSize,A1 ; ... finish restoring A1 BSR PreFormat ; check the preload format of this file CSS @@ -1824,7 +1848,7 @@ vNewMap ; Def to build dispatch entry <27oct85> BBM ; a new map is first created and only set after the appropriate Resource overrides ; calls have been made. - andi.b #kAllButOverrideAttributesMask,mInMemoryAttr(a1) + andi.b #kDecompressionPasswordMask,mInMemoryAttr(a1) ; Successful load. Return with D6=refnum of file and D0=1 for "newmap" flag @@ -4572,7 +4596,7 @@ vCheckLoad ; Def to build dispatch entry tst.b (sp)+ bne.s @system_rsrc ; if so, branch move.l (a4),a0 ; a0 <- ptr to map - btst.b #mapForceSysHeap,MAttr(a0) ; should all entries in map go in system heap? + btst.b #overrideNextMapBit,MAttr(a0) ; should all entries in map go in system heap? beq.s @GoOnCheckLoad ; if not, branch @system_rsrc bset #ResSysHeap,RAttr(a2) ; get into the system heap (and stay there!) @@ -5806,7 +5830,7 @@ LoadResource MOVE.L D0,A0 ; handle in A0 MOVE.L ROMBASE,A1 CMP.L (A0),A1 ; resource in ROM - BPL.S @2 ; Nope + BHI.S @2 ; Nope CLR.W ResErr ; since we found a ROM resource, and we assume it is ok. CSS BRA.S @9 ; yes, done @2 @@ -6324,7 +6348,7 @@ CopyStr MOVEQ #0, D0 ; Zero high order bits. MOVE.B (A0), D0 ; Get length of string ADDQ.W #1, D0 ; include length byte. <14jun85> BBM - _BlockMove ; Copy the string to A1 + _BlockMoveData ; Copy the string to A1 RTS ; and return. ;_______________________________________________________________________________ diff --git a/Toolbox/ResourceMgr/ResourceMgrExtensions.a b/Toolbox/ResourceMgr/ResourceMgrExtensions.a index c60128e..d0f574a 100644 --- a/Toolbox/ResourceMgr/ResourceMgrExtensions.a +++ b/Toolbox/ResourceMgr/ResourceMgrExtensions.a @@ -922,7 +922,7 @@ ValidateFontResourceIDs Proc Export beq.s @checkForNFNTs ; cmpi.l #'NFNT',d3 ; If it is a NFNT, also check for FONT conflicts beq.s @checkForFONTs ; - bra.s @nextTableEntry ; If it is a sfnt or other, go on to the next one. + bra @nextTableEntry ; If it is a sfnt or other, go on to the next one. @checkForFONTs subq #4,sp ; @@ -930,7 +930,7 @@ ValidateFontResourceIDs Proc Export move.w 4(a3),-(sp) ; Look for this ID. _GetResource ; Does it exist? move.l (sp)+,d0 ; - bz.s @nextTableEntry ; This number is fine + bz @nextTableEntry ; This number is fine bra.s @conflictOccured @checkForNFNTs @@ -939,7 +939,7 @@ ValidateFontResourceIDs Proc Export move.w 4(a3),-(sp) ; Look for this ID. _GetResource ; Does it exist? move.l (sp)+,d0 ; - bz.s @nextTableEntry ; This number is fine + bz @nextTableEntry ; This number is fine @conflictOccured move.l d0,a0 ; <46> @@ -965,6 +965,27 @@ ValidateFontResourceIDs Proc Export ; Make sure this ID is not used in the resource map. ; + cmpi.l #'FONT',D3 + beq.s @isFONT + cmpi.l #'NFNT',D3 + beq.s @isNFNT + bra.s @isNeither + +@isNFNT subq #4,SP + move.l #'FONT',-(SP) + move D2,-(SP) + _GetResource + move.l (SP)+,D0 + beq.s @isNeither + bra.s @getUniqueID +@isFONT subq #4,SP + move.l #'NFNT',-(SP) + move D2,-(SP) + _GetResource + move.l (SP)+,D0 + bne.s @getUniqueID +@isNeither + move.l mapToRenumber(a6),TopMapHndl ; <29> Make sure weÕre reading out of the right map move.w refNum(a6),CurMap subq #4,sp @@ -974,6 +995,28 @@ ValidateFontResourceIDs Proc Export move.l (sp)+,d0 ; Check it out bnz.s @getUniqueID ; Try again + cmpi.l #'FONT',D3 + beq.s @isFONT2 + cmpi.l #'NFNT',D3 + beq.s @isNFNT2 + bra.s @@isNeither + +@isNFNT2 subq #4,SP + move.l #'FONT',-(SP) + move D2,-(SP) + _GetResource + move.l (SP)+,D0 + beq.s @@isNeither + bra @getUniqueID +@isFONT2 subq #4,SP + move.l #'NFNT',-(SP) + move D2,-(SP) + _GetResource + move.l (SP)+,D0 + beq.s @@isNeither + bra @getUniqueID +@@isNeither + ; We have a unique ID. Put it and the original in the from-to list. move.w d2,-(sp) ; <57> Pass new ID @@ -1131,26 +1174,6 @@ ReleaseTheFont Proc Export jmp (a0) ; Return to the caller EndProc -;____________________________________________________________________________________________________ -; <53> SetDeanBitIfResourceWillBeLoaded -; -; This routine checks to see if the resource reference entry already contains a handle -; or not. If it does, DeanBit is cleared. If there is no handle (ie, the resource will -; be loaded this time) set DeanBit. This allows people to determine whether they loaded -; a resource, or if someone else did. -; - -SetDeanBitIfResourceWillBeLoaded PatchProc jCheckLoad - tst.l RHndl(a2) ; See if a master pointer has already been allocated - bz.s @setDeanBit - bclr #kDeanBit,kBrianBits ; A master pointer has already been allocated - bra.s @goLoadTheResource -@setDeanBit - bset #kDeanBit,kBrianBits ; WeÕll be loading the resource right now -@goLoadTheResource - jmpOld ; Load the resource - EndProc - ;____________________________________________________________________________________________________ ; <48> CloseResFileUnderSystemMap(refNum: Integer); ; @@ -1512,7 +1535,7 @@ IsThisASystemResourceMap Proc Export move.l d1,a0 move.l (a0),a0 move.w mRefNum(a0),d0 ; Get the file reference number of this map - bsr GetPSNFromParallelFCB ; <60> Get the parallel FCB info + bsr.l GetPSNFromParallelFCB ; <60> Get the parallel FCB info ; I really should use EqualProcess, but the Process Manager might not be around yetÉ @@ -1540,6 +1563,29 @@ IsThisASystemResourceMap Proc Export ; people are picky about how long they can play Tetris on the airplaneÉ GetPSNFromParallelFCB Proc Export + movea.l FSVarsPtr,A0 + btst.b #3,FSVars.fsFlags(A0) + beq.s @dontHitFS + + sub #$32,SP + movea.l SP,A0 + cmp #$3,D0 + bne.s @L0 + moveq.l #$2,D0 +@L0 move D0,$18(A0) + moveq.l #$50,D0 + _HFSDispatch + cmp #$0,D0 + bne.s @L1 + movea.l $1C(A0),A0 + bra.s @L2 +@L1 lea.l 0,A0 + +@L2 dc.w $defc, $0032 + ;add #$32,SP ; can't seem to make this look right! + rts + +@dontHitFS andi.l #$FFFF, d0 ; only the low word is passed. divu.w FSFCBLen,d0 ; convert refnum to an index movea.l FSVarsPtr,a0 ; get address of HFS variable area @@ -1566,7 +1612,7 @@ MarkFileAsOwnedByTheSystem Proc Export Import GetPSNFromParallelFCB move.l a0,-(sp) ; Preserve A0 - bsr GetPSNFromParallelFCB + bsr.l GetPSNFromParallelFCB clr.l (a0)+ ; Clear high word of PSN move.l #kSystemProcess,(a0) ; Set the low word move.l (sp)+,a0 ; Restore A0 @@ -1950,7 +1996,7 @@ MakeOverrideMap Proc Export exg a2,a1 ; Swap reference entry and 'rovm' pointer move.l #RESize,d0 - _BlockMove ; Copy reference data + _BlockMoveData ; Copy reference data clr.b RAttr(a0) ; clear the attributes for the resource (protected, etc.) ; diff --git a/Toolbox/ScrapMgr/ScrapMgr.a b/Toolbox/ScrapMgr/ScrapMgr.a index a7b6fc5..c8e29b9 100644 --- a/Toolbox/ScrapMgr/ScrapMgr.a +++ b/Toolbox/ScrapMgr/ScrapMgr.a @@ -383,6 +383,7 @@ ZeroScrap BSR StdEntry ; D0 set to 0 by above BNE err0Exit + MOVEQ.L #0,D0 MOVE.L D0,scrapInfo ; zero out info ADDQ #8,4(A4) ; increment validation word BPL.S @0 diff --git a/Toolbox/ScriptMgr/ScriptMgr.make b/Toolbox/ScriptMgr/ScriptMgr.make index 8369333..b90c06f 100644 --- a/Toolbox/ScriptMgr/ScriptMgr.make +++ b/Toolbox/ScriptMgr/ScriptMgr.make @@ -32,8 +32,8 @@ ScriptMgrObjects = "{ObjDir}ScriptMgrHeader.a.o" "{ObjDir}ScriptMgrDispatch.a.o" ¶ -"{LibDir}ScriptMgr.lib" Ä {ScriptMgrObjects} - Lib {StdLibOpts} -o "{Targ}" {ScriptMgrObjects} +# "{LibDir}ScriptMgr.lib" Ä {ScriptMgrObjects} +# Lib {StdLibOpts} -o "{Targ}" {ScriptMgrObjects} "{ObjDir}ScriptMgrDispatch.a.o" Ä "{IntAIncludes}ScriptPriv.a" ¶ diff --git a/Toolbox/SegmentLoader/SegmentLoader.a b/Toolbox/SegmentLoader/SegmentLoader.a index 8543797..48e0c7a 100644 --- a/Toolbox/SegmentLoader/SegmentLoader.a +++ b/Toolbox/SegmentLoader/SegmentLoader.a @@ -242,9 +242,7 @@ LoadSeg @37 ;Aren't we slick and tight? <02Nov85> JTC _HLock ; <23May85> NoMoveHHi - MOVE.L (A0),D0 ; handle -> dirty pointer - _StripAddress ; D0 <- clean ptr - MOVE.L D0,A0 ; + MOVE.L (A0),A0 ; handle -> dirty pointer MOVE.L A5,A1 ;copy world base address ADD.W CurJTOffset,A1 ;offset by the current offset @@ -448,7 +446,7 @@ fAVDone ; <27Mar85> ;------------------------------------------------------------------------------ ; -; PROCEDUREs Launch, Chain, ExitToShell: +; PROCEDUREs Launch, Chain, ExitToShell 2c22a: ; ; Here is the main part of the segment loader that actually launches ; an application. It opens the resource file specified by the input name, @@ -530,7 +528,7 @@ LaunchCom move.w (a3)+,CurPageOption ; <28Oct85> LEA CurApName,A1 ;get address to stuff the name MOVEQ #32,D0 ;move 32 bytes worth - _BlockMove ;move it in + _BlockMoveData ;move it in MOVEQ #0,D3 ; assume all flags are zero CMP.W #'LC',(A3)+ ; extension code around? @@ -570,7 +568,7 @@ SkipClose MOVE.L SP,A1 ;set up destination for move MOVE.L (A0),A0 ;set up source for move MOVE.L D0,-(SP) ;remember the size - _BlockMove ;move it! + _BlockMoveData ;move it! ; re-init the application heap zone, destroying the world... ; ...but just before, flush any vbl tasks executing out of that doomed land! <27Mar85> @@ -608,7 +606,7 @@ GoInitAZone MOVE.L D1,D0 ;get size for blockMove MOVE.L (A0),A1 ;get destination pointer MOVE.L SP,A0 ;get source pointer - _BlockMove ;move it in! + _BlockMoveData ;move it in! ADD.L D1,SP ;deallocate scrap save buffer @@ -728,7 +726,9 @@ ExitToShell ; <30Jan85> ; _CloseResFile ; CLR.W CurApRefNum - _PMgrExit ; Empty out the palette manager < 7Jul89> + MOVE #$C, D0 ; Empty out the palette manager < 7Jul89> + _PaletteDispatch + SUB.L A0,A0 ; clear out A0 <30Jan85> _SetGrowZone ; disable application's growZone handler <30Jan85> @@ -763,7 +763,7 @@ BadOpen ;------------------------------------------------------------------------------ -; PROCEDURE vLaunchInit; new +; PROCEDURE vLaunchInit 2c266; new ; ; Vectored utility to set up application world just before launching the app. ; Historically set $0 to be diag ROM rather than even more historical 'FOBJ' @@ -812,7 +812,7 @@ vLaunchInit ;------------------------------------------------------------------------------ ; -; PROCEDURE GetAppParms(VAR apName: Str255; +; PROCEDURE GetAppParms 2c298(VAR apName: Str255; ; VAR apRefNum: INTEGER; ; VAR apParam: Ptr) ; @@ -836,7 +836,7 @@ GetAppParms LEA CurApName,A0 ;point to name in low memory MOVEQ #32,D0 ;move 32 bytes - _BlockMove ;move it! + _BlockMoveData ;move it! RTS ;return to caller (params already stripped) diff --git a/Toolbox/ShutDownMgr/ShutDownMgr.a b/Toolbox/ShutDownMgr/ShutDownMgr.a index 07cb67e..6f658c1 100644 --- a/Toolbox/ShutDownMgr/ShutDownMgr.a +++ b/Toolbox/ShutDownMgr/ShutDownMgr.a @@ -333,6 +333,7 @@ sdBitPowerOff EQU 0 ; Call routine just before PowerOff. sdBitReStart EQU 1 ; Call routine just before a Reboot. sdBitUnMount EQU 2 ; Call routine before UnMounting Vols. sdBitDrivers EQU 3 ; before Driver Goodbye Kiss. +sdBitNew EQU 4 ; local equates @@ -343,7 +344,7 @@ SDHeader EQU $BBC ; low mem for ROM version ;_______________________________________________________________________ ; -; ShutDownINIT +; ShutDownINIT 2c330 ; Install default shutdown procedures in the shutdown queue. ; Will not stick around in System builds, but will be there for ROMs. ;_______________________________________________________________________ @@ -354,15 +355,27 @@ ShutInit PROC Export move.l A0,SDHeader pea DoDrivers ; the default routine to unload - move.w #SDOnUnMount,-(SP) ; all drivers with a goodbye + move.w #$8000|SDOnUnMount,-(SP) ; all drivers with a goodbye jsr ShutInstall ; install it in the queue pea DoUnmount ; the default routine to unmount volumes - move.w #sdRestartOrPower,-(SP) ; do before power-off or restart + move.w #$8000|$10,-(SP) ; do before power-off or restart + jsr ShutInstall + + pea DoSomethingAtRestartOrPower + move.w #$8000|sdRestartOrPower,-(SP) + jsr ShutInstall + + pea DoUnmountAtPowerDown + move.w #$8000|sdOnPowerOff,-(SP) + jsr ShutInstall + + pea DoUnmountAtRestart + move.w #$8000|sdOnRestart,-(SP) jsr ShutInstall pea ClearWarmStart - move.w #sdOnPowerOff,-(SP) ; only on 'shut down' <26> + move.w #$8000|sdOnPowerOff,-(SP) ; only on 'shut down' <26> jsr ShutInstall ; install it in the queue <26> Rts @@ -370,7 +383,7 @@ ShutInit PROC Export ;_______________________________________________________________________ ; -; Routine: ShutDown +; Routine: ShutDown 2c382 ; ; Arguments: A0 (input) : address of a ShutDown routine ; D0 (input) : command word (SDInit, SDPowerOff ...) @@ -392,23 +405,26 @@ ShutInit PROC Export ShutDown move.l (SP)+,D2 ; save return move.w (SP)+,D0 ; get opcode word move.l D2,-(SP) ; restore the return - subq #SDPowerOff,D0 - bcs.w ShutInit ; if d0=0, _SDInit a selector in ROM versions - beq ShutPower ; if d0=1, Shutdown - subq #SDInstall-SDPowerOff,D0 - bcs ShutRestart ; if d0=2, carry set, bra to restart - beq.s ShutInstall ; if d0=3, Install + cmp.w #5,D0 + bhi.s @unknownSelector + + move.w @tbl(d0*2),d0 + jmp @tbl(d0) + +@tbl dc.w ShutInit-@tbl ; 0 + dc.w ShutPower-@tbl ; 1 + dc.w ShutRestart-@tbl ; 2 + dc.w ShutInstall-@tbl ; 3 + dc.w ShutRemove-@tbl ; 4 + dc.w UserChoice-@tbl ; 5 - subq.w #sdUserChoice-sdInstall,d0 - bmi.s ShutRemove ;if d0=4, Remove - beq UserChoice ; if d0=5, User Choice @unknownSelector rts ; unknown selector (do nothing, assume no parameters) ;_______________________________________________________________________ ; -; ShutInstall - Installs a shutDown procedure in the SD Queue. +; ShutInstall 2c3a4 - Installs a shutDown procedure in the SD Queue. ; Entry On Stack: Long - Proc pointer, to install in Queue, call later. ; Word - Flags word, with low bits defining when to call proc. ; @@ -432,7 +448,7 @@ ShutInstall ;_______________________________________________________________________ ; -; ShutRemove - Removes a shutDown procedure in the SD Queue. +; ShutRemove 2c3c0 - Removes a shutDown procedure in the SD Queue. ; Entry: TOS - Proc pointer, to remove from the Queue. ; Exit: D0 - Error Code. ; @@ -476,7 +492,7 @@ ShutRemove ;_______________________________________________________________________ ; -; ShutRestart - do a shut-down and restart the system +; ShutRestart 2c3f6 - do a shut-down and restart the system ; ; Entry: no parameters ; Exit: never does. @@ -514,57 +530,118 @@ ShutRemove export ShutRestart + import SHUTDOWNMGRC_2CC90 ShutRestart with ROMHeader + bsr VersionCheckingFunc + beq.s @old + + bsr DoRAMDiskAlert + bne @return + + bsr FindEDisk + beq.s @old + + bsr KillEDisk + bra.s @old + +@return rts +@old + moveq #sdOnPowerOff,d5 ; Remove poweroff routines from the queue <13> bsr RemoveOtherRoutines moveq #SDBitRestart,D0 ; remember that we will reboot. + moveq #1,D1 bsr CallRoutines ; do the shutDown cleanup. - moveq #1,D5 ; Go ahead and hide cursor/close LCDs. - bsr BlankDesktop ; Go blank the desktop. - move.l ROMBase,A2 ; point to the ROM lea ROMHeader.Restart(A2),A2 ; point to the restart routine move.l #emuWarmStartConst,D0 ; Does the upper long match? move.l #WmStConst,D1 ; Does the upper long match? bsr UpdateEmuWarmstart ; Write the warmstart (We may have come from a shutdown...) - - tst.l VMGlobals ; Is VM running? - bmi.s @noVM ; -> No. Assume we're in Supervisor Mode - _EnterSupervisorMode ; Enter supervisor mode (donÕt worry about munging the stack...) -@noVM - bsr DockInitSCC ; reset the SCC (if we have Power controls) <3> - TestFor JawsExists ; are we running on a Tim machine with JAWS <5> HJR - beq.s @noJAWS ; -> No JAWS, jump to RESTART now. <43> - - with PmgrRec, pmCommandRec -@JawsRestartSeq ; -- Special Case for JAWS -- <5> HJR - move.l PMgrBase,a0 ; get pointer to the power manager globals - move.l HDVector(a0),a0 ; get pointer to hard disk power down - jsr (a0) ; kill the hard disk - lea -pmBlkSize(sp),sp ; Create stack frame - lea pmData(sp),a0 ; Get pointer to a xmit buffer - move.l a0,pmRBuffer(sp) ; Load pointer to receive buffer - move.l a0,pmSBuffer(sp) ; Load pointer to xmit buffer - clr.l (a0) ; No data - clr.w pmLength(sp) ; No data - move.w #$21,pmCommand(sp) ; ADB autopoll disable - move.l sp,a0 ; a0 get pointer to paramter block - _PmgrOp ; go kill the machine - clr.l pmData(a0) ; clear data - clr.w pmLength(a0) ; clear length - move.w #$d0,pmCommand(sp) ; reset CPU command - move.w Timedbra,d1 ; set-up our counter - lsl.w #2,d1 ; give ourselves 4 milliseconds - _PmgrOp ; go kill the machine - -@waitloop dbra d1,@waitloop ; stick around for 4 milliseconds - ; Fall into the JMP to Restart <43> +E_0 Bsr SHUTDOWNMGRC_2CC90 + MoveQ.L #$0, D0 + _DebugUtil + CmpI.L #$8, D0 + BLT.B @L0 + MoveQ.L #$8, D0 + _DebugUtil +@L0 Move.L #'pwrv', D0 + _Gestalt + BNE.B @L1 + Move.L A0, D0 + CmpI.L #$200, D0 + BLT.B @L1 + MoveQ.L #$20, D0 + _PowerDispatch +@L1 BTst.B #$0, (HWCfgFlags) + BEQ.B @L3 + BTst.B #$3, ($240A) + BNE.B @L3 + Clr.L -(A7) + Clr.L -(A7) + Move.L A7, -(A7) + Move.L (A7), -(A7) + Clr -(A7) + Move #$D0, -(A7) + MoveA.L A7, A0 + _PMgrOp + Lea.L $C(A7), A7 +@L2 Bra.B @L2 +@L3 BTst.B #$1, ($2400) + BNE.B @L4 + Bra.B @L6 +@L4 Move.L #$7000000, D0 + And.L (UnivROMFlags), D0 + SubI.L #$3000000, D0 + BNE.B @L6 + Lea.L -$14(A7), A7 + MoveA.L A7, A0 + Move.B #$1, (A0) + Move.B #$11, $1(A0) + Clr.L $10(A0) + _EgretDispatch + Lea.L $14(A7), A7 +@L5 Bra.B @L5 +@L6 BTst.B #$3, ($2409) + BEQ @L8 + Lea.L -$28(A7), A7 + Move.L A7, D0 + AddQ #$7, D0 + AndI.L #$FFFFFFF8, D0 + Move.L #$FFFFF000, D1 + Move.L D1, D2 + And.L D0, D2 + MoveA.L D0, A1 + Lea.L $F(A1), A1 + Move.L A1, D4 + And.L D4, D1 + Cmp.L D1, D2 + BEQ.B @L7 + Move.L D1, D0 +@L7 MoveA.L D0, A0 + Move.L ([$68FFEFD0.L],$50), (A0) ; NKHWInfo.RTAS_Restart + Clr.L $4(A0) + Move.L #$1, $8(A0) + MoveA.L A0, A1 + MoveQ.L #$10, D0 + DC.W $FE0C + MoveA.L A1, A0 + DC.W $FE20 + Lea.L $28(A7), A7 +@L8 MoveQ.L #$E, D0 + And.L (UnivROMFlags), D0 + CmpI.L #$8, D0 + BNE.B @noJAWS + MoveA.L ([$68FFEFD0.L],$30), A0 ; NKHWInfo.ADB_Base + BSet.B #$4, $A0(A0) + Nop + BSet.B #$4, $110(A0) + Nop ; Finally! Restart the machine by Jumping through the Restart vector in the ROM header @@ -576,7 +653,7 @@ ShutRestart ;_______________________________________________________________________ ; -; ShutPower - Do a shutDown and power off the system if possible. If itÕs +; ShutPower 2c546 - Do a shutDown and power off the system if possible. If itÕs ; and older system (no power off ability) then put up an ; alert that the system can go down now. ; @@ -598,15 +675,15 @@ ShutPower bsr.w RemoveOtherRoutines ; Go remove these procedures from the queue <13> moveq #SDBitPowerOff,D0 ; pass parameter: power off. + moveq #1,D1 bsr.w CallRoutines ; do cleanup and check if new mac. - moveq #1,D5 ; Go ahead and hide cursor/close LCDs. - bsr BlankDesktop ; Clear the whole desktop. - bsr FindEDisk ; Do we have an EDisk in the drive Q? beq.s @noEDisk ; -> Nope, continue w/power off bsr KillEDisk ; Clear the EDisk's checksum data (invalidate the disk) @noEDisk + IMPORT SHUTDOWNMGRC_2CC90 + BSR SHUTDOWNMGRC_2CC90 ; Send Sonic a soft reset <16> thru next <16> @@ -635,7 +712,7 @@ ShutPower ;_______________________________________________________________________ ; -; DoSysErrDialog +; DoSysErrDialog 2c594 ; ; Put up a dialog (done by the system error handler). ; The system error ID must be in D0. @@ -648,7 +725,7 @@ DoSysErrDialog ;_______________________________________________________________________ ; -; UserChoice +; UserChoice 2c59a ; ; Start off as a power-off. If the machine supports soft power-off, ; we give the user a choice between Restart and Shut Down (some of the @@ -660,17 +737,18 @@ DoSysErrDialog ;_______________________________________________________________________ UserChoice - moveq #0,D5 ; DonÕt hide cursor/close LCDs. - bsr BlankDesktop ; Clear the entire desktop for consistency. - bsr CheckForSoftPowerOff ; does this machine have software power-off? bz.s @noSoftPowerOff ; no! + moveq #0,D5 ; DonÕt hide cursor/close LCDs. + bsr BlankDesktop ; Clear the entire desktop for consistency. + move.w #dsShutDownOrRestart,d0 ; yes, let the user choose Shut Down or Restart bra.s DoSysErrDialog @noSoftPowerOff moveq #sdBitPowerOff,d0 ; notify just as we would for PowerOff + moveq #0,d1 bsr.s CallRoutines ; go do the notification move.w #dsSwitchOffOrRestart,d0 ; no, let the user switch off or Restart @@ -679,7 +757,7 @@ UserChoice ;_______________________________________________________________________ ; -; CallRoutines +; CallRoutines 2c5b8 ; Entry: D0 - Bit number to test (shutdown type). ; Exit: regs saved. ;_______________________________________________________________________ @@ -688,16 +766,27 @@ CallRoutines movem.l A1-A3/D0-D5,-(SP) move.w D0,D4 + swap D4 + move D1,D4 + ; Call Cleanup for Drivers, and Custom cleanup Procs. moveq #SDBitDrivers,D5 ; do Pre-Driver cleanUp bsr.s CallCleanUp + moveq #sdBitUnMount,D5 + bsr.s CallCleanUp + ; Call Cleanup to unmount volumes, and then custom PowerOff/Restart. - moveq #SDBitUnMount,D5 ; do Vol UnMounts + moveq #SDBitNew,D5 bsr.s CallCleanUp move.w D4,D5 ; do PowerOff or ReStart cleanup + + bsr BlankDesktop + swap D4 + move D4,D5 + bsr.s CallCleanUp ; set up the flags for the caller. @@ -707,7 +796,7 @@ CallRoutines ;_______________________________________________________________________ ; -; RemoveOtherRoutines - Remove all occurences of the passed in shutdown procedure type from the shutdown queue. <13> +; RemoveOtherRoutines 2c5e0 - Remove all occurences of the passed in shutdown procedure type from the shutdown queue. <13> ; This differentiates routines that wish to be executed before drivers on restart, but not at all on poweroff ; (as an example). Before, there was no differentiation between restart and poweroff for routines that were ; to run before drivers close, or before volumes are unmounted. There are cases when such differentiation @@ -753,7 +842,7 @@ RemoveOtherRoutines ;_______________________________________________________________________ ; -; CallCleanUp +; CallCleanUp 2c608 ; Entry: D5 - Bit number to test (shutdown type). ; Exit: ;_______________________________________________________________________ @@ -786,6 +875,9 @@ CallCleanUp clr.w QType(a2) ; QType holds the shutdown flags @DontCallUs + cmp #0,A3 + beq.s @NotFound + cmp.l A2,D3 ; at the end? move.l A3,A2 Bne.S @ScanLoop @@ -794,7 +886,7 @@ CallCleanUp ;_______________________________________________________________________ ; -; DoDrivers - The Default shutdown routine to kiss all of the drivers +; DoDrivers 2c63a - The Default shutdown routine to kiss all of the drivers ; goodbye. ; Entry: No paramters. ; @@ -816,54 +908,6 @@ DoDrivers MOVE.L D0,A0 ; get the DCE handle MOVE.L (A0),A0 ; get the DCE pointer -;------------------------------------------------------------------------ <4> jmp - - Btst #dRamBased,DCtlFlags+1(A0) ; If weÕve got a pointer, then just skip - Beq.s @skipVidChk ; this code (our drivers are RamBased). - - Move.l A0,D7 ; Save pointer to DCE. - Move.l A1,D6 ; Save UTable pointer. - - Move.l dCtlDriver(A0),A0 ; Get handle to driver. - Move.l (A0),A0 ; Get pointer to driver. - Lea drvrName(A0),A0 ; Point to driver name. - Move.l A0,D5 ; Save it for later. - - moveq #0,D0 ; Prepare D0. - Move.b (A0),D0 ; Get the length of the driver name. - Move.w D0,D4 ; Make a copy. - Addq #2,D4 ; Adjust offset to version field (len + 1) - Bclr #0,D4 ; Adjust offset for word alignment. - Move.w (A0,D4.w),D4 ; Get the version number. - Bne.s @endVidChk ; If non-zero, then just leave. - - Swap D0 ; Get 1st string length into hi-word. - Addq #1,A0 ; Point to text of driver name. - Lea TimVidTitle,A1 ; Point to TIM/TIM-LCÕs video driver name. - Move.b (A1)+,D0 ; Get 2nd string length into lo-word. - _CmpString ; Compare drvrName with TimVidTitle. - Tst.b D0 ; If this is the TIM/TIM-LC driver, - Beq.s @fixFlags ; then donÕt kiss it goodbye. - - Move.l D5,A0 ; Restore pointer to driver name. - moveq #0,D0 ; Re-prepare D0. - Move.b (A0)+,D0 ; Get length of 1st stringÉ - Swap D0 ; Éinto the hi-word. - Lea DAFBVidTitle,A1 ; Point to Spike/Eclipse video driver name. - Move.b (A1)+,D0 ; Get 2nd string length into lo-word. - _CmpString ; Compare drvrName with DAFVidTitle. - Tst.b D0 ; If this is the DAFB (Spike/Eclipse) driver, - Beq.s @fixFlags ; then donÕt kiss it goodbye. - Bra.s @endVidChk ; Otherise, just leave. - -@fixFlags Move.l D7,A0 ; Restore pointer to DCE. - Bclr #DNeedGoodbye,DCtlFlags(A0) ; Reset the good-bye kiss flag. - -@endVidChk Move.l D7,A0 ; Restore pointer to DCE. - Move.l D6,A1 ; Restore pointer to UTable. - -@skipVidChk - ;------------------------------------------------------------------------ <4> jmp BTST #DNeedGoodbye,DCtlFlags(A0) ; need a goodbye kiss? @@ -884,28 +928,43 @@ DoDrivers MOVEM.L (SP)+,D0-D1/D4-D7/A0-A1 ; restore registers <4> jmp RTS -;------------------------------------------------------------------------ <4> jmp - - String Pascal - -TIMVidTitle - DC.W '.Display_Video_Apple_TIM' ; Name of TIM/TIM-LC Video Driver. - -DAFBVidTitle - DC.W '.Display_Video_Apple_DAFB' ; Name of Spike/Eclipse Video Driver. - ;------------------------------------------------------------------------ <4> jmp ;_______________________________________________________________________ ; -; DoUnmount - Unmount all of the volumes on line, so the disks will be updated before our power off. +; DoUnmountCommon 2c69c - Unmount all of the volumes on line, so the disks will be updated before our power off. ; ; Entry: No parameters. ; ;_______________________________________________________________________ - export DoUnmount +DoUnmountAtPowerDown + MOVE.L D3,-(SP) + MOVE.L #$2,D3 + BSR DoUnmountCommon + MOVE.L (SP)+,D3 + RTS + + +DoUnmountAtRestart + MOVE.L D3,-(SP) + MOVE.L #$1,D3 + BSR DoUnmountCommon + MOVE.L (SP)+,D3 + RTS + + + EXPORT DoUnmount DoUnmount + MOVE.L D3,-(SP) + MOVE.L #$3,D3 + BSR DoUnmountCommon + MOVE.L (SP)+,D3 + RTS + + +DoUnmountCommon + move.l D5,-(SP) sub #IOQElSize,SP ; allocate pBlock ; Go through the VCB Queue to Flush and eject all volumes. @@ -916,6 +975,20 @@ DoUnmount move.l VCBQHdr+QHead,A1 ; get the queue header move.l VCBQHdr+QTail,D2 ; get the tail too beq.s @AllFlushed + + cmp.l D2,A1 + beq.s @AllFlushed + + move.l (A1),A1 + move.l #0,D5 + tst.l $B78 + bmi.s @alreadySetB78 + + move.l $B78,A0 + move.w $4E(A0),D5 + move.l SP,A0 +@alreadySetB78 + bsr ZapVCBQueue ; wipe out the whole queue @AllFlushed @@ -938,6 +1011,7 @@ taskActive equ 7 ; High bit of qType word is active flag. _PrimeTime ; Start the TMTask. move.l DrvQHdr+QHead,D0 ; Now, get a pointer to the first drvQElem. + beq.s @TimedOut @Repeat move.l D0,A1 ; Copy the drvQElem pointer into A1. cmpi.w #-5,dqRefNum(A1) ; If this isnÕt a floppy (.Sony) driver drive, bne.s @Until ; then just go on. @@ -954,11 +1028,52 @@ taskActive equ 7 ; High bit of qType word is active flag. @TimedOut _RmvTime ; Remove TMTask. adda.w #tmXQSize,Sp ; Reclaim the stack space. + move.l (SP)+,D5 rts + +;_______________________________________________________________________ +; +; DoSomethingAtRestartOrPower 2c71e +;_______________________________________________________________________ + +DoSomethingAtRestartOrPower + + movem.l D3/D5,-(SP) + + tst D4 + beq.s @cond1 + + moveq #1,D3 + bra.s @cond2 + +@cond1 moveq #2,D3 +@cond2 sub #IOQElSize,SP ; allocate pBlock + +; Go through the VCB Queue..? + + move.l SP,A0 ; point to the parameter block + clr.L ioVNPtr(A0) + clr.W ioRefNum(A0) + move.l VCBQHdr+QHead,A1 ; get the queue header + move.l VCBQHdr+QTail,D2 ; get the tail too + + beq @noZap + + move.l #0,D5 + bsr ZapVCBQueue +@noZap + + add.w #IOQElSize,SP + + movem.l (SP)+,D3/D5 + + rts + + ;_______________________________________________________________________ <5> ; -; ClearWarmStart - Shutdown task to clear warm start variable if user +; ClearWarmStart 2c756 - Shutdown task to clear warm start variable if user ; chooses 'Shut Down' from the Finder. ; ;_______________________________________________________________________ <5> @@ -980,7 +1095,7 @@ ClearWarmStart ;_______________________________________________________________________ SAM ; -; UpdateEmuWarmstart - +; UpdateEmuWarmstart 2c76e - ; ; The emulator warmstart flag lives in the writeprotected diagnostic info block in the Nanokernel's ; data page. We need to "map" the diag page to a normally mapped page of RAM, write the warmstart @@ -996,9 +1111,6 @@ ClearWarmStart UpdateEmuWarmstart With nkDiagInfo - testFor has68kEmulator ; Does this machine have a V0 style emulator? - beq @Done ; -> Nope, we're done. Exit. - move SR,-(SP) ; Save SR ori.w #hiIntMask,SR ; Disable interrupts movem.l D2-D7,-(SP) ; Save some D regs @@ -1023,6 +1135,7 @@ UpdateEmuWarmstart lea 1,A0 ; Get the buffer page number in A0 lea 1,A1 ; Say page is inited (#1) + move.l D1,A1 _nkMMUMarkBacking ; Mark this page as outta here lea 1,A0 ; Logical Page number of the buffer @@ -1039,6 +1152,7 @@ UpdateEmuWarmstart lea 1,A0 ; Get the lo Page number in A0 lea 1,A1 ; Say page is inited (#1) + move.l D1,A1 _nkMMUMarkBacking ; Mark this page as outta here lea 1,A0 ; Get the lo Page number in A0 @@ -1054,8 +1168,14 @@ UpdateEmuWarmstart EndWith + + + rts + + + ;_______________________________________________________________________ <5> -; ZapVCBQueue - This routine goes through the VCB Queue, and calls HUnmountVol for each entry. +; ZapVCBQueue 2c7f2 - This routine goes through the VCB Queue, and calls HUnmountVol for each entry. ; ; Entry: A0 - IOParam Block ; A1 - Pointer to current Entry @@ -1064,25 +1184,60 @@ UpdateEmuWarmstart ; D1 - Preserved. ;_______________________________________________________________________ <5> + import SHUTDOWNMGRC_2CB90 + ZapVCBQueue - move.w D1,-(SP) ; save for re-entrancy. + movem.l D1/D4-D6,-(SP) ; save for re-entrancy. + moveq #0,D4 move.w vcbVRefNum(A1),D1 ; get a VRefNum + move.w vcbDrvNum(A1),D6 + move.w vcbDRefNum(A1),D4 move.l QLink(A1),-(SP) ; go on to the next VCB cmp.l D2,A1 move.l (SP)+,A1 beq.s @FlushTime ; have we reached the end? bsr.s ZapVCBQueue ; not yet, save the VRefNum, call self. @FlushTime + + tst D5 + beq.s @defsDo + cmp D5,D6 + beq.s @return +@defsDo + move.w D1,ioVRefNum(A0) ; set up the refNum in the PBlock. - _Eject _HUnMountVol ; shut the volume down. - move.w (SP)+,D1 ; restore crucial VRefNum + + tst D6 + bgt.s @skipCheck + + tst D4 + bge.s @return + + neg D4 + move D4,D6 +@skipCheck + + move.l A0,-(SP) + move.l D4,-(SP) + move.l D3,-(SP) + bsr SHUTDOWNMGRC_2CB90 + addq.l #8,SP + move.l (SP)+,A0 + + tst D0 + bne.s @return + + move D6,ioVRefNum(A0) + _Eject + +@return movem.l (SP)+,D1/D4-D6 Rts ; for reentrancy. ;_______________________________________________________________________ ; -; BlankDesktop +; BlankDesktop 2c846 ; ; Blank the whole deskstop. This fills the entire desktop with black. ; It used to be the case that we wanted the screen to go white on @@ -1099,6 +1254,7 @@ ZapVCBQueue ;_______________________________________________________________________ IMPORT AllocFakeRgns ; + IMPORT SHUTDOWNMGRC_2D4F0, SHUTDOWNMGRC_2D330 BlankDesktop @@ -1138,6 +1294,14 @@ BlankDesktop TST.B D5 ; If weÕre not supposed to close LCDs, BEQ.S @SkipClose ; then just go on. + + CLR.B -(SP) + BSR SHUTDOWNMGRC_2D4F0 + + CLR.B -(SP) + BSR SHUTDOWNMGRC_2D330 + + BSR YetAnother BSR CloseLCDVideo ; Otherwise, close Õem. @SkipClose @@ -1147,7 +1311,7 @@ BlankDesktop ;_______________________________________________________________________ ; -; CheckForSoftPowerOff +; CheckForSoftPowerOff 2c89c ; ; Check to see if this machine has a working PowerOff trap. ; @@ -1182,51 +1346,57 @@ CheckForSoftPowerOff ; if the video is of type LCD. If so, then close the video driver. ;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -CloseLCDFrame RECORD 0, DECR -CloseLCDCntBlk DS.B IOVQElSize ; control call parm block -CloseLCDSpBlk DS.B spBlock.spBlockSize ; Slot Manager param block. -CloseLCDFrameSize EQU * ; size of frame - ENDR +CloseLCDVideo -CloseLCDVideo -CloseLCDVideoRegs REG D1/A0-A1 - WITH CloseLCDFrame,spBlock - LINK A6,#CloseLCDFrameSize ; allocate variable space - MOVEM.L CloseLCDVideoRegs,-(SP) ; Save them regs - LEA CloseLCDSpBlk(A6),A1 ; Get pointer to spBlock - MOVEA.L A1,A0 ; Set pointer to A0 - CLR.B spSlot(A0) ; Set slot number - MOVEQ #0,D1 ; set spId to 0 - CLR.B spExtDev(A0) ; No external devices - MOVE.W #CatDisplay,spCategory(A0) ; Look for this slot's card - MOVE.W #TypVideo,spCType(A0) ; Make sure it is video - MOVE.W #DrSwApple,spDrvrSW(A0) ; Make sure it is from Apple - MOVE.B #1,spTBMask(A0) ; mark spDrvrHw field as donÕt care -@sNextLoop - MOVEA.L A1,A0 ; Get pointer to spBlock - MOVE.B D1,spId(A0) ; Set spID - _sNextTypesRsrc ; get the spsPointer - BNE.S @Done + Move.L (DeviceList), D0 + BEQ.B @L5 + MoveM.L A0-A2, -(A7) + Link A6, #-$40 +@L1 MoveA.L D0, A2 + MoveA.L (A2), A2 + IMPORT PMGRCALLEDBYSHUTDOWNMGRDEC4 + Bsr.L PMGRCALLEDBYSHUTDOWNMGRDEC4 + BNE.B @L2 + IMPORT PMGRCALLEDBYSHUTDOWNMGRDEE4 + Bsr.L PMGRCALLEDBYSHUTDOWNMGRDEE4 + BEQ.B @L4 +@L2 Move (A2), D0 + MoveA.L (UTableBase), A1 + AddQ #$1, D0 + Neg D0 + AsL #$2, D0 + MoveA.L $0(A1,D0.W), A1 + MoveA.L (A1), A1 + BTst.B #$3, $5(A1) + BEQ.B @L3 + Move.L #$1, -(A7) + Move (A2), D0 + Ext.L D0 + Move.L D0, -(A7) + IMPORT EXPANSIONBUSMGR_VEC01A8 + Bsr.L EXPANSIONBUSMGR_VEC01A8 + AddQ #$8, A7 + Bra.B @L4 +@L3 Lea.L -$40(A6), A0 + Move (A2), $18(A0) + _Close +@L4 Move.L $1E(A2), D0 + BNE.B @L1 + Unlk A6 + MoveM.L (A7)+, A0-A2 +@L5 Rts - MOVE.B spId(A0),D1 ; Save spId for later use - MOVE.B #sVidAttributes,spId(A0) ; read flag field in sRsrc - _sReadWord ; ...pointed to by spsPointer - BNE.S @sNextLoop ; no flags - find next sRsrc - MOVEQ.L #1< HJR - ENDWITH + IMPORT SHUTDOWNMGRC_2CC30 + +YetAnother + MOVEM.L D0-D2/A0-A1,-(SP) + BTST.B #6,$2409 + BEQ.S @return + BSR.L SHUTDOWNMGRC_2CC30 +@return MOVEM.L (SP)+,D0-D2/A0-A1 + RTS @@ -1312,7 +1482,6 @@ KillEDisk BNE.S @noEMMU ; IF we have an EMMU THEN MOVE.L A2,A0 ; get ptr to start of data area MOVE.L #BytesToKill,A1 ; get number of bytes to erase - MOVE.L #(0<<16)|hwEDiskProt,D0 ; _HwPriv EDisk write protect selector and "unprotect" parm BRA.S @unProtect ; ELSE @noEMMU MOVE.L CheckSumPtr(A0),A0 ; Get Ptr to the start of the checksum area, if it exists TST.L A0 ; Check if RAM Disk is using checksums @@ -1320,8 +1489,8 @@ KillEDisk MOVE.L A2,A0 ; base address of RAM disk is same as DataStartPtr @cksumOn ; ENDIF SUB.L A1,A1 ; Protect flag. Zero = Unprotect - MOVEQ #hwEDiskProt,D0 ; _HwPriv EDisk write protect selector @unProtect ; ENDIF + MOVEQ #hwEDiskProt,D0 ; _HwPriv EDisk write protect selector _HwPriv ; Write Enable the EDisk RAM CMPI.W #paramErr,D0 ; Does not clear D0 on success, Check for failure BEQ.S @Done ; -> enable failed. Bail out now or Bus Error! @@ -1445,7 +1614,13 @@ ShutDownCancelButton EQU 2 ; dialog item of Cancel button _ParamText ; set dialog parameters subq #4,sp ; room for DialogPtr + bsr VersionCheckingFunc + beq.s @oldDLOG + move.w #-20601,-(sp) + bra.s @doIt +@oldDLOG move.w #ShutDownDLOGID,-(sp) ; resource ID +@doIt clr.l -(sp) ; use heap storage move.l #-1,-(sp) ; put it in front _GetNewDialog @@ -1488,82 +1663,30 @@ exitFalse move.w #false,d0 ; allow shutdown to continue justExit move.l (sp)+,a2 ; restore a2 rts -;________________________________ -; -; Docking Dispatch Trap -; -DockInitSCC MOVEM.L D0-D2/A0-A2,-(SP) ; <3> - MOVE.W #UnimplementedTrapNumber,D0 ; does the _DockingDispatch trap exist? - _GetTrapAddress ,NEWTOOL - MOVEA.L A0,A1 - MOVE.W #$AA57,D0 - _GetTrapAddress ,NEWTOOL - CMPA.L A0,A1 - BEQ.S @Done ; -> no, skip it - MOVEQ #sccOn-256,D0 ; turn SCC power on - BSR.S @SCCPower - BSR.S InitSCC ; reset the SCC so it doesn't cause us trouble - MOVEQ #sccOff,D0 ; turn SCC power off - BSR.S @SCCPower -@Done MOVEM.L (SP)+,D0-D2/A0-A2 - RTS -@SCCPower - TestFor hwCbPwrMgr ; does this machine have a Power Manager? - BEQ.S @NoPMGR ; -> nope, skip - MOVE.B D0,-(SP) - MOVE.L SP,-(SP) ; pmRBuffer - MOVE.L (SP),-(SP) ; pmSBuffer - MOVE.W #1,-(SP) ; pmLength = 1 byte to send - MOVE.W #powerCntl,-(SP) ; pmCommand = power control - MOVEA.L SP,A0 ; point to the parameter block - _PMgrOp ; turn SCC power on or off - LEA pmRBuffer+4+2(SP),SP ; toss the parameter block and buffer -@NoPMGR RTS -InitBData - DC.B 9,$C0 ; do a hard reset - DC.B 9,$40 ; reset the channel - DC.B 4,$4C ; set async mode (magic?) - DC.B 2,$00 ; zero interrupt vector for dispatcher - DC.B 3,$C0 ; DCD not an auto-enable - DC.B 15,$00 ; no interrupts - DC.B 0,$10 ; reset ext/sts interrupts twice - DC.B 0,$10 - DC.B 1,$00 ; no interrupts -InitBLth EQU *-InitBData - -InitAData DC.B 9,$80 ; reset the channel - DC.B 4,$4C ; set async mode (magic?) - DC.B 3,$C0 ; DCD not an auto-enable - DC.B 15,$00 ; no interrupts - DC.B 0,$10 ; reset ext/sts interrupts twice - DC.B 0,$10 - DC.B 1,$00 ; no interrupts -InitALth EQU *-InitAData - - -InitSCC - TestFor SCCIOPExists ; see if we have a SCC IOP - bne.s @hasIOP ; if so, don't try to initialize it - MOVEA.L SCCWr,A0 ; point to SCC base write address (chan B) - MOVEA.L SCCRd,A1 ; point to SCC base read address (chan B) - LEA InitBData,A2 ; point to channel B init data - MOVEQ #InitBLth,D1 ; and set up the length - BSR.S @WriteSCC ; then init channel B - - ADDQ.W #ACtl,A0 ; adjust SCC addresses for channel A - ADDQ.W #ACtl,A1 - ; A2 points to channel A's init data - MOVEQ #InitALth,D1 ; init data length -@WriteSCC MOVE.B (A1),D2 ; read to make sure SCC is sync'ed up - BRA.S @2 ; delay for timing, too -@1 MOVE.L (SP),(SP) ; delay long for reset - MOVE.L (SP),(SP) - MOVE.B (A2)+,(A0) -@2 DBRA D1,@1 - -@hasIOP RTS - + +VersionCheckingFunc + + move.l ROMBase, a0 + + cmp.w #$077D, ROMHeader.MachineNumber(a0) + bne.s @zero + + cmp.b #$40, ROMHeader.ROMRelease(a0) + beq.s @one + + cmp.b #$45, ROMHeader.ROMRelease(a0) + beq.s @one + + cmp.b #$44, ROMHeader.ROMRelease(a0) + bne.s @zero + +@one moveq.l #1, d0 + rts + +@zero moveq.l #0, d0 + rts + endwith ENDP END diff --git a/Toolbox/Toolbox.make b/Toolbox/Toolbox.make new file mode 100644 index 0000000..1bb23bc --- /dev/null +++ b/Toolbox/Toolbox.make @@ -0,0 +1,75 @@ +# This makefile was missing. Here is a rudimentary reconstruction. +# Some toolbox managers were "dumped" instead of backported, to save time. + +ToolboxObjs = "{ObjDir}PackageMgr.a.o" ¶ + "{ObjDir}SegmentLoader.a.o" ¶ + "{ObjDir}ShutDownMgr.a.o" ¶ + "{ObjDir}ShutDownMgr.c.o" ¶ + "{ObjDir}Munger.a.o" ¶ + "{ObjDir}DeskMgr.a.o" ¶ + "{ObjDir}GetMgr.a.o" ¶ + "{ObjDir}TextEdit.lib" ¶ + "{ObjDir}ScrapMgr.a.o" ¶ + "{ObjDir}Printing.a.o" ¶ + "{ObjDir}SexyDate.a.o" + + +# Just guessing what the binaries should be called: +# *.lib for multi-file managers, *.a.o for single-file managers + +"{LibDir}Toolbox.lib" Ä {ToolboxObjs} + Lib {StdLibOpts} {ToolboxObjs} -o "{Targ}" + +"{ObjDir}PackageMgr.a.o" Ä "{ToolboxDir}PackageMgr.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}PackageMgr.a" + +"{ObjDir}SegmentLoader.a.o" Ä "{ToolboxDir}SegmentLoader:SegmentLoader.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}SegmentLoader:SegmentLoader.a" + +"{ObjDir}ShutDownMgr.a.o" Ä "{ToolboxDir}ShutDownMgr:ShutDownMgr.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}ShutDownMgr:ShutDownMgr.a" + +"{ObjDir}Munger.a.o" Ä "{ToolboxDir}Munger:Munger.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}Munger:Munger.a" + +"{ObjDir}DeskMgr.a.o" Ä "{ToolboxDir}DeskMgr:DeskMgr.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}DeskMgr:DeskMgr.a" + +"{ObjDir}GetMgr.a.o" Ä "{ToolboxDir}GetMgr:GetMgr.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}GetMgr:GetMgr.a" + +"{ObjDir}SexyDate.a.o" Ä "{ToolboxDir}SexyDate.a" + Asm {StdAOpts} -o "{Targ}" "{ToolboxDir}SexyDate.a" + + +# The following libs are *not* part of Toolbox.lib + +AliasMgrDir = "{ToolBoxDir}AliasMgr:" +ComponentMgrDir = "{ToolBoxDir}ComponentMgr:" +DataAccessDir = "{ToolBoxDir}DataAccessMgr:" +ExpansionBusMgrDir = "{ToolBoxDir}ExpansionBusMgr:" +NotificationDir = "{ToolBoxDir}NotificationMgr:" +ToolboxEventDir = "{ToolBoxDir}ToolboxEventMgr:" +ControlMgrDir = "{ToolBoxDir}ControlMgr:" +DisplayMgrDir = "{ToolBoxDir}DisplayMgr:" +WindowMgrDir = "{ToolBoxDir}WindowMgr:" +MenuMgrDir = "{ToolBoxDir}MenuMgr:" +DialogDir = "{ToolBoxDir}DialogMgr:" +ResourceMgrDir = "{ToolBoxDir}ResourceMgr:" +ScriptMgrDir = "{ToolBoxDir}ScriptMgr:" +FontMgrDir = "{ToolBoxDir}FontMgr:" + +#include "{AliasMgrDir}AliasMgr.make" +#include "{ComponentMgrDir}ComponentMgr.make" +#include "{DataAccessDir}DataAccessMgr.make" +#include "{ExpansionBusMgrDir}ExpansionBusMgr.make" +#include "{NotificationDir}NotificationMgr.make" +#include "{ToolboxEventDir}ToolboxEventMgr.make" +#include "{ControlMgrDir}ControlMgr.make" +#include "{DisplayMgrDir}DisplayMgr.make" +#include "{WindowMgrDir}WindowMgr.make" +#include "{MenuMgrDir}MenuMgr.make" +#include "{DialogDir}DialogMgr.make" +#include "{ResourceMgrDir}ResourceMgr.make" +#include "{ScriptMgrDir}ScriptMgr.make" +#include "{FontMgrDir}FontMgr.make" diff --git a/Toolbox/ToolboxEventMgr/ToolboxEventMgr.a b/Toolbox/ToolboxEventMgr/ToolboxEventMgr.a index eaecf4f..f616e68 100644 --- a/Toolbox/ToolboxEventMgr/ToolboxEventMgr.a +++ b/Toolbox/ToolboxEventMgr/ToolboxEventMgr.a @@ -503,20 +503,6 @@ HandBySys ; <09Apr85> DoneGNE -; The following is a one-time check to see if the internal drive (SCSI ID in low -; memory) is up to speed by now. If so, then clear high bit of PRAM startup -; device timeout value (PRAM address $01, byte length) to indicate that device -; 0 is there (and the startup code will wait for it at the next boot). - - BTST.B #7,SCSIPoll ; bit 7 is cleared by InitSCSIMgr - BNE.S @1 ; don't poll if we've already done it once - CMP.L #20*60,Ticks ; have we been running for 20 seconds? - BLO.S @1 ; no, too early yet - BSET.B #7,SCSIPoll ; set it so we don't do it again - BSR TryDevice ; see if that device is out there - -@1 - ; see if there was no event, if so do a get mouse to tickle tracking ; Historical note: by this time, an FKey is made to look like "no event", in which <13Jan86 JTC> ; case the mouse update is done... @@ -617,75 +603,6 @@ GotDActive CLR D2 ;flag the deactivate BRA.S GotActCommon ;go use common code -;-------------------------------------------------------------------------- -; -; TryDevice -- we do a one-time check of the SCSI ID for the internal hard -; disk some number of seconds after bootup. Since the internal disk is -; powered from the CPU's power supply, it is likely that the startup code -; will be ready to boot off a floppy before the disk has spun up to full -; speed. Unless we have some way to know if there is an internal drive, -; the start code won't know whether or not to wait for the device. This -; 'lightning bolt' happens once per bootup, setting a field in parameter -; RAM that the startup code looks at. If we find a SCSI device ready that -; corresponds to the internal disk SCSI ID stored in parameter RAM, then -; we set a field in parameter RAM so the startup code will wait for it -; at the next bootup. This introduces some hysteresis in the process if the -; user changes the ID of his internal drive, but it was deemed to be more -; preferable than the alternative of a Control Panel setting to enable and -; disable waiting for the internal hard disk. The default ID to check is -; 0, but can be changed in parameter RAM (which gets stored into the SCSIPoll -; variable by InitSCSIMgr). -; - -TryDevice ; This subroutine new - CLR.L -(SP) ; 6-byte Test Unit Ready command block - CLR.L -(SP) ; (6 zeroes) and 2-byte return value - _SCSIGet ; arbitrate for the SCSI bus - TST.W (SP) ; success? - BNE.S TryDevDone ; if arbitrate failed, don't change PRAM - MOVE.B SCSIPoll,D0 ; get SCSI ID of the int. drive - AND.B #$07,D0 ; mask off ID bits - MOVE.W D0,-(SP) ; push SCSI ID for the select - - _SCSISelect ; try to select (max. wait 250 ms.) - TST.W (SP) ; success? - BEQ.S SelectOK ; branch if select succeeded - - _DisableDynWait ; don't wait for that id on bootup - BRA.S TryDevDone ; exit - -SelectOK - PEA 2(SP) ; address of Test Unit Ready command - MOVE.W #6,-(SP) ; length of Test Unit Ready command - _SCSICmd ; do the command - ; - ; If something went wrong with the command, then we need to do - ; SCSIComplete anyway, so it isn't necessary to check the - ; return value. Since we don't need the space for the command - ; block any more, we just reuse it for the status and message - ; values (each a word) returned by SCSIComplete. Before pushing - ; anything else, these EA's are 2(sp) and 4(sp), so we PEA 2(sp) - ; for the first (which adds 4 bytes to the stack), and PEA 8(sp) - ; for the second [PEA 4+4(sp)]. - ; - PEA 2(SP) ; address for status value - PEA 8(SP) ; address for message value - MOVEQ.L #60,D0 ; maximum number of ticks to wait - MOVE.L D0,-(SP) ; push it - _SCSIComplete ; wrap things up, ignore return code - ; - ; If we got this far, then there is a device 0, so enable timeout - ; - _EnableDynWait ; startup code will wait for dev. 0 - -TryDevDone - ADDQ.L #8,sp ; clean up local variables - RTS - - - ENDPROC - - ;____________________________________________________________________________________ ; ; Proc WaitNextEvent diff --git a/Toolbox/ToolboxEventMgr/ToolboxEventMgrPatches.a b/Toolbox/ToolboxEventMgr/ToolboxEventMgrPatches.a index cdd1a44..cfb1262 100644 --- a/Toolbox/ToolboxEventMgr/ToolboxEventMgrPatches.a +++ b/Toolbox/ToolboxEventMgr/ToolboxEventMgrPatches.a @@ -143,191 +143,4 @@ ClearSysErrorUpdateRect installproc (Plus,SE,II,Portable,IIci) endproc - if not forROM then -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; GetNextEvent/EventAvail Ñ fix 32-bit activation bug - -; A bug occurs in the IIci ROM under 32-bit mode. The high bit of CurActivate and CurDeactivate -; are used as flags to indicate that the events have already been sent. (0 in either also means that -; the event was sent.) The problem is that the ROM code (written for 24-bit machines) refers to the -; windowKind field without stripping off this high bit. Under some circumstances, this would cause -; a bus error. Since the code that checks the window is only used to set the system/application bit -; in the modifiers of the activate/deactivate event, and that bit was never documented in a released -; version of Inside Mac. (and no one uses it), we can fix the bug by getting rid of the code that -; sets the system/application bit. This patch to CheckActivate eliminates the code to set the -; system/application bit. - -FixCheckActivate comefrompatchproc _OSEventAvail,AfterOSEventAvailInCheckActivate,(IIci,using32BitHeaps) - - lea ComeBackHere,a1 ; after doing the OSEventAvail, come back here - move.l a1,ReturnAddressDepth(sp) ; jam in that return address - jmpOld ; go do the OSEventAvail - -ComeBackHere - MOVE.W #activateEvt,(A0)+ ; flag it as (de)activate event - MOVE.L D1,(A0) ; the windowPtr is the message - - jmpROM AfterSystemUserWindowInCheckActivate - - endproc - endif -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; GetNextEvent - Make sure current port is valid before calling _GetMouse - -; This is mostly for the sake of the journalling driver. Before _GetNextEvent calls _GetMouse, check -; to see if the Window Manager exists by checking WWExist. (QDExist is also checked in the process, but -; thatÕs fine.) If the Window Manager exists, set the port to the Window Manager port before calling -; _GetMouse. If thereÕs no Window Manager, the call to _GetMouse is skipped. - -SetWindowMgrPort ComeFromPatchProc _GetMouse,AfterGetMouseInGetNextEvent,(Plus,SE,II,Portable,IIci) - - tst.w WWExist ; See if the Window Manager & QuickDraw exist - bne.s @backToGetNextEvent ; If WMgr isnÕt there, donÕt call _GetMouse - -; Window Mananger exists. Set the port to the Window ManagerÕs port before calling _GetMouse - - sub.w #4,sp - move.l sp,-(sp) - _GetPort ; Save the current port on the stack - - move.l WMgrPort,-(sp) - _SetPort ; Set the port to the Window ManagerÕs port - move.l 8(sp),-(sp) ; Copy the original _GetMouse parameter - jsrOld ; Call _GetMouse - - _SetPort ; Old port is already on the stack. - -@backToGetNextEvent - add.w #8,sp ; Remove return address and parameter from stack - jmpROM AfterGetMouseInGetNextEvent - ENDPROC - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; Come-from patch on _GetResource inside GetNextEvent to ignore FKEYs on the Mac Plus <9> - -; If called from GetNextEvent trying to load an FKEY, abort out so that the -; event record is passed to the application. FKEYs are handled by SystemEvent on the Plus. - -; Note that this FKEY patch is rarely invoked, and only in bizarre circumstances. -; Due to a bug in the Mac Plus ROM, a valid FKEY event always fails the range check (it -; compares ASCII 0 through 9 (i.e. $30 to $39) to decimal 0 through 9), and GetNextEvent -; never tries to invoke the FKEY. However, it may try to load an FKEY when an invalid key -; combination is held down. For example, shift-cmd-enter is really shift-cmd-$03, which because -; of the range checking problem causes FKEY 3 to be loaded. Someday we may want to reassess whether -; this patch is more trouble than it's worth. - -LoadFKEYInGetNextEvent ComeFromPatchProc _GetResource,AfterGetResourceInTryFKey,(Plus) - - LEA 14(SP), SP ; Clean off the stack - jmpROM DoneGNE ; Go where we are supposed to - - endproc - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; Come-from patch on _GetResource inside GetNextEvent to disable FKEYs from the keypad <9> - -; Note that even though this is a come-from on the same label as LoadFKEYInGetNextEvent on -; the Plus, it's doing different things. On the Plus, FKEY handling was moved into SystemEvent. -; On the SE and II, it was moved back out so that FKEY's are handled before calling SystemEvent. -; So, it's valid for GetNextEvent to get an FKEY on the SE and II where it wasn't valid on the -; Plus. - -KeypadFKEYInGetNextEvent ComeFromPatchProc _GetResource,AfterGetResourceInTryFKey,(SE,II) - - TST.B ScrDmpEnb ; Check the ScrDmpEnb flag <11> - BNE.S moreChecks ; if it is not false, do some more checks <11> - MOVE.L (SP)+, A0 ; otherwise, return NIL. <11> - ADDQ.L #6, SP ; <11> - CLR.L (SP) ; <11> - JMP (A0) ; <11> - -moreChecks ; <11> - MOVE.B evtMessage+2(A3), D0 ; Get the raw keycode - CMP.B #$3F, D0 ; Keyboard or Keypad? - blsOld ; Keyboard -- execute normally - - LEA 14(SP), SP ; Clean off the stack - jmpROM TrySysEvent ; Go where we are suppossed to - - endproc - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; Come-from patch on _GetResource inside GetNextEvent to honor ScrDmpEnb <11> - -; The portable and IIci ROMS are fixed to do most of what KeypadFKEYInGetNextEvent does. They only -; require a fix to honor the ScrDmpEnable BOOLEAN in low-memory. - -CheckInhibitFKEYInGetNextEvent ComeFromPatchProc _GetResource,AfterGetResourceInTryFKey,(Portable,IIci) - - TST.B ScrDmpEnb ; Check the ScrDmpEnb flag - bneOld ; if it is not false, try to get the FKEY - MOVE.L (SP)+, A0 ; otherwise, return NIL. - ADDQ.L #6, SP - CLR.L (SP) - JMP (A0) - - endproc - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ -; GetOSEvent/OSEventAvail -- change ROM GetNextEvent to look for high level (PPC) events. -; This code should be rolled inline into GetNextEvent. We use comefrom patches for -; convenience only. - -HLEAvail ComeFromPatchProc _OSEventAvail,AfterOSEventAvailInGetNextEvent,(Plus,SE,II,Portable,IIci) - import shareHLEPatch:CODE - -; must look for OS events before we waste any more time - jsrOld ; call through - jmp shareHLEPatch ; go share code - - EndProc ; HLEAvail - -GetNextHLE ComeFromPatchProc _GetOSEvent,AfterGetOSEventInGetNextEvent,(Plus,SE,II,Portable,IIci) - entry shareHLEPatch:CODE - -; must try to get OS events before we waste any more time - jsrOld ; call through - -shareHLEPatch - tst.w EvtNum(a3) ; find something? - bne.s Return ; if so, get out without further ado - -; no OS events. Should we look for high-level events? - move.w 12(a6),d0 ; get the caller's event mask - btst #highLevelEvtBit,d0 ; high-level events requested? - beq.s ReturnFalse ; if not, just go on - move.w WeKnowProcMgrExists,d0 ; do we know whether OSDispatch is OK? - bne.s CallGetHLEvent ; if so, go do it right now - -; We need to check for high level events. Determine whether Process Mgr is around yet. - move.l #gestaltOSAttr,d0 ; Gestalt implemented by Process Mgr - _Gestalt ; ask about Process Mgr - blt.s ReturnFalse ; exit now if we're still too early - lea WeKnowProcMgrExists,a0 ; get address of cheater flag - st (a0) ; remember not to check again - -; Ask the Process Mgr for a high level event. -CallGetHLEvent - clr.w -(sp) ; allocate result storage - move.w 12(a6),-(sp) ; pass event mask - move.l a3,-(sp) ; pass address of event record - tst.w d3 ; EventAvail or GetNextEvent? - seq -(sp) ; pass Boolean: GNE - true, EA - false - _GetNextHighLevelEvent ; call Processs Mgr - move.w (sp)+,d0 ; pop result -Return - rts - -; Exit where we have to restore d0 to say ÒfalseÓ -ReturnFalse - moveq #0,d0 ; say false - bra.s Return ; joint exit - -; Flag whether we know Process Mgr exists -WeKnowProcMgrExists dc.w 0 - - EndProc ; GetNextHLE - -;ÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑÑ - end diff --git a/Toolbox/WindowMgr/WindowMgr.make b/Toolbox/WindowMgr/WindowMgr.make index ae2e1cb..632a67b 100644 --- a/Toolbox/WindowMgr/WindowMgr.make +++ b/Toolbox/WindowMgr/WindowMgr.make @@ -32,8 +32,8 @@ WindowMgrObjs = "{ObjDir}WindowMgr.a.o" Link {StdLOpts} {StdAlign} -rt WDEF=1 -o "{Targ}" "{ObjDir}RoundedWDEF.a.o" || Exit 1 -"{LibDir}WindowMgr.lib" Ä {WindowMgrObjs} - Lib {StdLibOpts} -o "{Targ}" {WindowMgrObjs} +# "{LibDir}WindowMgr.lib" Ä {WindowMgrObjs} +# Lib {StdLibOpts} -o "{Targ}" {WindowMgrObjs} "{ObjDir}LayerMgr.c.o" Ä "{WindowMgrDir}LayerMgr.c"