;******************************************************************************
;
;
;                                AutoBootBlock
;
;  Si installa nei due soli blocchi di boot  e permette di scegliere l'ese-
;  cuzione di fino a  16 programmi mediante la pressione di un tasto  alfa-
;  betico.   L'effettivo  lancio  è poi eseguito da  Loader  inserito nella
;  startup-sequence.
;  L'installazione del Booter è eseguita tramite il programma BootInstall.
;
;
;     Assegnazione registri:
;
;  A6 - GfxBase
;  A5 - DataBase
;  A4 - Valori temporanei usati più volte consecutivamente
;  A3 - Custom=$DFF000
;  A0/A1/A2 - Scratch
;
;  D0/D1/D2/D3 - Scratch
;  D4 - Loop counter
;
;******************************************************************************


   INCLUDE "exec/types.i"
   INCLUDE "exec/memory.i"
   INCLUDE "exec/io.i"
   INCLUDE "hardware/dmabits.i"
   INCLUDE "hardware/custom.i"
   INCLUDE "devices/trackdisk.i"
   INCLUDE "graphics/gfx.i"
   INCLUDE "graphics/gfxbase.i"
   INCLUDE "graphics/rastport.i"


      xref _LVOAllocMem
      xref _LVOFreeMem
      xref _LVOOldOpenLibrary
      xref _LVOCloseLibrary
      xref _LVOFindResident
      xref _LVODoIO
      xref _LVOInitBitMap
      xref _LVOInitRastPort
      xref _LVOMove
      xref _LVOText


      section   text,text


ITEMS       EQU   16             ; numero dei programmi selezionabili (<=16)
PROGNUMLOC  EQU   $24            ; locazione che conserva
                                 ; il numero del programma scelto


SCRNWDTH    EQU   320                            ; larghezza schermo
SCRNHGHT    EQU   256                            ; altezza schermo
SCRNSIZE    EQU   ((SCRNWDTH*SCRNHGHT)/8)		    ; dimensioni schermo in bytes
NAMESLEN    EQU   24                             ; lunghezza dei nomi dei progs
TEXTYOFFSET EQU   (((SCRNHGHT-(9*ITEMS)+1)/2)+6) ; distanza del testo dalla cima dello schermo
TEXTXOFFSET EQU   ((SCRNWDTH-(NAMESLEN*8))/2)    ; distanza dal bordo sinistro

CUSTOM      EQU   $DFF000            ; inizio registri hardware

rastport    EQU   0
bitmap      EQU   rastport+rp_SIZEOF
STRUCTSIZE  EQU   bitmap+bm_SIZEOF   ; offset per l'allocazione della memoria


DATASIZE    EQU   SCRNSIZE+STRUCTSIZE


CALLEXEC MACRO                   ; presume ExecBase in A6
         JSR      _LVO\1(A6)
         ENDM

CALLGFX  MACRO                   ; presume GfxBase in A6
         JSR      _LVO\1(A6)
         ENDM


;******************************************************************************
;
;                    Booter
;
;******************************************************************************

; salva i registri
            MOVEM.L  D0-D7/A0-A6,-(A7)

; spegne il motore del drive
            MOVE.W   #TD_MOTOR,(IO_COMMAND)(A1)
            CLR.L    (IO_LENGTH)(A1)
            CALLEXEC DoIO

; Alloca il raster per lo schermo (usa AllocMem per azzerare il raster)
            MOVE.L   #DATASIZE,D0
            MOVE.L   #(MEMF_CLEAR+MEMF_PUBLIC+MEMF_CHIP),D1
            CALLEXEC AllocMem
            MOVEA.L  D0,A5
            ADD.L    #STRUCTSIZE,D0
            MOVE.L   D0,(bitmap+bm_Planes)(A5)
            LEA      (CopperList-*-2+6)(PC),A0
            MOVE.W   D0,(A0)
            SWAP     D0
            SUBQ     #4,A0
            MOVE.W   D0,(A0)

; apre GfxBase e lo assegna ad A6
            LEA      (gfxname-*-2)(PC),A1
            CALLEXEC OldOpenLibrary
            MOVE.L   D0,A6

; inizializza la rastport
            MOVEA.L  A5,A1
            CALLGFX  InitRastPort

; RastPort.Font=Topaz80
            MOVEA.L  (gb_TextFonts)(A6),A0
            MOVE.L   (A0),(rastport+rp_Font)(A5)

;Inizializza la BitMap e setta rastport.BitMap=&bitmap
            MOVE.L   #SCRNWDTH,D1
            MOVE.L   #SCRNHGHT,D2
            MOVEQ    #1,D0
            LEA      bitmap(A5),A0
            MOVE.L   A0,(rastport+rp_BitMap)(A5)
            CALLGFX  InitBitMap

