← ST-Computer 07 / 1991

Turbo C Blues

Programmierpraxis

Turbo C ist ja ein anerkannt guter C-Compiler fĂŒr den Atari. Einen guten Teil seiner PopularitĂ€t hat er auch seiner integrierten Entwicklungsumgebung zu verdanken. Diese arbeitet unter ‘normalen’ UmstĂ€nden auch prĂ€chtig. Doch leider haben immer weniger Computerbenutzer einen ‘normalen’ Rechner. Viele haben ihren Rechner hier und da ein wenig erweitert und möchten diese Erweiterungen mit allen Programmen nutzen können.

Vor einigen (vielen) Monaten wurde im ST-Magazin [1] ein Beitrag veröffentlicht, der versprach, dem Atari-Monitor SM 124 hinsichtlich der Bildschirmauflösung Beine zu machen. Diese Hyperscreen-Erweiterung funktionierte auch bestens, und mit dem abgetippten Listing gelang es auch schließlich, (etwas) Großbildschirm-Feeling auf-kommen zu lassen.

Doch leider arbeitet Turbo C mit Hyperscreen NICHT. Der eingebaute Editor arbeitet ohne Schwierigkeiten (wenn man davon absieht, daß er viel zu langsam ist), aber beim Umschalten auf den User-Screen mittels ESC erscheinen allerlei unsinnige Muster auf dem Bildschirm; nach nochmaligem Umschalten muß man, um einen Absturz des Programms zu vermeiden, sofort QUIT anwĂ€hlen (keine gute Alternative...) Dies ist umso verwunderlicher, da die Shell auch auf Großbildschirmen lĂ€uft. Dort wird beim Umschalten auf den Userscreen der alte Bildschirminhalt korrekt gesichert und spĂ€ter auch wieder restauriert.

Mit diesem Wissen bewaffnet, galt es, den ‘Fehler’ zu finden... Wochen spĂ€ter: Nach langem Probieren schĂ€lt sich eine Lösung fĂŒr dieses Problem heraus.

Die Idee

Die Turbo C-Shell testet das Vorhandensein eines Großbildschirms mit dem Versuch, die Bildschirmadresse zu verĂ€ndern. Wenn es gelingt, den Bildschirm probeweise auf eine andere Speicherseite umzuschalten, schaltet die Shell zwischen dem Benutzerschirm und dem eigenen Bild mittels Setscreen um; falls es jedoch nicht gelingen sollte, die Bildschirmadresse zu verĂ€ndern, sichert die Shell den eigenen Bildschirm beim Start eines Programms bzw. beim Anzeigen des Userscreens in einem Puffer (wahrscheinlich mittels vro_cpyform).

Das Programmkonzept

Damit wird es möglich, die Shell dazu zu4 ĂŒberreden’, auch Hyperscreen als Großbildschirm zu akzeptieren. Ein kleiner Handler fĂ€ngt den XBIOS-Aufruf Setscreen ab und Ă€ndert die Parameter fĂŒr Physbase und Logbase in -1 ab. Damit wird dem Betriebssystem vorgegaukelt, daß diese Parameter nicht gesetzt werden sollen, was es auch prompt nicht tut.

Die TC-Shell merkt daraufhin, daß es wohl nicht möglich ist, die Bildschirmadresse zu verĂ€ndern, und behandelt nun auch den SM 124 wie einen ‘Großbildschirm’. Damit wird es endlich möglich, die vollen 80 Zeichen in einer Zeile darzustellen; auch im Hilfefenster macht sich die grĂ¶ĂŸere Auflösung positiv bemerkbar.

Die Realisierung

Das Listing sollte alle Fragen zur Implementierung beantworten, da es (hoffentlich) ausreichend kommentiert ist:

Es wird mittels der Line A-Variablen [2] getestet, ob mehr Bytes pro Rasterzeile benutzt werden, als dies normalerweise der Fall ist. Nur wenn mehr Bytes benötigt werden, wird das Programm resident geladen.

Der XBIOS-Handler wird auf eine eigene Routine umgelenkt, die den Setscreen-Befehl abfÀngt und in die folgende Form Àndert:

