home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 13 / AACD13.ISO / AACD / Utilities / ACDPlay / src / V1.6 / asmlib / rexxcmds.s.old < prev   
Text File  |  1997-04-30  |  24KB  |  711 lines

  1. ********************  (ARexx-Unterfunktionen)  ***************************
  2. *                                                                        *
  3. *  Vorgabe:  a0  - Zeiger auf CDx-Request                                *
  4. *            a1  - Zeiger auf ARexxkommando                              *
  5. *            a2  - Rest der Rexx-Kommandozeile (zum weiterparsen)        *
  6. *            a4  - RexxMsg                                               *
  7. *            a5  - Zeiger auf Applicationstruktur                        *
  8. *            a6  - RexxSysBase                                           *
  9. *            d0  - 0                                                     *
  10. *            d3  - SysBase                                               *
  11. *           (sp) - Zeiger auf Applicationstruktur                        *
  12. *                                                                        *
  13. *  Rückgabe: d0 - RexxResult1 (Vorgabe RETURN_OK)                        *
  14. *            d7 - done: Rückgabewert von HandleARexxEvents               *
  15. *                 HandleARexxEvents() und dann auch ACDPlay werden bei   *
  16. *                 TRUE beendet (sollte nur von QUIT gesetzt werden)      *
  17. *                                                                        *
  18. **************************************************************************
  19.  
  20.  xref _PlayButton
  21.  xref _DirectChoice
  22.  xref _StopButton
  23.  xref _PauseButton
  24.  xref _EjectButton
  25.  xref _JumpBackwardButton
  26.  xref _JumpForwardButton
  27.  xref _OpenApplication
  28.  xref _CloseApplication
  29.  xref _OpenAppWin
  30.  xref _CloseAppWin
  31.  xref _CreateAppIcon
  32.  xref _FreeAppIcon
  33.  xref _ProgramDelete
  34.  xref _ProgramCopyAll
  35.  xref _ProgramSave
  36.  xref _ProgramLoad
  37.  xref _ProgramAppendElement
  38.  xref _ProgramDeleteElement
  39.  xref _SaveTitles
  40.  xref _UpdateWinTitle
  41.  xref _MakeInterior
  42.  xref _FindNode
  43.  
  44. RETURN_SCSIERR  EQU 15
  45.  
  46. ; Die Applikationstruktur ist schon auf dem Stack, dadurch können Funktionen
  47. ;  die nur einen Appzeiger erwarten direkt angesprungen (jmp) werden.
  48.  
  49. **************************************************************************
  50. *
  51. *   PLAY [track]
  52. *
  53. rx_PLAY:    move.l   a2,a0              ; Parameter als Argument
  54.             jsr     _LVOCVa2i(a6)       ; zum Konvertieren (RexxSysbase ist schon in a6)
  55.             tst.b   d1                  ; Zahl übergeben?
  56.             bne     .goon               ;
  57.             jmp     _PlayButton         ; PlayButton wenn kein Track da
  58. .goon       move.w  d0,-(a7)            ; Track (UWORD)
  59.             move.l  a5,-(a7)            ; Application (APTR)
  60.             jsr     _DirectChoice
  61.             addq.l  #6,a7               ; Stack wieder zurücksetzen
  62. .EXIT       rts
  63.  
  64.  
  65. **************************************************************************
  66. *
  67. *   OPEN
  68. *
  69. rx_UNLOADCD:
  70.             moveq   #TRUE,d0            ; cdx liegt bereits in a0
  71.             bsr     _CDEjectA           ; Schublade ausfahren
  72.             bra     ExitSCSIErr2RC      ; nur RETURN_OK oder RETURN_SCSIERR
  73.  
  74.  
  75. **************************************************************************
  76. *
  77. *   CLOSE
  78. *
  79. rx_LOADCD:  moveq   #FALSE,d0
  80.             bsr     _CDEjectA           ; Schublade einfahren
  81.             bra     ExitSCSIErr2RC
  82.  
  83.  
  84. **************************************************************************
  85. *
  86. *   LOCKCD
  87. *
  88. rx_LOCKCD:
  89.             moveq   #TRUE,d0            ; auch hier ist cdx schon in a0
  90.             bsr     _CDLockA            ; Schublade verriegeln
  91.             bra     ExitSCSIErr2RC
  92.  
  93.  
  94. **************************************************************************
  95. *
  96. *   UNLOCKCD
  97. *
  98. rx_UNLOCKCD:
  99.             moveq   #FALSE,d0
  100.             bsr     _CDLockA            ; Schublade entriegeln
  101.             bra     ExitSCSIErr2RC
  102.  
  103.  
  104. **************************************************************************
  105. *
  106. *   APPENDELEMENT track
  107. *
  108. rx_APPEND:  move.l  a2,a0               ; Parameter als Argument
  109.             jsr     _LVOCVa2i(a6)       ;  zum Konvertieren
  110.             tst.b   d1                  ; Zahl konvertiert?
  111.             beq     .EXIT               ; (d0=0=FALSE -> Fehler)
  112.             move.w  d0,-(a7)            ; Parameter rückwärts auf den
  113.             move.l  a5,-(a7)            ;  Stack schieben
  114.             jsr     _ProgramAppendElement
  115.             addq.l  #6,a7               ; Stack wieder zurücksetzen
  116. .EXIT       bra     ExitBool2RC         ; vernünftigen Returncode setzen
  117.                                         ; (Bool -> Rexx-Returncode)
  118.  
  119.  
  120. **************************************************************************
  121. *
  122. *   DELETEELEMENT position
  123. *
  124. rx_DELETE:  move.l  a2,a0               ; Parameter als Argument
  125.             jsr     _LVOCVa2i(a6)       ; zum Konvertieren
  126.             tst.b   d1                  ; (digits=0 ?)
  127.             beq     .EXIT
  128.             move.l  d0,-(a7)            ; Parameter rückwärts auf den
  129.             move.l  a5,-(a7)            ; Stack schieben
  130.             jsr     _ProgramDeleteElement
  131.             addq.l  #8,a7               ; Stack wieder zurücksetzen
  132. .EXIT       bra     ExitBool2RC
  133.  
  134.  
  135. **************************************************************************
  136. *
  137. *   title = GETCDTITLE
  138. *
  139. rx_GETCDTITLE:  move.l  40(a5),a0       ; app->cdstr
  140.                 move.l  44(a0),d0       ; cdstr->cdnameptr
  141.                 bra     ReturnString    ; String in Argstring konvertieren
  142.                                         ; und als Result2 in RexxMsg eintragen
  143.  
  144. **************************************************************************
  145. *
  146. *   name = GETARTIST
  147. *
  148. rx_GETARTIST:   move.l  40(a5),a0       ; app->cdstr
  149.                 move.l  48(a0),d0       ; cdstr->artistptr
  150.                 bra     ReturnString
  151.  
  152.  
  153. **************************************************************************
  154. *
  155. *   name = GETSONGNAME [track]
  156. *
  157. rx_GETSONGNAME: exg.l   a2,a0               ; a2<->a0 (Parameter als Argument und a0 sichern)
  158.                 jsr     _LVOCVa2i(a6)       ; zum Konvertieren
  159.                 tst.b   d1                  ; (digits=0 ?)
  160.                 bne     .goon
  161.                 move.b  cdx_CurrentTrack(a2),d0 ; wenn kein Parameter übergeben wurde, dann
  162. .goon           subq.l  #1,d0               ; aktuellen Track nehmen
  163.                 move.l  d0,-(a7)            ; track-1 auf den Stack (da Listen bei 0 anfangen)
  164.                 move.l  40(a5),a0           ; app->cdstr
  165.                 move.l  16(a0),-(a7)        ; cdstr->cdtitles
  166.                 jsr     _FindNode
  167.                 addq.l  #8,a7               ; Stack zurück
  168.                 move.l  d0,a0
  169.                 tst.l   LN_SUCC(a0)         ; Ende der Liste erreicht?
  170.                 beq     .NOTFOUND           ; ja: --> mit RETURN_FAIL beenden
  171.                 move.l  LN_NAME(a0),d0      ; Name des Titels
  172.                 bra     ReturnString
  173. .NOTFOUND       moveq   #RETURN_FAIL,d0
  174.                 rts
  175.  
  176.  
  177. ****************************************
  178. *
  179. *  SETCDTITLE
  180. *
  181. rx_SETCDTITLE:  move.l  a2,a0               ; Argument für CopyString -> Quelle
  182.                 move.l  40(a5),a1           ; app->cdstr
  183.                 move.l  44(a1),a1           ; cdstr->cdname -> Ziel
  184.                 move.l  #127,d0             ; Maximale Länge
  185.                 bsr     CopyString(pc)
  186.                 jsr     _UpdateWinTitle
  187.                 rts
  188.  
  189. ****************************************
  190. *
  191. *  SETARTIST
  192. *
  193. rx_SETARTIST:   move.l  a2,a0               ; Argument für CopyString -> Quelle
  194.                 move.l  40(a5),a1           ; app->cdstr
  195.                 move.l  48(a1),a1           ; cdstr->artistname -> Ziel
  196.                 move.l  #127,d0             ; Maximale Länge
  197.                 bsr     CopyString(pc)
  198.                 jsr     _UpdateWinTitle
  199.                 rts
  200.  
  201.  
  202. **************************************************************************
  203. *
  204. *   bool = ISUNITREADY
  205. *
  206. rx_ISUNITREADY:
  207.             bsr     _CDTestUnitA            ; cdx ist in a0
  208.             tst.l   d0
  209.             bne     .NO
  210.             moveq   #1,d0
  211.             bra.s   .EXIT
  212. .NO         moveq   #0,d0
  213. .EXIT       bra     ReturnValue
  214.  
  215.  
  216. **************************************************************************
  217. *
  218. *   status = GETSTATUS
  219. *
  220. rx_GETSTATUS:
  221.             bsr     _CDUpdateA
  222.             moveq   #0,d0                   ; evt. Fehlercode löschen
  223.             move.b  cdx_AudioStatus(a0),d0
  224.             bra     ReturnValue             ; Zahl in Argstring wandeln und
  225.                                             ; in RexxMsg als Result2 eintragen
  226.  
  227. **************************************************************************
  228. *
  229. *   track = GETCURRENTTRACK
  230. *
  231. rx_GETCURTRACK:
  232.             move.b  cdx_CurrentTrack(a0),d0
  233.             bra     ReturnValue
  234.  
  235.  
  236. **************************************************************************
  237. *
  238. *   index = GETCURRENTINDEX
  239. *
  240. rx_GETCURINDEX:
  241.             move.b  cdx_CurrentIndex(a0),d0
  242.             bra     ReturnValue
  243.  
  244.  
  245. **************************************************************************
  246. *
  247. *   blocks = GETTRACKLENGTH
  248. *
  249. rx_GETTOTALTIME:
  250.             move.l  cdx_TrackLength(a0),d0
  251.             bra     ReturnValue
  252.  
  253.  
  254. **************************************************************************
  255. *
  256. *   block = GETTRACKPOSITION
  257. *
  258. rx_GETCURTIME:
  259.             move.l  cdx_CurrentRelAddr(a0),d0
  260.             bra     ReturnValue
  261.  
  262.  
  263. **************************************************************************
  264. *
  265. *   block = GETABSPOSITION
  266. *
  267. rx_GETCURABSTIME:
  268.             move.l  cdx_CurrentAbsAddr(a0),d0
  269.             bra     ReturnValue
  270.  
  271.  
  272. *******************************
  273. *   string = GETCDID
  274. *
  275. rx_GETCDID:
  276.             move.l  cdx_TOCData(a0),a0
  277.             move.l  CDID(a0),d0
  278.             bra     ReturnString
  279.  
  280.  
  281. **************************************************************************
  282. *
  283. *   blocks = GETCDLENGTH
  284. *
  285. rx_GETCDLENGTH:
  286.             move.l  cdx_TOCData(a0),a0
  287.             move.l  Entry+Address(a0),d0    ; cdx_TOCData->Entry[0].Address
  288.             bra     ReturnValue
  289.  
  290.  
  291. **************************************************************************
  292. *
  293. *   track = GETFIRSTTRACK
  294. *
  295. rx_GETFIRSTTRACK:
  296.             move.l  cdx_TOCData(a0),a0
  297.             move.b  FirstTrack(a0),d0
  298.             bra     ReturnValue
  299.  
  300.  
  301. **************************************************************************
  302. *
  303. *   track = GETFIRSTAUDIOTRACK
  304. *
  305. rx_GETFIRSTATRACK:
  306.             move.l  cdx_TOCData(a0),a0
  307.             move.b  FirstAudioTrack(a0),d0
  308.             bra     ReturnValue
  309.  
  310.  
  311. **************************************************************************
  312. *
  313. *   trackanzahl = GETTRACKNUMBER
  314. *
  315. rx_GETTRACKNUM:
  316.             move.l  40(a5),a0           ; app->cdstr
  317.             move.b  36(a0),d0           ; cdstr->num_track
  318.             bra     ReturnValue         ;  als sekundäres Ergebnis zurück
  319.  
  320.  
  321. **************************************************************************
  322. *
  323. *   SETVOLUME volume
  324. *
  325. rx_SETVOLUME:
  326.             move.l  a2,a0               ; Parameter als Argument
  327.             jsr     _LVOCVa2i(a6)       ; String konvertieren
  328.             tst.b   d1                  ; (digits=0 ?)
  329.             beq     .EXIT
  330.             cmp.l   #255,d0
  331.             bls     .goon               ; d0 <= 255 --> goon
  332.             move.b  #255,d0
  333.  
  334. .goon       move.l  40(a5),a0
  335.             move.l  8(a0),a0            ; app->cdstr->cdx auch als Argument
  336.             move.b  d0,cdx_Volume0(a0)  ; in alle beiden
  337.             move.b  d0,cdx_Volume1(a0)  ; Volume-Felder den Wert eintragen
  338.             moveq   #SET_VOLUME,d0      ; SET-Modus als Argument
  339.             bsr     _CDVolumeA
  340.             tst.l   d0
  341.             bne     .scsierr
  342.  
  343.             move.w  #9,-(a7)            ; WINDOW_VOLUME und
  344.             move.l  a5,-(a7)            ;  Application als Parameter
  345.             jsr     _MakeInterior       ; Volumefenster aktualisieren
  346.             addq.l  #6,a7
  347.             moveq   #TRUE,d0            ; TRUE: RC=0
  348. .EXIT       bra     ExitBool2RC
  349. .scsierr    moveq   #RETURN_SCSIERR,d0  ; RC=15
  350.             rts
  351.  
  352.  
  353. **************************************************************************
  354. *
  355. *   volume = GETVOLUME
  356. *
  357. rx_GETVOLUME:
  358.             moveq   #GET_VOLUME,d0      ; GET-Modus als Argument
  359.             bsr     _CDVolumeA          ; CDx liegt schon in a0
  360.             tst.l   d0                  ; alles klar?
  361.             beq     .good
  362.             moveq   #RETURN_SCSIERR,d0  ; nein: RETURN_SCSIERR als Fehlercode
  363.             rts                         ;  und raus
  364. .good       move.b  cdx_Volume0(a0),d0  ; cdx->volume[0]
  365.             moveq   #0,d1
  366.             move.b  cdx_Volume1(a0),d1
  367.             add.w   d1,d0
  368.             lsr.w   #1,d0               ; d0 = (volume[0] + volume[1])/2
  369.             bra     ReturnValue
  370.  
  371.  
  372. rx_GETDEVICE:   move.l  cdx_DeviceName(a0),d0
  373.                 bra     ReturnString
  374.  
  375. rx_GETUNIT:     move.b  cdx_Unit(a0),d0
  376.                 bra     ReturnValue
  377.  
  378. rx_GETLUN:      move.b  cdx_LUN(a0),d0
  379.                 bra     ReturnValue
  380.  
  381. rx_GETSENSEKEY:
  382.                 move.b  cdx_SenseKey(a0),d0
  383.                 bra     ReturnValue
  384.  
  385. rx_GETADDSENSECODE:
  386.                 move.b  cdx_AddSenseCode(a0),d0
  387.                 bra     ReturnValue
  388.  
  389. rx_GETADDSENSECODEQ:
  390.                 move.b  cdx_AddSenseCodeQual(a0),d0
  391.                 bra     ReturnValue
  392.  
  393. rx_GETVENDOR:   move.l  cdx_Vendor(a0),d0
  394.                 bra     ReturnString
  395.  
  396. rx_GETPRODUCT:  lea     cdx_Product(a0),a0
  397.                 move.l  a0,d0
  398.                 bra     ReturnString
  399.  
  400. rx_GETREVISION: lea     cdx_Revision(a0),a0
  401.                 move.l  a0,d0
  402.                 bra     ReturnString
  403.  
  404. rx_GETSPECIFIC: lea     cdx_Specific(a0),a0
  405.                 move.l  a0,d0
  406.                 bra     ReturnString
  407.  
  408.  
  409. ***************************
  410. *
  411. * GETLANGUAGE
  412. *
  413. rx_GETLANGUAGE: lea     _li,a0
  414.                 move.l  4(a0),a0
  415.                 move.l  cat_Language(a0),a0
  416.                 move.l  a0,d0
  417.                 bra     ReturnString
  418.  
  419.  
  420. **************************************************************************
  421. *
  422. *   SHOW
  423. *
  424. rx_SHOW:    move.l  a5,-(a7)            ; Application auf den Stack
  425.             jsr     _FreeAppIcon
  426.             jsr     _OpenApplication
  427.             addq.l  #4,a7               ; Stack wieder zurück
  428.             bra     ExitBool2RC
  429.  
  430.  
  431. **************************************************************************
  432. *
  433. *   HIDE
  434. *
  435. rx_HIDE:    move.l  a5,-(a7)
  436.             jsr     _CloseApplication
  437.             jsr     _CreateAppIcon
  438.             addq.l  #4,a7
  439.             moveq   #RETURN_OK,d0
  440.             rts
  441.  
  442.  
  443. **************************************************************************
  444. *
  445. *   OPENWINDOW win
  446. *
  447. rx_OPENWIN: move.l  a2,a0               ; Parameter als Argument
  448.             jsr     _LVOCVa2i(a6)       ; zum Konvertieren
  449.             tst.b   d1                  ; Zahl konvertiert?
  450.             beq     .EXIT               ; (d0=0=FALSE -> Fehler)
  451.             tst.l   d0                  ; WINDOW_MAIN (0) muß mit
  452.             beq     rx_SHOW             ;  OpenApplication() geöffnet werden
  453.             cmp.l   #9,d0               ; letztes Fenster (9=WINDOW_VOLUME)
  454.             bls     .goon               ; d0 <= 9 --> .goon
  455.             moveq   #FALSE,d0
  456.             bra     .EXIT
  457. .goon       move.l  (a5),a0             ; app->screen
  458.             move.l  a0,d0               ; Testen, ob Application geöffnet
  459.             bne.s   .continue           ; wenn nein,
  460.             beq     rx_SHOW             ; öffnen
  461. .continue   move.w  d0,-(a7)            ; Parameter rückwärts auf den
  462.             move.l  a5,-(a7)            ; Stack schieben
  463.             jsr     _OpenAppWin
  464.             addq.l  #6,a7               ; Stack wieder zurücksetzen
  465. .EXIT       bra     ExitBool2RC
  466.  
  467.  
  468. **************************************************************************
  469. *
  470. *   CLOSEWINDOW win
  471. *
  472. rx_CLOSEWIN: move.l  a2,a0               ; Parameter als Argument
  473.             jsr     _LVOCVa2i(a6)       ; zum Konvertieren
  474.             tst.b   d1                  ; Zahl konvertiert?
  475.             beq     .EXIT               ; (d0=0=FALSE -> Fehler)
  476.             tst.l   d0                  ; WINDOW_MAIN (0) muß mit OpenApplication geöffnet werden
  477.             beq     rx_HIDE
  478.             cmp.l   #9,d0               ; 9=WINDOW_VOLUME
  479.             bls     .goon               ; d0 <= 9 --> .goon
  480.             moveq   #FALSE,d0
  481.             bra     .EXIT
  482. .goon       move.w  #TRUE,-(a7)         ; wirklich schließen
  483.             move.w  d0,-(a7)            ; windownummer
  484.             move.l  a5,-(a7)            ; application
  485.             jsr     _CloseAppWin
  486.             addq.l  #8,a7               ; Stack wieder zurücksetzen
  487.             moveq   #TRUE,d0            ; CloseAppWin gibt void zurück
  488. .EXIT       bra     ExitBool2RC
  489.  
  490.  
  491. **************************************************************************
  492. *
  493. *   SHOWMESSAGE text
  494. *
  495. rx_SHOWMSG: move.l  a2,-(a7)            ; Parameter anzeigen
  496.             lea     .s(pc),a0
  497.             move.l  a0,-(a7)            ; Formatstring "%s"
  498.             lea     .Titel(pc),a0
  499.             move.l  a0,-(a7)
  500.             bsr     _ShowMsgA           ; und anzeigen
  501.             lea     12(a7),a7
  502.             rts
  503.  
  504. .s:     dc.b '%s',0
  505. .Titel  dc.b 'Info',0
  506.  CNOP   0,2
  507.  
  508.  
  509. **************************************************************************
  510. *
  511. *   QUIT
  512. *
  513. rx_QUIT:    moveq   #TRUE,d7
  514.             rts
  515.  
  516.  
  517.  
  518. ****************************************************************************
  519. * In der RexxMsg-Struktur mit dem Kommando, die ARexx an den Port von
  520. * ACDPlay schickt, existieren 2 Felder für Ergebnisse: Result1 und Result2.
  521. * In Result1 der beantworteten RexxMessage erwartet ARexx den Fehlercode
  522. * des Kommandos, in Result2 ein Ergebnis (Argstring). Ein Ergebnis darf
  523. * allerdings nur zurückgegeben werden wenn es angefordert wurde. In einem
  524. * Rexxscript geschieht dies mit "OPTIONS RESULTS". ARexx setzt dann in
  525. * der RexxMsg, die an ACDPlay geschickt, wird das Flag RXFF_RESULT.
  526. * Weiterhin darf ein Ergebnis nur zurückgegeben werden, wenn der Fehlercode,
  527. * also Result1, 0 ist. Als primäres Ergebnis nimmt HandleRexxMsgA() den
  528. * Wert aus d0, das sekundäre Ergebnis muß in die RexxMsg-Struktur (a4)
  529. * eingetragen werden. Für Zahlen erledigt das ReturnValue, was die Zahl in
  530. * d0 zu einem ArgString wandelt, in Result2 einträgt und mit RETURN_OK
  531. * zu HandleARexxMsgA() zurückspringt. ReturnString macht das gleiche mit
  532. * einem String in d0.
  533. ****************************************************************************
  534.  
  535. ExitBool2RC: tst.w   d0
  536.              bne     .OK                ; <> 0 : RETURN_OK
  537.              moveq   #RETURN_FAIL,d0    ; == 0 : RETURN_FAIL
  538.              bra     .EXIT
  539. .OK          moveq   #RETURN_OK,d0
  540. .EXIT        rts
  541.  
  542. ExitSCSIErr2RC: tst.l   d0
  543.                 beq    .EXIT
  544.                 moveq  #RETURN_SCSIERR,d0
  545. .EXIT           rts
  546.  
  547. ReturnValue: move.l  rm_Action(a4),d1
  548.              btst.l  #RXFB_RESULT,d1    ; Wird 2.Ergebnis angefordert?
  549.              beq     .EXIT              ; Nein: keins liefern, da es nicht freigegeben werden würde
  550.              jsr     _LVOCVi2arg(a6)    ; LONG Wert aus d0 in ArgString konvertieren
  551.              move.l  d0,rm_Result2(a4)  ; Argstring (oder NULL falls Fehler) als 2.Ergebnis eintragen
  552. .EXIT        moveq   #RETURN_OK,d0      ; 1.Result muß dann 0 sein!
  553.              rts
  554.  
  555. ReturnString: move.l rm_Action(a4),d1
  556.              btst.l  #RXFB_RESULT,d1    ; Wird 2.Ergebnis angefordert?
  557.              beq     .EXIT              ; Nein: keins liefern, da es nicht freigegeben werden würde
  558.              move.l  d0,d2              ; strptr sichern
  559.              beq     .EXIT              ; NULL braucht nicht zu konvertiert werden :-)
  560.              move.l  d0,a0              ; Parameter
  561.              jsr     _LVOStrlen(a6)     ; Stringlänge wird von CreateArgString benötigt
  562.              move.l  d2,a0
  563.              jsr    _LVOCreateArgstring(a6) ; String aus d0 in ArgString konvertieren
  564.              move.l d0,rm_Result2(a4)   ; Argstring als 2.Ergebnis eintragen
  565. .EXIT        moveq  #RETURN_OK,d0       ; 1.Result muß dann 0 sein!
  566.              rts
  567.  
  568. ***************************
  569. *
  570. * a0 - Quelle, a1 - Ziel, d0 - Maxlen ohne Nullzeichen
  571. *
  572. CopyString: moveq   #0,d2               ; Counter
  573. CS_Loop:    move.b  (a0),d1             ; zum Testen
  574.             move.b  (a0)++,(a1)++
  575.             cmp.l   d0,d2               ; zulässige Grenze überschritten?
  576.             bhi.s   .EXIT
  577.             tst.b   d1                  ; Nullzeichen?
  578.             bne.s   CS_Loop
  579. .EXIT       rts
  580.  
  581. ;---------------------------------------------------------------------------
  582.  
  583.  
  584. JmpTable:   dc.l rx_PLAY                    ; Tabelle mit allen ARexxunterfunktionen
  585.             dc.l _StopButton                ;  in der gleichen Reihenfolge wie die
  586.             dc.l _PauseButton               ;  Schlüsselwörter
  587.             dc.l _JumpForwardButton
  588.             dc.l _JumpBackwardButton
  589.             dc.l _EjectButton
  590.             dc.l rx_UNLOADCD
  591.             dc.l rx_LOADCD
  592.             dc.l rx_LOCKCD
  593.             dc.l rx_UNLOCKCD
  594.  
  595.             dc.l _ProgramDelete
  596.             dc.l _ProgramCopyAll
  597.             dc.l _ProgramSave
  598.             dc.l _ProgramLoad
  599.             dc.l rx_APPEND
  600.             dc.l rx_DELETE
  601.  
  602.             dc.l rx_GETCDTITLE
  603.             dc.l rx_GETARTIST
  604.             dc.l rx_GETSONGNAME
  605.             dc.l rx_SETCDTITLE
  606.             dc.l rx_SETARTIST
  607.             dc.l _SaveTitles
  608.  
  609.             dc.l rx_ISUNITREADY
  610.             dc.l rx_GETSTATUS
  611.             dc.l rx_GETCURTRACK
  612.             dc.l rx_GETCURINDEX
  613.             dc.l rx_GETTOTALTIME
  614.             dc.l rx_GETCURTIME
  615.             dc.l rx_GETCURABSTIME
  616.  
  617.             dc.l rx_GETCDID
  618.             dc.l rx_GETCDLENGTH
  619.             dc.l rx_GETTRACKNUM
  620.             dc.l rx_GETFIRSTTRACK
  621.             dc.l rx_GETFIRSTATRACK
  622.  
  623.             dc.l rx_SETVOLUME
  624.             dc.l rx_GETVOLUME
  625.  
  626.             dc.l rx_GETDEVICE
  627.             dc.l rx_GETUNIT
  628.             dc.l rx_GETLUN
  629.             dc.l rx_GETSENSEKEY
  630.             dc.l rx_GETADDSENSECODE
  631.             dc.l rx_GETADDSENSECODEQ
  632.  
  633.             dc.l rx_GETVENDOR
  634.             dc.l rx_GETPRODUCT
  635.             dc.l rx_GETREVISION
  636.             dc.l rx_GETSPECIFIC
  637.  
  638.             dc.l rx_GETLANGUAGE
  639.  
  640.             dc.l rx_SHOW
  641.             dc.l rx_HIDE
  642.             dc.l rx_OPENWIN
  643.             dc.l rx_CLOSEWIN
  644.             dc.l rx_SHOWMSG
  645.             dc.l rx_QUIT
  646.  
  647. Commands:   dc.b 'PLAY',0                   ; CD-ROM Control
  648.             dc.b 'STOP',0
  649.             dc.b 'PAUSE',0
  650.             dc.b 'NEXTSONG',0
  651.             dc.b 'PREVSONG',0
  652.             dc.b 'EJECT',0
  653.             dc.b 'OPEN',0
  654.             dc.b 'CLOSE',0
  655.             dc.b 'LOCKCD',0
  656.             dc.b 'UNLOCKCD',0
  657.  
  658.             ;neue Kommandos in ACDPlay 1.5
  659.             dc.b 'DELETEPROGRAM',0          ; Program
  660.             dc.b 'COPYALLPROGRAM',0
  661.             dc.b 'SAVEPROGRAM',0
  662.             dc.b 'LOADPROGRAM',0
  663.             dc.b 'APPENDELEMENT',0
  664.             dc.b 'DELETEELEMENT',0
  665.  
  666.             dc.b 'GETTITLE',0
  667.             dc.b 'GETARTIST',0
  668.             dc.b 'GETSONGNAME',0
  669.             dc.b 'SETCDTITLE',0
  670.             dc.b 'SETARTIST',0
  671.             dc.b 'SAVETITLES',0
  672.  
  673.             dc.b 'ISUNITREADY',0            ; Current Data
  674.             dc.b 'GETSTATUS',0
  675.             dc.b 'GETCURRENTTRACK',0
  676.             dc.b 'GETCURRENTINDEX',0
  677.             dc.b 'GETTRACKLENGTH',0
  678.             dc.b 'GETTRACKPOSITION',0
  679.             dc.b 'GETABSPOSITION',0
  680.  
  681.             dc.b 'GETCDID',0
  682.             dc.b 'GETCDLENGTH',0            ; CD Data
  683.             dc.b 'GETTRACKNUMBER',0
  684.             dc.b 'GETFIRSTTRACK',0
  685.             dc.b 'GETFIRSTAUDIOTRACK',0
  686.  
  687.             dc.b 'SETVOLUME',0              ; Volume
  688.             dc.b 'GETVOLUME',0
  689.  
  690.             dc.b 'GETDEVICE',0              ; SCSI Driver
  691.             dc.b 'GETUNIT',0
  692.             dc.b 'GETLUN',0
  693.             dc.b 'GETSENSEKEY',0
  694.             dc.b 'GETADDSENSECODE',0
  695.             dc.b 'GETADDSENSECODEQUAL',0
  696.  
  697.             dc.b 'GETVENDOR',0              ; Device Identification
  698.             dc.b 'GETPRODUCT',0
  699.             dc.b 'GETREVISION',0
  700.             dc.b 'GETVENDORSPECIFIC',0
  701.  
  702.             dc.b 'GETLANGUAGE',0            ; Locale Stuff
  703.  
  704. name_SHOW   dc.b 'SHOW',0                   ; Application
  705.             dc.b 'HIDE',0
  706.             dc.b 'OPENWINDOW',0
  707.             dc.b 'CLOSEWINDOW',0
  708.             dc.b 'SHOWMESSAGE',0
  709.             dc.b 'QUIT',0
  710.             dc.b 0
  711.