home *** CD-ROM | disk | FTP | other *** search
- Stand 09.03.97
-
- Inhalt:
- - pOS Starten
- - Benutzung
- - Zukunft
- - Probleme & Wünsche
- - Mitgelieferte Libs und Objs
- - Portierung von AmigaOS auf pOS (pOSxA)
- - Auflagen für die pOS-Programmierung
- - Will Ihr Programm nicht laufen ...
- - p-OS Debugger
- - Verzeichnisaufbau
- - MakeFiles
-
-
-
-
- ****** pOS Starten ***************************************************
-
- A C H T U N G:
- run sushi => pOS schreibt Debug-Infos mit kprintf()
-
- (bitte nicht überlesen - ist *sehr* wichtig )
-
-
-
- pos:pos/pOS 640 512 [ depth # debug # view # scsi <> ]
- - depth Bildschirmtiefe 3-8
- - debug -1 => FULL
- - view Amiga-Viewmode
- - scsi <scsi.device> => wird nach pScsi.device Unit 8+x gespiegelt
-
-
- !!! Die Amiga-Workbench darf mit max. 256 Farben betrieben werden !!!
- !!! Mit Angabe vom ViewMode kann dies umgangen werden !!!
-
- ****** Benutzung *******************************************************
-
- - Mittlere Maustaste bzw. linke Maustaste + CTRL => Drag & Drop
- - rechte Maustaste => Menü
- - rechte Maustaste im Gadget => Abort
-
-
- ****** Zukunft *******************************************************
-
- Während der Entwicklungs-Phase behalten wir uns das Recht vor,
- Strukturen und Prototypen zu ändern. Dies hat zur Folge, daß
- sämtliche Programme neu compiliert werden müssen. (Tag EXTSTTAG_MainOSID)
-
-
- ****** Probleme & Wünsche ********************************************
-
- Sollten Probleme aufteten, sofort an proDAD senden ;-)
- Bitte schreibt uns was nicht gut ist bzw. was noch fehlt.
- Jede Kleinigkeit, wenn es auch noch so nichtig erscheint. Wir können
- dann sofort darauf reagieren und im nächsten Update ist es verbessert.
- Danke. ;-)
-
-
- ****** Mitgelieferte Libs und Objs ***********************************
-
-
- - pOS.lib - pOS-Linklibrary (amiga.lib)
- Source <pLib/pLibExt.c>
-
- - pOSStub.lib - Aufruf der OS-Funktionen, zur Zeit gibt es noch
- keine Pragmas.
- Source <pOSStub.asm>
-
- - List.lib - Listenfunktionen (pOS_ListAddHead, ...) in Ansi-C
-
- - CPPList.lib - Listenfunktionen (pOS_ListAddHead, ...) in C++
-
- - pOSxA.lib - Ersatzfunktionen für Amiga => pOS - Portierung
- Source <clib/#?.c>
-
- - pOSxA_Support.lib - Ersatzfunktionen für Amiga => pOS - Portierung
- Source <clib/#?.c>
- Der Unterschied zur pOSxA.lib besteht darin, das __IGNORE_NOT_SUPPORTED__
- gesetzt wurde. Der Compiler und Linker ignoriert Portierungsfehler und
- ersetzt einige Funktionen bzw. Flags, Tags durch Platzhalter.
-
- - pLib/StartCode.o - Normalen Startupcode für pOS_ReadArgs-Programme
- Source <pLib/StartCode.c>
-
- - pLib/StartCodeCPP.o - im C++ - Mode übersetzt, beinhaltet zusätzlich
- InitModules() und CleanupModules()
-
- - pLib/MainCode.o - Normalen Startupcode für main(int,cahr**) -Programme
- Source <pLib/MainCode.c>
-
- - pLib/MainCodeCPP.o - im C++ - Mode übersetzt, beinhaltet zusätzlich
- InitModules() und CleanupModules()
-
- - StdIO.lib bzw. pLib/StdIO.o - Funktionen wie fopen(), printf(), ...
- Achtung: Unbedingt mit dem mitgeliefertem <stdio.h> arbeiten.
- Source <pLib/StdIO.c>
-
- - pLib/Time.o - Time-Funktionen wie time()
- Source <pLib/Time.c>
-
- - pLib/LibCode.o - Library-Resident Header
- Source <pLib/LibCode.asm>
-
- - pLib/DevCode.o - Device-Resident Header
- Source <pLib/DevCode.asm>
-
-
-
-
- ****** Portierung von AmigaOS auf pOS (pOSxA) ************************
-
- - W I C H T I G:
- - Bitte zuerst den Source in clib/#?.c betrachten.
- Nicht alle Amiga-Funktionen sind nachgebildet.
- - Keine AmigaOS-Teile in pOS-Programme einbinden.
- Immer den pOS-StartCode/MainCode als erstes Objekt linken.
- Source liegt bei. (pLib/#?Code.c)
- - printf() verlangt StdIO.lib (Source liegt bei)
- - Keine Amiga-Pragmas (libcall, amicall) verwenden.
- - Alle benötigten Libraries (außer pExec.library) müssen im Programm
- geöffnet und geschlossen werden.
- Sämtliche Library-Base-Pointer wurden geändert.
- Dies bedeutet, daß ALLE Library-Open/Close - Aufrufe überarbeitet
- werden müssen.
- Das Auto-Open der Libraries ist *NICHT* gegeben. Alle benötigten Libs
- müssen geöffnet werden.
- In StormC für pOS wird es wieder ein Auto-Open geben. ;-)
- - Sämtliche Gadget-Class-Names haben sich verändert
- - Es darf kein Compiler exit() verwendet werden.
- Zur Zeit kann nur StromC dies korrekt handhaben.
- - ModeNotAvailable() macht u.U. logische Probleme.
- - Wird mittels NewObjectA() ein neues Gadget erzeugt, MUSS IMMER
- die DrawInfo übergeben werden.
- - Gadget-Daten nicht mit SetAttrs() setzen, sondern immer
- SetGadgetAttrsA() verwenden. (Window=NULL ist erlaubt)
- - gadget->SpecialInfo ist nicht für alle Gadgets verfügbar
- Es funktioniert bei:
- strgad.class, propgad.class,
- - Speicherverwaltungsfunktionen wie malloc(), calloc(), free() dürfen
- nicht verwendet werden, wenn die Compiler-Libs nicht auf p-OS angepaßt
- sind.
- Nur mit StormC für pOS möglich.
-
- - Source:
- - Source von pOSxA befindet sich in <pOSxA/clib/#?.c>
- - Startcode - Source <p:pLib/MainCode.c> <p:pLib/StartCode.c>
- - Libs <p:pLib/Std#?.c> <p:pLib/pLibExt.c>
- - pOSStub.asm
-
-
- - Wird der define __IGNORE_NOT_SUPPORTED__ gesetzt, werden sämtliche
- nicht vorhandenen Funktionen und Defines durch Dummy-Funktionen
- ersetzt.
-
- - Gadget müssen immer mittels NewIObject(); erzeugt werden.
-
- - (&Screen->ViewPort) wurde in (Screen->ViewPort) geändert
-
- - (&Screen->LayerInfo) wurde in (Screen->LayerInfo) geändert
-
- - OpenDiskFont() wird nicht mehr benötigt, OpenFont() läd Fonts nach.
-
- - Im Screen wurde die Text-Struktur geändert:
- (screen->Font->ta_YSize) => (screen->Font->tf_YSize)
-
- - Im Window wurde das Menü verändert:
- 'window->MenuStrip'
- Menüs dürfen NICHT 'zu Fuß' bearbeitet werden.
-
- - sizeof(struct EasyStruct) wurde verändert, alle neuen Werte
- müssen mit null initialisiert werden.
-
- - IDCMP-Messages dürfen NICHT 'zu Fuß' aus dem UserPort
- entfernt werden. Siehe pOS_ModifySharedIDCMP()
- ( S E H R W I C H T I G )
-
- - In der pOS-Entwicklerversion werden sämtliche Listen-Funktionen
- geprüft. Das bedeutet, daß in jedem neuen Node ln_Succ und ln_Pred
- genullt sein müssen.
-
- - Da alle pOS-Gadgets mit Listen verwaltet sind, darf beim OpenWindow
- kein Gadget angegeben werden. Gadgets müssen immer mittels AddGList
- dem Window mitgeteilt werden. Vor dem CloseWindow muß ZUERST RemGList
- aufgerufen werden, sonst kann FreeGadgets() nicht korrekt arbeiten.
-
- - Bei OpenFont darf FPF_DISKFONT nicht gesetzt werden.
-
- - Zur einfacheren Portierung existiert eine Amiga-Gadget Klasse.
- Dieses Gadget kann z.Z. Images anzeigen.
- <amigagad.library/amigagad.class>
- Source <pOS_RKRM/pGadgets/AmigaGad.c>
-
- - In der DrawInfo wurde 'dri_Depth' gegen 'dri_NumColorPens' ersetzt.
- Aber: dri_NumColorPens = 1<<dri_Depth (normalerweise)
-
- - Kopieren nach StringInfo->Buffer hat u.U. keine Auswirkung, wogegen
- lesen immer zulässig ist.
-
- - Gadget-Shortkeys arbeiten nur, wenn pOS_SysIMessage() verwendet wird.
- Aber, pOS_SysIMessage() verarbeitet weitere Messages. Um einen
- Seiteneffekt zu verhindern, sollte pOS_SysIMessage() nur dann aufgerufen
- werden, wenn eine Keyborad-Message vorliegt.
- Siehe Source von GT_ReplyIMsg()
-
- - Slider im Window-Border müssen anderst berechnet werden. + (Border-Flag)
- Siehe pOS_RKRM/pIntui/SuperWin.c
-
- - Um keine Refresh-Fehler zu erhalten, sollte immer bei IDCMP_RefreshWindow
- GT_GetIMsg()
- ...
- GT_BeginRefresh()
- .... eigene Zeichen-Routine
- GT_EndRefresh()
- GT_ReplyIMsg()
- aufgerufen werden.
-
-
-
- - IDCMP_Update kann nicht direkt umgesetzt werden.
- Vorschlag:
- {
- struct pOS_IntuiMessage* Msg;
- ...
- if(Msg->im_Class==IDCMP_UpdateGadget) {
- if(Msg->im_Code==IEGUCODE_Notify) {
- const struct pOS_TagItem *Tag=(struct pOS_TagItem*)Msg->im_Data;
- ...
- }
- }
- ...
- }
- oder:
- {
- struct IntuiMessage* Msg;
- ...
- if(Msg->Class==IDCMP_IDCMPUPDATE) {
- const struct TagItem *Tag=IDCMP_GETTAGITEM(Msg);
- if(Tag) {...}
- }
- ...
- }
-
- - ColorMap aus ViewPort
- in pOSxA/clib/graphics_protos.c ist die Funktion
- struct ColorMap* GetColorMapViewPort(struct ViewPort*);
- definiert.
-
-
- - Ein auf dem Stack geklonter RastPort darf nur zur Font-Berechnung
- verwendet werden. Es dürfen auf keinem Fall Draw-Funktionen
- aufgerufen werden.
- Ein Temp-RastPort *MUSS* mit pOS_AllocRastPort erzeugt werden.
-
-
-
- ****** Auflagen für die pOS-Programmierung ***************************
-
- Die jetztige Version besitzt einige Einschränkungen und hält die
- Entwickler an, einheitliche und zukunftssichere Applikationen zu schreiben.
-
- - pOS_OpenScreen() arbeitet nicht:
- Alle Applikationen müssen auf beliebigen Screens lauffähig sein.
- Durch virtuelles True-Color existieren keine Farbprobleme.
-
- - Nur Simple/Super-Refresh Window möglich:
- Der Applikation muß es möglich sein, den Window-Inhalt zu jeder Zeit
- neu zu zeichnen.
- => Ziel: beliebige Screen-Umleitung auf Netzwerke, Speichereinsparung,
- besserer Programmierstil (OOP)
-
- - Forbid/Permit sind funktionstüchtig, müssen in zukünftigen Versionen
- durch Semaphoren ersetzt werden.
- => Multiprozessor-Architektur
- Neue Funktionen zum Locken von Systemlisten sind vorhanden und
- ersetzen Forbid/Permit.
-
- - pOS_SetColor nicht verwenden - der Screen ist public
- Vorschlag: pOS_ObtainColorPen()
-
-
-
- ****** Nachträgliche Optimierung von Amiga-Programmen ****************
- - Beim Refresh mit den Funktionen pOS_CheckVisibleIBox() bzw.
- pOS_CheckVisibleIRect() prüfen, ob das Zeichnen übersprungen werden kann.
-
-
-
-
- ****** Will Ihr Programm nicht laufen ... ***************************
-
- Zuerst empfehlen wird das p-OS mit 'debug -1' zu starten und Enforcer
- und Mungwall zu verwenden. Prüfen Sie nocheinmal, ob alle benötigten
- Libraries und Devices geöffnet und mit dem richten Base-Pointer arbeiten.
- => (gb_DosBase, gb_GfxBase, ...)
- Es ist ebenfalls wichtig, daß der mitgelieferte Start-Code verwendet wird.
- (muß die erste Funktion im Executable sein)
- Den define __IGNORE_NOT_SUPPORTED__ N I C H T setzen und alles neu
- übersetzen.
- Stürtzt das Progamm willkürlich ab, so könnte dies auf einen Funktions-
- aufruf auf Amiga-Exec (über Adresse 4) hinweisen.
- Erzeugen Sie eine Linker-Map-Datei. Prüfen Sie, ob Amiga-Funktion eingelinkt
- wurden. (Die Stream-Funktionen greifen u.U. auf AmigaOS zurück.)
- Wird eine 'BitMap zu Fuß' erzeugt, können beim Zeichen Probleme entstehen.
- BitMaps immer mit AllocBitMap erzeugen und die 'friendMap' angeben.
- Wird der mitgelieferte Startcode verwendet, so *muß* das Programm mit
- FarCode/FarData übersetzt werden. Spezielle Optimierungen für Register-
- übergabe von Parametern können Probleme machen.
-
- Sie können uns auch per e-mail (develop@prodad.de) erreichen.
-
-
-
-
- ****** p-OS Debugger *************************************************
-
- Beim Start von pOS kann 'debug -1' mitangegeben werden.
- => mehr output
-
- Beim Start von pOS kann 'rangetst 1' mitangegeben werden.
- => alle Pointer werden auf Gültigkeit im Adressraum geprüft.
- Sonst werden Pointer nur gegen NULL getestet.
-
- Wird ein Fehler angezeigt, der in einer List-Funktion auftritt und
- 'ln_Succ' bzw. 'ln_Pred' betrift, so kann das zweierlei Ursachen haben.
- - Der neue Node wurde nicht mit ww_InitNode() vorbereitet.
- {ln_Succ=NULL; ln_Pred=NULL;}
- - Es liegt ein Listenfehler vor, doppeltes Einhängen bzw. Aushängen
- vom Node.
-
-
- Bedeutung der Debug-Ausgaben:
- ---------------------------------------------------------------------
- Current: Task=0x7287560 Name=ShowDebug => aktueller Task/Prozeß
- Error: |pOS_OpenFile| {rp const CHAR*} => an dieser Stelle trat der Fehler auf
- {} => Prüfverfahren:
- rp => Pointer test
- cmp => compare
-
- var: |name| = 0x0 => Name der Var(iable) und aktueller Wert
-
- ---------------------------------------------------------------------
-
-
-
-
- ****** Verzeichnisaufbau (Vorschlag von proDAD) *********************
- Assign p:
-
- Dir p:
- -------------------------------
- pDOS (dir) - allgemeines zu DOS
- ArgTags.h
- Date.h
- ...
-
- pDtType (dir) - allgemeines zu DataTypes
- Ascii.h
- DClass.h
- ...
-
- pExec (dir) - allgemeines zu Exec
- CallBack.h
- Class.h
- Device.h
- ...
-
- pGadget (dir) - allgemeines zu Gadgets
- GadCB.h
- Gadget.h
- GadItem.h
- ...
-
- pGFX (dir) - allgemeines zu Graphics
- Color.h
- ColorEx.h
- Text.h
- ...
-
- pIntui (dir) - allgemeines zu Intuition
- GClass.h
- ICI.h
- IntuMsg.h
- ...
-
- pLayer (dir) - allgemeines zu Layer
- Clip.h
- Rect.h
- ...
-
- pLib (dir) - spezielles für den Compiler/Linker
- DevCode.asm - Device-Startcode
- DevCode.o
- LibCode.asm - Library-Startcode
- LibCode.o
- MainCode.c - main(int,char**) - Startcode
- MainCode.o
- pLibExt.c - pOS.lib Source
- SpConsole.h - Sp#?.h - Jmp-Table
- ...
- StartCode.c - StartCode für pOS_ReaDosArgs()
- StartCode.o
- StdIO.c - StdIO-Funks (printf, fopen, ...)
- StdIO.o
- Time.c - StdTime
-
- pPrefs (dir) - allgemeines zu dem Prefs-Programm
- PrefsLibData.h
- PrefsTags.h
- ...
-
- pScreen (dir) - allgemeines zu Screen/Window
- DrawInfo.h
- ScrTags.h
- Window.h
- ...
-
- pSL (dir) - allgemeines zu pSL (Asl.library)
- FileReq.h
- FontReq.h
- pSLTags.h
- ...
-
- pUtil (dir) - allgemeines zu Utility
- TagItem.h
- ...
-
- proto (dir) - Prototypen, xx2.h => extern (für Sie)
- xx.h => intern (nur zur Info)
- pConsole.h - interne Form
- pConsole2.h - normale Form der Prototypen
- pList.h - Protos für List-Funktionen
- ...
-
-
- Device (dir)
- Console.h
- IEvent.h
- Walker.h
- ...
-
-
- pclib (dir)
- ... - wie proto/#?2.h, jedoch mit allen benötigten Includes
-
-
-
- dir pos:pos
- --------------------------------
- Games (dir) - einige Spiele
- tetris (dir)
- Tetris
- PBall - wurde mit der sgos.library erstellt
-
- pOpus (dir)
- pOpus - Dir-Tool
- pOpus.cfg
-
- Locale (dir)
- Countries (dir)
- Deutschland.country
- Languages (dir)
- deutsch.language
- Catalogs (dir)
- deutsch (dir)
- sys (dir)
- sys.catalog
- Help (dir)
- sys.hlp
-
- ssa (dir) - (für proDAD und für den ssa-datatype)
- ...
-
- c (dir) - Kommandos ( c wird nicht über assign C: gesucht, sonder 'path' )
- ...
-
- Ex (dir) - Executables der pOS_RKRM-Beispiele
- ...
-
- Prefs (dir) - wird vom pOSPrefs geladen
- #?.library
-
- Env (dir) - ENV: ist eine MultiAssign (+ENVARC)
- sys (dir)
- con
- Shell (dir) - Default-Parameter für Shell-Kommandos
- newshell
- SysGfx (dir)
-
- EnvArc (dir)
- sys (dir)
- Locale.prefs
- Serial.prefs
- SysGfx (dir)
- Background.pic
- ES_Req.pic
- prodad.anim
-
- S (dir)
- EnBootShell.scp - wird beim Schließen der Boot-Shell gestartet
- EndShell.scp - wird beim Schließen einer Shell gestartet
- pdt_SDev - Script/Command - wird von DOS bei 'not mounted'
- gestartet
- StartShell.scp - wird beim Öffner einer Shell gestartet
- startup.scp - wird beim 'Booten' aufgerufen
- StBootShell.scp - wird beim Öffnen der ersten Shell aufgerufen
- user-startup.scp - wird von 'startup.scp' aufgerufen
-
- Fonts (dir)
- proDAD (dir)
- 16
-
- Devs (dir)
- fsa.ddv - Amiga kompatibles Filesystem
- mountlist.arg - Mountlist, in der s:pdt_SDev nach dem Device sucht
-
- Libs (dir)
- AmigaGad.library - Emulation vom Amiga-Gadget
- CalcGad.library - Taschenrechner-Gadget
- FindGad.library - Demolib aus pOS_RKRM
- mathffp.library
- MathIeeeSingBas.library
- MathIeeeSingTrans.library
- MathTrans.library
- ObjATool.library - Sammlung von Gadget für z.B. pOpus
- plocale.library
- psl.library - wie asl.library
- sgos.library
- ...
-
-
- ****** MakeFiles ******************************************************
-
- ------------------------ SAS (smake) -------------------------
- #
- # universal Makefile for pOS
- #
-
-
- OBJS = GfxView.o
- PROG = pOS:pOS/Ex/GfxView
-
-
- #
- # SAS/C
- #
-
- CC = sc:c/sc
- LD = sc:c/slink
- AS = Prog:Barfly/basm
-
- STARTUPCODE = p:pLib/StartCode.o
-
- CCOPTS = ERRORREXX NOLINK NOICON DATA=FAR CODE=FAR CPU=68020 NOSTACKCHECK IGNORE=79 IGNORE=110 INCLUDEDIR=p: INCLUDEDIR=include: DEFINE __pOS__=1 OPTIMIZE OPTIMIZERINLINELOCAL OPTIMIZERTIME OPTIMIZERALIAS OBJECTNAME
- LDOPTS = SMALLDATA SMALLCODE
-
- LIBS = p:/lib/pOS.lib p:/lib/StdIO.lib p:/lib/pOSStub.lib p:/lib/List.lib
-
-
-
- ------------------------ Storm ------------------------------
- #
- # StormC
- #
-
- #CC = Prog:StormC/StormSYS/StormC2
- #LD = Prog:StormC/StormSYS/StormLink2
- #AS = Prog:Barfly/basm
-
- #STARTUPCODE = p:pLib/StartCode.o
-
- #CCOPTS = -as -pp -O9 -gC -gD -g20 -i p: -i include: -w500
- #LDOPTS = OOP
-
- #LIBS = StdIO.lib pOSStub.lib pOS.lib CPPList.lib
-
-
-
- $(PROG): $(OBJS)
- @Echo ""
- @Echo "*e[20;1m Linking $<*e[0m"
- @$(LD) $(STARTUPCODE) $(OBJS) TO $(PROG) LIB $(LIBS) $(LDOPTS)
-
-
- .c.o:
- @Echo ""
- @Echo "*e[20;1m Compiling $<*e[0m"
- @$(CC) $(CCOPTS) $(OBJDIR)$*.o $*.c
-
-
- .s.o:
- @Echo ""
- @Echo "*e[20;1m Assembling $<*e[0m"
- @$(AS) -o$(OBJDIR)$*.o $*.s
-
-
- GfxView.o: GfxView.c
-
-
-
-
- ---------------------------- Maxon ---------------------------
- mcppc3 -gs -o test p:pLib/StartCode.o -pc test.c -l StdIO.lib -l pOSStub -l pOS -l List
-
-
-
- -gs = ohne Startupcode linken
- -o = Definiert Zieldateiname
- -pc = im C-Modus übersetzen
- -l pOSxA = wenn mit den Amiga-Cross-Includes (p:/pOSxA/#?) gearbeitet
- wird. Sonst diesen Teil weglassen.
-
- in ENV:CPPOPT ist voreingestellt:
- -w1000 -en -e10 -gh128 -pp -wEPRTcV -i p:/posxa -j ram:lib
- -i = Suchpfad für die Includedateien
- -j = Suchpfad für die Linklibraries
-
-
-
-
-
-
-
-
-
- ©proDAD
-