; Attiva il display e disattiva gli sprites
            LEA      (CopperList-*-2)(PC),A0
            MOVEA.L  #CUSTOM,A3
            MOVE.L   A0,cop1lc(A3)
            MOVE.W   #(BITSET+DMAF_RASTER),dmacon(A3)
            MOVE.W   #(BITCLR+DMAF_SPRITE),dmacon(A3)

; Scriviamo i nomi:
            MOVE.W   #(ITEMS-1),D4
            MOVE.L   #TEXTYOFFSET,D3
            LEA      (names-*-2)(PC),A2
ItemsLoop:
            MOVEA.L  A5,A1
            MOVE.L   #TEXTXOFFSET,D0
            MOVE.L   D3,D1
            ADD.W    #9,D3
            CALLGFX  Move

            MOVEA.L  A5,A1
            MOVEQ    #NAMESLEN,D0
            MOVEA.L  A2,A0
            CALLGFX  Text

            ADDA.W   #NAMESLEN,A2
            DBRA     D4,ItemsLoop

; prende un carattere e lo confronta con quelli in keycodes
KeyIn:
            MOVE.B   $BFEC01,D0
            MOVEQ    #(ITEMS-1),D4          ; controlla solo i caratteri
            LEA      (keycodes-*-2)(PC),A0  ; corrispondenti a programmi
CtrlLoop:
            CMP.B    (A0)+,D0
            BEQ.S    KeyCtrl
            DBRA     D4,CtrlLoop

; in caso positivo memorizza in PROGNUMLOC, se no riprova
KeyCtrl:
            TST.B    D4
            BMI.S    KeyIn
            MOVE.B   D4,PROGNUMLOC

; restaura la vecchia copperlist
            MOVE.W   #(BITCLR+DMAF_RASTER),dmacon(A3)
            MOVE.L   (gb_copinit)(A6),cop1lc(A3)
            MOVE.W   #0,bplcon0(A3)


; libera le varie liste e allocazioni
            MOVEA.L  A6,A1
            MOVEA.L  4,A6
            CALLEXEC CloseLibrary

            MOVEA.L  A5,A1
            MOVE.L   #DATASIZE,D0
            CALLEXEC FreeMem

; ricarica i registri
            MOVEM.L  (A7)+,D0-D7/A0-A6

; normale bootblock
            LEA      (dosname-*-2)(PC),A1
            CALLEXEC FindResident
            TST.L    D0
            BEQ.S    Oddio
            MOVEA.L  D0,A0
            MOVEA.L  $16(A0),A0
            MOVEQ    #0,D0
            RTS
Oddio:      MOVEQ    #(-1),D0          ; è andata proprio male!
            RTS


;******************************************************************************
;
;           Dati
;
;******************************************************************************

gfxname:    DC.B  'graphics.library',0,0

dosname:    DC.B  'dos.library',0

keycodes:   DC.B  $BF,$95,$99,$BB,$DB,$B9,$B7,$B5
            DC.B  $D1,$B3,$B1,$AF,$91,$93,$CF,$CD

