Turbo C Blues

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
Aus: ST-Computer 07 / 1991, Seite 76

Links

Copyright-Bestimmungen: siehe Über diese Seite