;****************************************************************************
;
;  Loader
;
;  Controlla il valore in PROGNUMLOC e lancia il corrispondente comando
;
;  Assegnazione registri:
;
;  A6 - DosBase
;
;****************************************************************************

      xref _LVOOldOpenLibrary
      xref _LVOCloseLibrary
      xref _LVOExecute


      section text,text


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

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

CALLDOS  MACRO                   ; presume DosBase in A6
         JSR      _LVO\1(A6)
         ENDM


; apre la dos.library
            MOVEA.L  4,A6
            LEA      (dosname-*-2)(PC),A1
            CALLEXEC OldOpenLibrary    ; non richiede il version#
            MOVEA.L  D0,A6             ; da qui A6=DosBase

; mette in D4 il numero del programma (prog1=0)
            MOVEQ    #(ITEMS-1),D4
            SUB.B    PROGNUMLOC,D4
            CMPI.W   #ITEMS,D4
            BGE.S    GoAway

; cerca il comando numero D4
            LEA      (Commands-*-3)(PC),A0    ; A0 viene puntato sullo 0 che
SearchLoop:                                   ; segue DosBase, in quanto un
            TST.B    (A0)+                    ; ciclo DBRA verrą comunque
            BNE.S    SearchLoop               ; eseguito
            DBRA     D4,SearchLoop

; chiama Execute
            MOVE.L   A0,D1
            MOVEQ    #0,D2
            MOVEQ    #0,D3
            CALLDOS  Execute

; chiude la dos.library
GoAway:
            MOVEA.L  A6,A1
            MOVEA.L  4,A6
            CALLEXEC CloseLibrary

            RTS

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

Commands:
command_A   DC.B  0
command_B   DC.B  0
command_C   DC.B  0
command_D   DC.B  0
command_E   DC.B  0
command_F   DC.B  0
command_G   DC.B  0
command_H   DC.B  0
command_I   DC.B  0
command_J   DC.B  0
command_K   DC.B  0
command_L   DC.B  0
command_M   DC.B  0
command_N   DC.B  0
command_O   DC.B  0
command_P   DC.B  0
command_Q   DC.B  0
command_R   DC.B  0
command_S   DC.B  0
command_T   DC.B  0

        END
