Min Spalte - Øyvind Harboe EXEC 2/89 Denne gangen skal jeg vise dere hvordan en lager en aldri så "liten" demo på hvordan sette de riktige pointerne, flags og register når man operer utenfor AmigaDos. Mange har sagt at Amigaen har en blitter som gjør at den kan bevege store bobs helt smooth, men hva med mange små? Amigaen kan gjøre en utmerket jobb der også, beviset er i mitt program. Hva gjør denne demoen og hvordan virker den? Den beveger 100(hundre) 16X16 2 bitplanes bobs rundt omkring på skjermen, ved hjelp av blitteren. Problemet med blitteren når en skal bruke den mange ganger, er at det tar tid å sette registerene i blitteren. Dette problemet har jeg løst ved å bruke copperkomandoene til å sette registerene og starte blitteren. LITT OM DE PRAKTISKE PROBLEMENE SOM DUKKET OPP: TIMING: Da jeg hadde skrevet ferdig programmet, rotet av og til programmet til CHIP memoryen. Problemet var at jeg staret blitteren, og umiddelbart etterpå ventet på at den skulle bli ferdig(det finns en egen copperkomando for å vente på at blitteren skal bli ferdig.) Det som skjedde var at blitteren ikke var startet før jeg ventet på at den skulle bli ferdig. Løsningen på problemet var å duplikere copperkomandoen for å vente på blitteren. FLIKKER: Jeg fant snart ut at jeg trengte dobbelbuffering på skjermminnet for at det ikke skulle bli noe flikker. Dobbelbuffering er en metode som er mye benyttet, og den er egentlig ganske enkel i bruk: Jeg har to skjermbilder, det ene vises, det andre tegnes det på. Neste raster byttes oppgavene. Til min store ergrelse viste det seg at jeg også trengte dobbelbuffering på copperlistene, slik at jeg skulle være sikker på unngå at copperlistene ble forandret mens de var i bruk. SYSTEMKOMPATIBILITET: I programmet vil noen av dere fort legge merke til at jeg har skrevet helt nye interrupt rutiner. Det har jeg gjort fordi jeg vil være helt sikker på at jeg kan bruke blitter, copper og resten av hardwaren uten hemninger. Spesielt vil jeg gjerne poengtere at jeg har laget en rutine for å plukke opp de tastetrykkene som kommer. Årsaken til at jeg har tatt meg bryet er ganske enkelt at maskinen henger seg opp hvis ikke, fordi den hele tiden setter ports interrupt request flagget. Jeg har i hele min karriere som hardware programmerer irritert meg over tyske crackere som ikke vet å returnere tilbake til den gode gamle AmigaDos skjermen etter at de har vist sine kunster med hardwaren. Dette er så enkelt, men allikevel så sjelden gjort. Alt en behøver for å finne pointeren til systemcopperlistene er å åpne graphics.library og plukke ut pointeren ut ifra gb_copinit offsettet på library basen: move.l _GfxBase,a0 move.l gb_copinit(a0),cop1lc+_custom MEMORY CONFIGURERING: Det synes som om alle som lager demoer går utifra at en ikke har noe ekstra utstyr oppkoblet, men det hender jo ikke så rent sjelden at noen har fått bruk for noen ekstra K. De som går programmet mitt i sømmene finner fort ut at det eneste jeg har gjort for at programmet skal virke med alle ekstra ram er å fortelle hvor de forskjellig sections skal være. En liten oppfordring til dere demoprogramerere, bruk muligheten for å bestemme hvor sectionene skal ligge når dere først har muligheten: Section Name,BSS_C BSS section i CHIP Section Name,CODE_C CODE section i CHIP Section Name,DATA_C DATA section i CHIP LITT ELEMENTÆR 68000 kode: De fleste vet det ikke, men Z flagget blir ikke rørt hvis destination er et noe annet enn et data register i en "move" kommando: move.l d0,$1000 setter IKKE Z flagget move.l $1000,d0 SETTER Z flagget Tro det eller ei, men dette er en vanlig årsak til at programmer Gurer. OM BLITTEREN: Mange har store problemer med å finne ut av hvordan den logiske blitteropperasjonsbyten blir regnet ut. Som alt annet dette er enkelt når en bare kan det: Equation LF kode Equation LF kode Equation LF kode D=A F0 D=B CC D=C AA D=notA 0F D=notB 33 D=notC 55 D=AC A0 D=AB C0 D=BC 88 D=AnotC 50 D=AnotB 30 D=BnotC 44 D=notAC 0A D=notAnotB 03 D=notBC 22 D=notAnotC 11 Dette er en liste over de forskjellige logiske opperasjonene som blitteren kan utføre. Dersom du vil kombinere disse kan du gjøre det slik: For å plassere bobene ut på skjermen trenger jeg den logiske operasjonen: D=AB+notAC Alt jeg behøver å gjøre er å "or"e de to forskjellige komandoene sammen til en, D=AB LF=C0 og D=notAC LF=0A. C0 or 0A=CA $CA er LF koden for den blitteropperasjonen D=AB+notAC. For dere som ikke er helt trygge i bolsk algebra, skal jeg ta en rask gjennomgang av de de forskjellige operatorene gjør: + er identisk med maskin kode kommandoen "or" AB er det samme som A and B, der and er lik i funksjon som maskinkode komandoen "and" not er identisk med maskinkode komandoen "eor" Øyvind Harboe Admiral Hammerich v.6 4011 Stavanger Tlf 04-524305 Dersom du skriver, send med en frankert og adressert konvulutt til svaret.