Setscreen(x,-1 L,-1L);

Es wird aber nicht explizit getestet, ob Hyperscreen geladen ist. Damit sollte es möglich sein, auch Bigscreen o.À. zusammen mit TC zu benutzen. Auch wird NICHT getestet, ob ein anderer Prozessor als der MC68000 im Rechner eingebaut ist. Daher ist es mit einem 68020-Board (oder gar auf dem TT) nicht lauffÀhig. In diesem Fall ist nÀmlich der Aufbau des Stacks nicht zum 68000 kompatibel...

Eine Warnung zum Schluß: Der Debugger funktioniert auch jetzt leider noch nicht, da er sehr nah (ZU NAH) an der Hardware des ST programmiert ist. Trotzdem viel Spaß mit HyperTurboC.

Literatur:

[1] ST-Magazin 5/89 S. 16ff

[2] Jankowski, Reschke, Rabich; Atari ST Profibuch; Sybex-Verlag

;************************************************* ;** XBIOS-Patch fĂŒr Turbo C ;** ;** Friedel van Megen ;** ;** (c) 1991 MAXON Computer ;** ;************************************************* gemdos equ 1 Cconws equ 9 ;schreibe String Ptermres equ 49 ;Terminate but stay resident xbios equ 14 Supexec equ 38 ;exec in Supervisormode Setscreen equ 5 ;Set screenbase v_trp14 equ $b8 ;Trap #14 Vektor p_start bra p_init ;zum Start! ;************************************************ ;** patch as patch can... ;************************************************ inst_vec move.l v_trp14,sv_trp14 ;Trap #14 Vektor patchen move.l #new_trp14,v_trp14 rts ;************************************************ ;** neuer TRAP #14 handler, XBRA-tauglich, Kennung 1PBIT' ;************************************************ dc.l 'XBRA' dc.l 'PBIT' sv_trp14 dc.l 0 ;savearea fĂŒr trap #14-vektor new_trp14 move.l a7,a0 ;welchen Stackpointer soll ich benutzen addq.1 #6,a0 ;(das SR wird in jedem Fall auf dem SSP abgelegt) move.w (sp),d1 ;Statusregister holen btst #13,d1 bne.s in_supm ;ok, Supervisor move.l usp,a0 ;Aufruf aus USER-Mode in_supm move.w (a0)+,d0 ;Funktionscode cmp.w #Setscreen,d0 ;Soll ich was machen? bne.s end_ein ;Nein -> move.l #-1,(a0) ;verhindern, daß die Bildschirmadresse move.l #-1,4(a0) ;geĂ€ndert wird end_ein move.l sv_trp14,a0 jmp (a0) ;dann eben nicht... p_end nop ;************************************************ ;** initialisieren... ;************************************************ p_init pea copy_msg ;Nur mein NAME.... move.w #Cconws,-(sp) trap #gemdos addq.1 #6,sp dc.w $a000 ;Line A-Parameterblock holen moveq.l #80,D0 ;Bytes pro Zeile (bei 'normaler' Auflösung) mulu.w (A0),D0 sub.w 2(A0),D0 ;akt. Anzahl Bytes pro Zeile bpl no_big_scr ;nur die normale Auflösung pea on_msg ;Dies ist was hypermĂ€ĂŸiges move.w #Cconws,-(sp) trap #gemdos addq.l #6,sp pea inst_vec ;nur noch Vektoren patchen move.w #Supexec,-(sp) trap #xbios addq.1 #6,sp move.w #0,-(sp) ;wir bleiben resident! move.l #$100+p_end-p_start,-(sp) move.w #Ptermres,-(sp) trap #gemdos ;Das war's... no_big_scr pea not_on_msg move.w #Cconws,-(sp) trap #gemdos addq.l #6,sp clr.w -(sp) trap #gemdos ;Nicht resident ;************************************************ ;** DATA ; ************************************************ data copy_msg dc.b 13,10,"Setscreen manager V1.0",10,13 dc.b "by Friedel van Megen",13,10,0 not_on_msg dc.b "NOT " on_msg dc.b "INSTALLED...",13,10,0 end
Friedel van Mengen