CopperList: DC.W  $00E0,$0000    ; MOVE $????,BPL1PTH
            DC.W  $00E2,$0000    ; MOVE $????,BPL1PTL
            DC.W  $0102,$0000    ; MOVE $0000,BLPCON1
            DC.W  $008E,$2C81    ; MOVE $2C81,DIWSTRT
            DC.W  $0090,$2CC1    ; MOVE $2CC1,DIWSTOP
            DC.W  $0092,$0038    ; MOVE $0038,DDFSTRT
            DC.W  $0094,$00D0    ; MOVE $00D0,DDFSTOP
            DC.W  $0108,$0000    ; MOVE $0000,BPL1MOD
            DC.W  $0180,$000F    ; MOVE $000F,COLOR00
            DC.W  $0182,$0FFF    ; MOVE $0FFF,COLOR01

            DC.W  $2A01,$FF00    ; WAIT VERT 42
            DC.W  $0180,$000E    ; MOVE $000E,COLOR00

            DC.W  $2C01,$FF00    ; WAIT VERT 44
            DC.W  $0100,$1200    ; MOVE $1200,BLPCON0

            DC.W  $3301,$FF00    ; WAIT VERT 51
            DC.W  $0180,$000D    ; MOVE $000D,COLOR00
            DC.W  $3C01,$FF00    ; WAIT VERT 60
            DC.W  $0180,$000C    ; MOVE $000C,COLOR00
            DC.W  $4501,$FF00    ; WAIT VERT 69
            DC.W  $0180,$000B    ; MOVE $000B,COLOR00
            DC.W  $4E01,$FF00    ; WAIT VERT 78
            DC.W  $0180,$000A    ; MOVE $000A,COLOR00
            DC.W  $5701,$FF00    ; WAIT VERT 87
            DC.W  $0180,$0009    ; MOVE $0009,COLOR00
            DC.W  $6001,$FF00    ; WAIT VERT 96
            DC.W  $0180,$0008    ; MOVE $0008,COLOR00
            DC.W  $6901,$FF00    ; WAIT VERT 105
            DC.W  $0180,$0007    ; MOVE $0007,COLOR00
            DC.W  $7201,$FF00    ; WAIT VERT 114
            DC.W  $0180,$0006    ; MOVE $0006,COLOR00
            DC.W  $7B01,$FF00    ; WAIT VERT 123
            DC.W  $0180,$0005    ; MOVE $0005,COLOR00
            DC.W  $8401,$FF00    ; WAIT VERT 132
            DC.W  $0180,$0004    ; MOVE $0004,COLOR00
            DC.W  $8D01,$FF00    ; WAIT VERT 141
            DC.W  $0180,$0003    ; MOVE $0003,COLOR00
            DC.W  $9601,$FF00    ; WAIT VERT 150
            DC.W  $0180,$0002    ; MOVE $0002,COLOR00
            DC.W  $9F01,$FF00    ; WAIT VERT 159
            DC.W  $0180,$0001    ; MOVE $0001,COLOR00
            DC.W  $A801,$FF00    ; WAIT VERT 168
            DC.W  $0180,$0000    ; MOVE $0000,COLOR00
            DC.W  $B101,$FF00    ; WAIT VERT 177
            DC.W  $0180,$0001    ; MOVE $0001,COLOR00
            DC.W  $BA01,$FF00    ; WAIT VERT 186
            DC.W  $0180,$0002    ; MOVE $0002,COLOR00
            DC.W  $C301,$FF00    ; WAIT VERT 195
            DC.W  $0180,$0003    ; MOVE $0003,COLOR00
            DC.W  $CC01,$FF00    ; WAIT VERT 204
            DC.W  $0180,$0004    ; MOVE $0004,COLOR00
            DC.W  $D501,$FF00    ; WAIT VERT 213
            DC.W  $0180,$0005    ; MOVE $0005,COLOR00
            DC.W  $DE01,$FF00    ; WAIT VERT 222
            DC.W  $0180,$0006    ; MOVE $0006,COLOR00
            DC.W  $E701,$FF00    ; WAIT VERT 231
            DC.W  $0180,$0007    ; MOVE $0007,COLOR00
            DC.W  $F001,$FF00    ; WAIT VERT 240
            DC.W  $0180,$0008    ; MOVE $0008,COLOR00
            DC.W  $F901,$FF00    ; WAIT VERT 249
            DC.W  $0180,$0009    ; MOVE $0009,COLOR00

            DC.W  $FFDF,$FFFE    ; WAIT UNTIL VERT 256

            DC.W  $0201,$FF00    ; WAIT VERT 258
            DC.W  $0180,$000A    ; MOVE $000A,COLOR00
            DC.W  $0B01,$FF00    ; WAIT VERT 267
            DC.W  $0180,$000B    ; MOVE $000B,COLOR00
            DC.W  $1401,$FF00    ; WAIT VERT 276
            DC.W  $0180,$000C    ; MOVE $000C,COLOR00
            DC.W  $1D01,$FF00    ; WAIT VERT 285
            DC.W  $0180,$000D    ; MOVE $000D,COLOR00
            DC.W  $2601,$FF00    ; WAIT VERT 294
            DC.W  $0180,$000E    ; MOVE $000E,COLOR00
            DC.W  $2C01,$FF00    ; WAIT VERT 300
            DC.W  $0100,$0200    ; MOVE $0200,BPLCON0
            DC.W  $2F01,$FF00    ; WAIT VERT 303
            DC.W  $0180,$000F    ; MOVE $000F,COLOR00
            DC.W  $FFFF,$FFFE    ; WAIT FOREVER

names:      DC.B  'A.......................'
            DC.B  'B.......................'
            DC.B  'C.......................'
            DC.B  'D.......................'
            DC.B  'E.......................'
            DC.B  'F.......................'
            DC.B  'G.......................'
            DC.B  'H.......................'
            DC.B  'I.......................'
            DC.B  'J.......................'
            DC.B  'K.......................'
            DC.B  'L.......................'
            DC.B  'M.......................'
            DC.B  'N.......................'
            DC.B  'O.......................'
            DC.B  'P.......................'
            END

