;PopIt - Beliebige Programme per F-Taste aufrufen
;SYNTAX: PopIt <F-Tasten-Nr. - 1> <Programm>
;Von B. Lehnemann 1989 für Profimat Assembler geschrieben

SysBase            equ 4
_LVOOldOpenLibrary equ -408
_LVOCloseLibrary   equ -414
_LVOCopyMem        equ -624

_LVOExecute        equ -222
_LVODelay          equ -198


 code

              move.l    a0,a2                    ;Kommandozeile sezieren
              move.l    d0,d2
ModCmdLine:   cmp.b     #10,(a0)
              beq       Return_Error
              cmp.b     #" ",(a0)
              bne.s     MCL_GetFKey
              add.l     #1,a0
              bra.s     ModCmdLine
MCL_GetFKey:  moveq     #0,d0                    ;Welche F-Taste ?
              move.b    (a0)+,d0
              sub.b     #"0",d0
              cmp.b     #9,d0
              bgt       Return_Error
              lea       FKeyCodes,a1
              move.b    0(a1,d0.w),d5
MCL_CopyCmd:  add.l     #1,a0                    ;Auszuführendes Kommando
              lea       CmdBuffer,a1             ;kopieren
              lea       0(a2,d2),a3
              move.l    a3,d0
              move.l    a0,d1
              sub.l     d1,d0
              move.l    SysBase,a6
              jsr       _LVOCopyMem(a6)
OpenDosLib:   move.l    SysBase,a6               ;Dos.lib öffnen
              lea       DosName,a1
              jsr       _LVOOldOpenLibrary(a6)
              move.l    a0,a6
              move.b    d5,d4

Loop:         moveq     #2,d1                    ;Schleife
              jsr       _LVODelay(a6)            ;Verzögerung
CheckFKey:    cmp.b     $bfec01,d5               ;F-Taste gedrückt?              bne.s     CheckIfEnd
CFK_Loop:     cmp.b     $bfec01,d5              beq.s     CFK_Loop
              jsr       ExecuteCommand
CheckIfEnd:   cmp.b     #$33,$bfec01             ;Will User nicht mehr?
              bne.s     Loop
CIE_Loop:     cmp.b     #$33,$bfec01
              beq.s     CIE_Loop
              cmp.b     #$c5,$bfec01
              bne.s     Loop

CloseDosLib:  move.l    a6,a1                    ;Dos.lib schließen
              move.l    SysBase,a6
              jsr       _LVOCloseLibrary(a6)
              bra.s     Return
Return_Error: moveq     #10,d0                   ;Fehler
Return:       rts                                ;zurück zum Aufrufer


ExecuteCommand:move.l   #Command,d1              ;Kommandozeile starten
              clr.l     d2
              clr.l     d3
              jsr       _LVOExecute(a6)
              rts

 data         ;definierte Daten

FKeyCodes:    dc.b $5f,$5d,$5b,$59,$57,$55,$53,$51,$4f,$4d
              align
Command:      dc.b "RUN >NIL: "
CmdBuffer:    ds.b 80,0
              align
DosName:      dc.b "dos.library",0
 end
