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