5
1*

{3                    Resepti ympäristöystävälliselle demolle
{3                    ---------------------------------------

                                 Aki Laukkanen
  

Muistatteko parin vuoden takaiset ajat, jolloin demon saaminen toimimaan  omalla
koneellasi oli suoranainen ihme? Tuolloin demot oli suunniteltu vain yhdelle ko-
koonpanolle: A500 + 0.5MB CHIP-muistia. Jos  oma  kokoonpanosi  poikkesi  kysei-
sestä, sait useimmissa tapauksissa unohtaa demon kokeilemisen. Syitä oli  monia:
itseään muuttava koodi, tiettyyn osoitteeseen käännetty tai tiettyä muistialuet-
ta suoraan ilman varaamista osoittava koodi, osoiterekisterien ylimpien  bittien
käyttäminen datana, busy-looppien käyttäminen ajoitukseen, kaikenlaiset  oletuk-
set koneen tilasta ja nopeudesta jne. Luetteloa voisi jatkaa loputtomiin.  Miten
nykypäivinä?

Nykyään konekokoonpanoihin on tullut vain lisää variaatiota: AGA tuli  sotkemaan
asioita loppuvuodesta 1992 uuden käyttöjärjestelmän ja uusien prosessorien kera.
Oli luonnollista ajatella, etteivät vanhat demot toimi uusissa  koneissa.  Eihän
silloin voitu edes varautua tuleviin muutoksiin Commodoren (R.I.P.) nihkeän  po-
litiikan vuoksi. Ajat muuttuivat, ja uudeksi "jokamiehen kokoonpanoksi"  vakiin-
tui A1200 ja ehkä jonkin verran FAST-muistia, joten demotkin alkoivat luonnolli-
sesti hyödyntää em. kokoonpanoa. Mutta mihin jäivät muut koneet ja kokoonpanot?
Ilmeisesti osalle koodereista ovat VGA-  ja  multisync-monitorit  tuntemattomia.
Näin ollen ei voida pitää varmana, että käytössä oleva näyttömoodi  demoa  käyn-
nistettäessä olisi PAL High Res. Jos näyttömoodi "sattumalta" onkin joku toinen,
kuten MULTISCAN tai DBLPAL, ei kone osaa tulkita copperlistiä oikein, vaan  seu-
rauksena on pikselien sekasotku.  Oikea  ratkaisu  olisi  ollut  LoadView(NULL);
WaitTOF(); WaitTOF(); -kutsusarja, jota onneksi yhä useammat kooderit ovat alka-
neet käyttää. Tämä näkyy esimerkiksi verrattaessa The Party  III:n  ja  Assembly
'94:n  demoja.  Jälkimmäisistä  huomattavasti  suurempi  osa   toimii   "systee-
miystävällisemmin".

Edelleen tuntematon näyttää olevan 68040-prosessori, erityisesti sen  Writeback-
cachet. Käytössä olevan prosessorinhan saa tietää ExecBasen  AttnFlags-kentästä.
Kyseisen kentän bittien merkitykset on selostettu Exec/execbase.i-tiedostossa.

Kolmas skenaario toteutuu,  jos  onneton  käyttäjä  yrittää  kokeilla  AGA-demoa
ECS/OCS-koneessa. Jotkut demot eivät testaa piirisarjaa, vaan yrittävät  käyttää
AGA-rekistereitä ja muita  uusia  ominaisuuksia  -  jälleen  seuraa  ilotulitus.
Käytetyn apuprosessorisetin voi tarkistaa monella tavalla.  Yksinkertainen  tapa
on GfxBase:n ChipRevBits0-kenttä.  Mahdolliset  bittiyhdistelmät  on  selostettu
graphics/gfxbase.i- tiedostossa. On kuitenkin muistettava, että kenttä  otettiin
käyttöön vasta Kickstart V39:ssä. Toinen tapa on katsoa suoraan LISAID- rekiste-
riä ($dff07c). Rekisteri otettiin kuitenkin käyttöön  vasta  ECS:ssä,  joten  on
huolehdittava, että väylällä on joku tietty luku esim.  kirjoittamalla  johonkin
hardware-rekisteriin. (Kiitokset tiedosta Sami  Klemolalle.)  Mahdolliset  vaih-
toehdot ovat $fc (ECS Denise), $f8 (AGA Lisa) tai viimeksi väylällä  ollut  luku
(OCS Denise). Tietysti on myös muistettava mahdolliset tulevat  apuprosessorise-
tit kuten AAA ja Hombre. Toisaalta, jos prosessorina on HP PA-Risc, niin mahdol-
lisista oletuksista ei liene hyötyä?-)

Muitakin seikkoja on toki muistettava. Nykyisinhän ovat monet demot  WB-käynnis-
tettäviä, eli niillä on oma ikoni. Tällaisen  ohjelman  täytyy  muistaa  vastata
WBenchMsg:een ohjelmasta poistuttaessa, jotta Workbench voi vapauttaa sen vaati-
man muistin. Lisäksi olisi syytä osata disabloida käyttöjärjestelmä oikein  Exe-
cin Disable()-rutiinilla.

PS. Artikkelin ohella olen tehnyt pienen koodinpätkän, joka tarkistaa  prosesso-
rin ja apurosessorit, osaa vastata WBenchMsg:hen, tallettaa vanhan Viewin ja te-
kee muiden näyttötilojen käytön mahdolliseksi.  Lisäksi  se  disabloi  moniajon.
Mahdolliset testien tulokset ohjelmanpätkä jättää pääohjelman tutkittavaksi. Ot-
takaa huomioon, että sitä ei ole testattu eikä optimoitu mitenkään, joten se  ei
_varmastikaan_ ole paras tapa tehdä asiat. 

        include "exec/types.i"
        include "libraries/dosextens.i"
        include "graphics/gfxbase.i"
        include "exec/libraries.i"
        include "exec/execbase.i"

        xref    _LVOFindTask
        xref    _LVOWaitPort
        xref    _LVOForbid
        xref    _LVOGetMsg
        xref    _LVOReplyMsg
        xref    _LVODisable
        xref    _LVOEnable
        xref    _LVOOpenLibrary
        xref    _LVOCloseLibrary

        xref    _LVOLoadView
        xref    _LVOWaitTOF

NOCHIPREV equ 0

        SECTION CODE,code

startup:
        movem.l d0/a0,-(sp)             ; Tallennetaan d0 ja a0
        move.l  4,a6                    ; SysBase
        move.l  #0,a1
        jsr     _LVOFindTask(a6)        ; Haetaan oma prosessi
                                        ; jsr -$0126(a6)
        move.l  d0,a4
        move.l  d0,process
        tst.l   pr_CLI(a4)              ; CLI?
                                        ; tst.l $ac(a4)
        bne.s   check_aga               ; jos CLI niin check_aga
wb:
        lea     pr_MsgPort(a4),a0       ; Haetaan prosessin viestiportti
                                        ; lea $5c(a4),a0
        jsr     _LVOWaitPort(a6)        ; Odotetaan viestiä
                                        ; jsr -$0180(a6)
        lea     pr_MsgPort(a4),a0
        jsr     _LVOGetMsg(a6)          ; Haetaan viesti
                                        ; jsr -$0174(a6)
        move.l  d0,wbenchmsg            ; tallennetaan ohjelman tarvetta
                                        ; varten
check_aga:
        moveq   #0,d0
        lea     gfxname,a1              ; avataan
        jsr     _LVOOpenLibrary(a6)     ; graphics.library
                                        ; jsr -$0228(a6)
        move.l  d0,gfxbase
        beq.w   reply_to_wb             ; jostain syystä ei saatu avattua
        move.l  d0,a4

        jsr     _LVODisable(a6)         ; keskeytykset pois
                                        ; jsr -$0078(a6)
        cmp.w   #39,LIB_VERSION(a4)     ; onko ChipRevBits0 määritelty
                                        ; cmp.w #39,$14(a4)
        bne.s   no_chiprev

        move.b  gb_ChipRevBits0(a4),chiprev
                                        ; move.b $ec(a4),chiprev
        bra.s   check_proc
no_chiprev:
        move.b  #NOCHIPREV,chiprev      ; Ei pystyta hakemaan ChipRevBits:ia
check_proc:
        move.w  AttnFlags(a6),processor ; CPU ja FPU
                                        ; move.w $128(a6),processor
clear_view:
        move.l  gfxbase,a6
        move.l  gb_ActiView(a6),oldview ; nykyinen View talteen
                                        ; move.l $22(a6),oldview
        move.l  #0,a1                   ; NULL View tilalle
        jsr     _LVOLoadView(a6)        ; jsr -$00de(a6)

        jsr     _LVOWaitTOF(a6)         ; jsr -$010e(a6)
        jsr     _LVOWaitTOF(a6)

        move.l  4,a6                    ; SysBase valmiiksi
        movem.l (sp)+,d0/a0             ; d0/a0 pois pinosta
        bsr.s   _main                   ; hypätään pääohjelmaan
        move.l  d0,-(sp)                ; palautuskoodi turvaan
old_view:
        move.l  gfxbase,a6
        move.l  oldview,a1              ; vanha View
        jsr     _LVOLoadView(a6)        ; jsr -$00de(a6)

        move.l  4,a6                    ; jsr -$007e(a6)
        jsr     _LVOEnable(a6)          ; keskeytykset päälle

        move.l  a6,a1                   ; suljetaan graphics.library
        jsr     _LVOCloseLibrary(a6)    ; jsr -$019e(a6)

reply_to_wb:
        tst.l   wbenchmsg               ; onko workbench
        beq.s   exit                    ; jos ei niin exit
        jsr     _LVOForbid(a6)          ; huomaa ettei tarvitse Permit()
                                        ; jsr -$0084(a6)
        move.l  wbenchmsg,a1
        jsr     _LVOReplyMsg(a6)        ; jsr -$017a(a6)
exit:
        move.l  (sp)+,d0
        rts                             ; poistutaan ohjelmasta

_main:  moveq   #0,d0                   ; palautuskoodi
        rts                             ; pääohjelma


        SECTION DATA,data

wbenchmsg       dc.l    0
oldview         dc.l    0
process         dc.l    0
gfxbase         dc.l    0
processor       dc.w    0               ; AFB_68010 equ 0
                                        ; AFB_68020 equ 1
                                        ; AFB_68030 equ 2
                                        ; AFB_68040 equ 3
                                        ; AFB_68881 equ 4
                                        ; AFB_68882 equ 5
                                        ; AFB_FPU40 equ 6
                                        ; AFB_68060 equ 7
chiprev         dc.b    0               ; GFXB_BIG_BLITS equ 0
                                        ; GFXB_HR_AGNUS  equ 0
                                        ; GFXB_HR_DENISE equ 1
                                        ; GFXB_AA_ALICE  equ 2
                                        ; GFXB_AA_LISA   equ 3
gfxname         dc.b    'graphics.library',0

        end
