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 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).
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.
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