;*******************************
;
; Reset-védett program a GURU-tól
; 
;                     `Gaborca
;*******************************

;Ez egy egyszerű kis demo-program amely megmutatja hogyan tudsz
;Reset-védett programokat készíteni, a rendszerszoftver (ROM) 
;lehetőségeinek kihasználása nélkül.
;A program beállítja a két Reset-vektort ( "ColdStart" és "CoolStart" ).
;A ColdStart vektor mutat a főprogramra, amelyik egy szép színes 
;Copper listát generál és rotálja rajta a színeket míg meg nem nyomod a 
;bal egérgombot. Utána visszaállítja az eredeti Copper listát, DMA-t.
;A CoolStart vektor pedig egy rövid rutinra mutat, amely a programunk 
;számára lefoglalja a memóriát, hogy semmi ne írja azt felül.

;*******************************

    move.l  4,a6
    move.l  #10000,d0       ;10000 Byte lefoglalása ezen programnak
    lea     start(pc),a1    ;start címkétől
    jsr     -$0cc(a6)       ;AllocAbs()
start:
    move.l  4,a6            ;EXEC kezdőcíme
    lea     reset(pc),a0    ;A főprogram kezdőcíme a ColdCapture vektorba
    move.l  a0,$2a(a6)
    lea     mem(pc),a0      ;Memória-Allokációs rutin kezdőcíme
    move.l  a0,$2e(a6)      ;a CoolCapture vektorba

    move.w  #0,$24(a6)      ;A megváltozott Checksum újraszámítása
    moveq   #0,d1           ;azért, hogy az EXEC ne jelezzen hibát
    lea     $22(a6),a0
    moveq   #$18,d0
sum:
    add.w   (a0)+,d1
    dbra    d0,sum
    not.w   d1
    move.w  d1,$24(a6)
    moveq   #0,d1
    lea     $22(a6),a0
    moveq   #$18,d0
sum2:
    add.w   (a0)+,d1
    dbra    d0,sum2
    not.w   d1              ;Inicializálás vége
    rts

mem:
    move.l  #10000,d0       ;10000 Byte lefoglalása ezen programnak
    lea     start(pc),a1    ;start címkétől
    jsr     -$0cc(a6)       ;AllocAbs()
    rts                     ;Memória allokáció vége

;*****************************
;
; Eddíg volt az inicializáló rész. Most ha a gép RESET-et kap
; a vezérlés ide a reset: cimkére fog átadódni.
; Ide írhatod saját programodat.
;
;*****************************

reset:
    movem.l d0-d7/a0-a6,-(a7)       ;Regiszterek tartalmának eltárolása
    lea.l   $50000,a0               ;Bitplane kezdőcíme :$50000
    move.l  #6645,d0                ;Hossza :6645 Bytes

clear:
    clr.l   (a0)+                   ;Bitplane törlése
    dbf     d0,clear

    jsr     start                   ;Reset-vektorok újrabeállítása

    lea.l   coltab(pc),a1           ;mutató Színtáblára;
    bsr     copperinit              ;Copper-lista inicializálása
    jsr     -132(a6)                ;Forbid();
                                    ;Multitasking kikapcsolása
    lea.l   $dff000,a5              ;a5 = Customchipbase
    move.w  #$03e0,$96(a5)          ;$96 ->DMA ->Control write

                                    ;Bit-Plane   DMA letiltva,
                                    ;Coprocessor DMA letiltva,
                                    ;Blitter     DMA letiltva,
                                    ;Sprite      DMA letiltva

    move.l  #$55000,$80(a5)         ;COP1LCH := $55000
                                    ;indirekt JMP - a Copper lokation
                                    ;regiszter $55000 -re állítása

    clr.w   $88(a5)                 ;COPJMP1 törlése, Copper lista 
                                    ;aktiválása
    move.w  #$1100,$100(a5)         ;BLCON0 = #$1100
    clr.l   $102(a5)                ;BLCON1 törlése
    clr.l   $108(a5)                ;BL1MOD törlése

    move.w  #$8380,$96(a5)          ;$95 ->DMA ->control write
                                    ;Bit-Plane   DMA engedélyezve,
                                    ;Coprocessor DMA engedélyezve

    move.l  #0,a2

main:
    andi.b  #64,$bfe001             ;Megnyomták a bal egérgombot ?
    beq     end                     ;Ha igen ugrás a program végére

    lea.l   coltab(pc),a1           ;mutató a színtáblázatra
    add.l   #1,a2                   ;a2-t eggyel növelni,
    cmp.l   #32,a2                  ;színtábla végére ért ?
    bne     cont                    ;ha nem akkor tovább
    move.l  #0,a2                   ;ha igen akkor az elejére áll

cont:
    adda.l  a2,a1                   ;a1=a1+a2
    bsr     copperinit              ;az új copper lista inicializálása
    move.l  #$ff,d3                 ;időzítőciklus számlálója

loop:
    tst.l   (a6)                    ;Dummy
    dbra    d3,loop                 ;időzítőciklus
    bra     main                    ;ugrás az elejére

;***************************
;
;Ez a rész fontos, a saját programod végén is szerepelnie kell 
;ha azt akarod hogy a RESET és a programod  után a rendszer 
;is induljon.
;
;***************************

end:
    lea.l   gfxname(pc),a1          ;mutató  gfx-lib nevére az a1-ben
    jsr     -408(a6)                ;--> OldOpenLibrary();
    move.l  d0,a4                   ;régi Copperlista visszaállítása
    move.l  38(a4),$80(a5)          ;
    clr.w   $88(a5)                 ;COPJMP1 törlése,régi copper lista aktív
    move.w  #$8060,$96(a5)          ;Sprite és Blitter DMA
                                    ;engedélyezése

    jsr     -138(a6)                ; --> Permit();
                                    ; Multitasking bekapcsolása

    movem.l (a7)+,d0-d7/a0-a6       ;Regiszterek tartalmának visszaállítása
    move.l  #reset,$2a(a6)          ;Reset vektor beállítása ( mégegyszer )
    jmp     (a5)                    ;visszatérés

copperinit:
    clr.l   d1                      ;d1 törlése
    lea.l   $55000,a0               ;Copper lista kezdőcíme
    move.l  #$00e00005,(a0)+        ;BitPlane1 mutató beállítása
    move.l  #$00e20000,(a0)+
    move.l  #$01800f00,(a0)+        ;Color0 vörösre állítása
    move.l  #80,d0                  ;a 80. sortól szín-rotáció
loop1:
    move.b  d0,(a0)+                ;Wait - VP
    move.b  #1,(a0)+                ;Wait - HP + Bit 0 beállítása
    move.l  #$fffe0180,(a0)+        ;Wait + Color0
    clr.l   d6
    move.b  (a1,d1),d6              ;Új szín a táblázatból
    eori    #$0ff0,d6
    move.w  d6,(a0)+                ;Copper listába a Color0-hoz
    addq    #1,d1                   ;szín-táblázat index növelése
    cmpi    #32,d1                  ;mikor 32 szín megvolt,
    bne     loop2
    clr.l   d1                      ;akkor a szín-táblázat index törlése

loop2:
    add.l   #1,d0                   ;sor=sor+1
    cmp.l   #255,d0                 ;a 255. sorig
    beq     loop3
    bra     loop1

loop3:
    move.l  #$ff01fffe,(a0)+        ;várni a 255. sorig
    move.l  #$01800f00,(a0)+        ;majd a Color0 vörösre állítása
    move.l  #$fffffffe,(a0)+        ;Copper lista vége
    rts                             ;visszatérés

;Színtáblázat, amely 64 elemből áll ( 32+32 ) a rotáció miatt.

even
coltab:
    dc.b    $00,$10,$20,$30,$40,$50,$60,$70,$80,$90
    dc.b    $a0,$b0,$c0,$d0,$e0,$f0,$f0,$e0,$d0
    dc.b    $c0,$b0,$a0,$90,$80,$70,$60,$50,$40,$30
    dc.b    $20,$10,$00,$00,$10,$20,$30,$40,$50,$60
    dc.b    $70,$80,$90,$a0,$b0,$c0,$d0,$e0,$f0,$f0
    dc.b    $e0,$d0,$c0,$b0,$a0,$90,$80,$70,$60,$50
    dc.b    $40,$30,$20,$10,$00

gfxname:dc.b "graphics.library",0

;END
