&&
------------------------------------------------------------------------------
                AMIGABASIC-CURSUS - MACHINETAAL IN AMIGABASIC
------------------------------------------------------------------------------

Om AmigaBasic wat meer snelheid te geven en een aantal in Basic onmogelijke
dingen te doen kunnen we in de Amiga gemakkelijk teruggrijpen op machinetaal.

Een subroutine is voor AmigaBasic een subroutine, in welke taal die ook ge-
schreven is. Met CALL kunnen we een SUB aanroepen. Staat daar echter geen
SUB-label achter maar een variabele met een waarde dan wordt er eenvoudig naar
dat adres gesprongen en de daar aanwezige machinetaal-routine wordt uitge-
voerd.

Nu staat natuurlijk niet overal een machinetaal-routine, we moeten de routine
eerst binnenladen, maar ook daar help ons het operating-system met een handig
kommando.

Nadat de machinetaal geladen is, is deze beschikbaar om zo vaak als nodig aan-
geroepen te worden. Willen we het programma netjes verlaten dan moeten we aan
het eind van het programma het gereserveerde geheugen terug geven aan de
Amiga.
&&
Hier volgt het programma dat een stukje machinetaal inleest en na gebruik het
geheugen weer vrij geeft.

   DEFLNG a-Z
   DECLARE FUNCTION LoadSeg LIBRARY
   REM UnLoadSeg heeft geen declaratie nodig.
   LIBRARY "dos.library"
   LIBRARY "exec.library"

De initialisatie van de libraries en .BMAP-files.

   BCPL&=LoadSeg (SADD("Machinetaal-File"+CHR$(0)))
   IF BCPL&=0 THEN PRINT "FOUT in lezen machinetaal" :GOTO Einde
   Segment&=BCPL&*4
   Routine&=Segment&+4

Hier gebeuren een aantal vreemde dingen. De eerste regel laadt het eigenlijke
programma binnen. Daarbij wordt automatisch geheugen gereserveerd voor het
programma.

Heeft BCPL& een waarde dan is het programma goed geladen. Is de inhoud van
BCPL& gelijk aan nul dan is er iets mis gegaan. Meestal is er te weinig
geheugen aanwezig. Regel 2 test daar op.
&&
De variabele BCPL& bevat het adres waar de routine is geladen. Dat adres is
echter geen voor AmigaBasic geschikt getal. Er zijn wat berekeningen nodig om
het juiste adres te vinden. Dat ge- beurt op regels 3 en 4. Uiteindelijk staat
in Routine& het adres van de machinetaal-routine.

Nu is alles al klaar. De aanroep gaat nu eenvoudig door de naam van de vari-
abele op te geven :

   Routine&

Aan het eind van het programma moeten we alles weer in orde brengen voor het
geval dat een ander programma gestart moet worden :

   Einde:
   UnLoadSeg (BCPL&)
   LIBRARY CLOSE

Het kommando UnLoadSeg geeft het geheugen vrij en laat de routine verdwijnen.
Daarbij heeft het weer de inhoud van de variabele BCPL& nodig en niet die van
Routine&.
Als laatste sluiten we de gebruikte libraries.

Zonder machinetaal-programma hebben we natuurlijk niets aan deze Basic-regels.
We moeten een zinnig programma maken dat in Basic te langzaam is. Dan moeten
we dat natuurlijk in assembler kunnen programmeren. Omdat een vrij standaard
assembleer-routine wordt gebruikt zijn veel al gemaakte programma's te ge-
bruiken.
&&
Ik heb hier een voorbeeld van een programma dat een aantal kleuren van de
palette een kleur verschuift. U kunt zo eenvoudig een color-cycle maken met
veel kleuren. Laten we eerst de routine eens bekijken. Deze is met SEKA te
assembleren.


; ColorCycle

ExecBase=   4                      ;ROM-entry
OpenLib=    -552                   ;Open een library
LoadRGB=    -192                   ;Laden van de kleuren
CloseLib=   -414                   ;Sluiten library

Cycle: movem.l   d0-d7/a0-a6,-(sp) ;Alles op de stack
       move.l    ExecBase,a6       ;4 Naar pointer
       lea       GFXName,a1        ;Naam van Graphics.library
       moveq     #0,d0             ;
       jsr       OpenLib(a6)       ;Open de Graphics.library
       tst.l     d0                ;Test of het gelukt is
       beq       Exit              ;Nee, dan stoppen
       move.l    d0,a6             ;Pointer opslaan in A6
       move.l    64(sp),a0         ;Window(7) van stack pakken
       move.l    46(a0),a0         ;x
       add.l     #44,a0            ;x uitrekenen van de plaats
       move.l    4(a0),a1          ;x van de kleur-tabel
       move.l    4(a1),a1          ;x
       lea       CTab,a2           ;Eigen kleur-tabel
&&
       moveq     #15,d0            ;15 longs

CopyCT:
       move.l    (a1)+,(a2)+       ;Sla kleurentabel van het
       dbra      d0,CopyCT         ;  scherm op voor later
       movem.l   68(sp),d0-d1      ;Haal start en eind van stack
       andi.w    #31,d0            ;And met 31 van start
       andi.w    #31,d1            ;And met 31 van eind
       lsl.b     #1,d0             ;Maal 2
       lsl.b     #1,d1             ;Maal 2
       lea       CTab,a1           ;Adres eigen tabel
       move.w    (a1,d1.w),d2      ;Bekijk of het omhoog of
       cmp.b     d0,d1             ;  omlaag moet lopen
       beq       ClLib             ;
       bgt       Up                ;Omhoog

Down:                              ;Omlaag
       move.w    2(a1,d1.w),(a1,d1.w)  ;Verplaats
       addq.b    #2,d1             ;2 Verder
       cmp.b     d0,d1             ;Al klaar ?
       bne       Down              ;Nee, dan verder
       bra       SetLC             ;Ja, dan zetten van de kleuren

Up:                                ;Omhoog
       move.w    -2(a1,d1.w),(a1,d1.w) ;Verplaats
       subq.b    #2,d1             ;2 Minder
       cmp.b     d0,d1             ;Al klaar ?
&&
       bne       Up                ;Nee, dan verder

SetLC:                             ;Klaar
       move.w    d2,(a1,d1.w)      ;Verplaats tabel
       moveq     #32,d0            ;32 woorden
       jsr       LoadRGB(a6)       ;Initialiseer de kleuren

ClLib:                             ;Sluit de library
       move.l    a6,a1             ;Pak de pointer in A1
       move.l    ExecBase,a6       ;ROM-pointer in A6
       jsr       CloseLib(a6)      ;Sluiten

Exit:                              ;Einde
       movem.l   (sp)+,d0-d7/a0-a6 ;Alles van de stack af
       rts

GFXName:
       dc.b      'graphics.library',0,0 ;GFX-naam

CTab:
       dc.w      32                ;Buffer van 32 woorden
&&
Dat was het machinetaal-programma. Nu is alleen de aanroep vanuit Basic
belangrijk :

   Routine& WINDOW(7),Start-kleur(0-31),Eind-kleur(0-31)

Omdat niet iedereen met SEKA overweg kan of bezit, staat het Basic- en het
Assembler-programma op de diskette. Daar staan zowel het source- en het
object-file.

De Seka-source staat in de machinetaal-directory.
















- EINDE ----------------------------------------------------------------------
&&
