; From Section 2.7.5 Amiga System Programmers Guide by Abacus
; © 1988 Abacus
mem          = $20004
Availmem     = -216
memtype      = $10004
numData      = 300
Allocmem     = -198
Freemem      = -210
addIntServer = -168
RemIntServer = -174
akey         = $bfec01
pri          = 100
Type         = 2
intNum       = 3
is_Data      = 14
is_Code      = 18
ln_Type      = 8
ln_Pri       = 9
ln_Name      = 10

       move.l $4,a6
       move.l #numData,d0
       move.l #memtype,d1    ;fast,CLR
       jsr    Allocmem(a6)
       tst.l  d0
       beq    error
       move.l d0,a2
       add.l  #32,d0         ;start of data storage
       move.l d0,is_Data(a2)
       move.b #pri,ln_Pri(a2)
       move.b #Type,ln_Type(a2)
       move.l #Ende-Start+8,d0 ;Code size set for program
       jsr    Allocmem(a6)
       tst.l  d0             ;error?
       bne    ok1            ;NO
       move.l a2,a1          ;*Interrupt
       move.l #numData,d0
       jsr    Freemem(a6)    ;Free up memory
       jmp    error

ok1:   move.l d0,a3
       move.l a3,is_Code(a2)
       move.l a2,a1          ;*Interrupt structure

       lea    Start,a2
       move.l #Ende-Start,d0
l1:    move.b (a2)+,(a3)+
       dbf    d0,l1

       move.l #intNum,d0     ;For key Int
       jsr    addIntServer(a6)
       rts

error: rts

;A1 is pointer to data storage
;Used only with d0,d1,a1,a5,a6

Start: move.l d0,a5          ;*Next interrupt
       move.b akey,d0
       not    d0
       ror.b  #1,d0
       cmp.b  #$59,d0        ;F10
       beq    Memoryout
       cmp.b  #$58,d0        ;F9
       beq    Memoryin
       cmp.b  #$50,d0        ;F1
       beq    Readout
error1:clr.l  d0
 rts

Memoryout:


       move.l a1,a5
       tst.l  (a5)
       bne    error1
       move.l #$ffffffff,(a5)+
       move.l $4,a6
l6:    move.l #mem,d1
       jsr    Availmem(a6)
       tst.l  d0
       beq    end1
       move.l d0,(a5)+
       jsr    Allocmem(a6)
       tst.l  d0
       beq    end1
       move.l d0,(a5)+
       bra    l6
end1:  clr.l  (a5)
       bra    blink

Memoryin:
       move.l a1,a5
       move.l $4,a6
       tst.l  (a5)
       beq    error1
       clr.l  (a5)+
l7:    tst.l  (a5)
       beq    end2
       move.l (a5)+,d0       move.l (a5)+,a1       jsr    Freemem(a6)
       bra    l7
end2:  bra    blink

Readout:
       move.l 4(a5),a1       ;Interrupt after a1
       move.l #intNum,d0
       move.l $4,a6
       jsr    RemIntServer(a6)
       bra    blink

blink: move.l #$2000,d0
l5:    move.w d0,$dff180
       sub.l  #$01,d0
       bne    l5
       rts
Ende:
 end
