home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
AmigActive 13
/
AACD13.ISO
/
AACD
/
Utilities
/
ACDPlay
/
src
/
V1.6
/
asmlib
/
rexxcmds.s.old
< prev
Wrap
Text File
|
1997-04-30
|
24KB
|
711 lines
******************** (ARexx-Unterfunktionen) ***************************
* *
* Vorgabe: a0 - Zeiger auf CDx-Request *
* a1 - Zeiger auf ARexxkommando *
* a2 - Rest der Rexx-Kommandozeile (zum weiterparsen) *
* a4 - RexxMsg *
* a5 - Zeiger auf Applicationstruktur *
* a6 - RexxSysBase *
* d0 - 0 *
* d3 - SysBase *
* (sp) - Zeiger auf Applicationstruktur *
* *
* Rückgabe: d0 - RexxResult1 (Vorgabe RETURN_OK) *
* d7 - done: Rückgabewert von HandleARexxEvents *
* HandleARexxEvents() und dann auch ACDPlay werden bei *
* TRUE beendet (sollte nur von QUIT gesetzt werden) *
* *
**************************************************************************
xref _PlayButton
xref _DirectChoice
xref _StopButton
xref _PauseButton
xref _EjectButton
xref _JumpBackwardButton
xref _JumpForwardButton
xref _OpenApplication
xref _CloseApplication
xref _OpenAppWin
xref _CloseAppWin
xref _CreateAppIcon
xref _FreeAppIcon
xref _ProgramDelete
xref _ProgramCopyAll
xref _ProgramSave
xref _ProgramLoad
xref _ProgramAppendElement
xref _ProgramDeleteElement
xref _SaveTitles
xref _UpdateWinTitle
xref _MakeInterior
xref _FindNode
RETURN_SCSIERR EQU 15
; Die Applikationstruktur ist schon auf dem Stack, dadurch können Funktionen
; die nur einen Appzeiger erwarten direkt angesprungen (jmp) werden.
**************************************************************************
*
* PLAY [track]
*
rx_PLAY: move.l a2,a0 ; Parameter als Argument
jsr _LVOCVa2i(a6) ; zum Konvertieren (RexxSysbase ist schon in a6)
tst.b d1 ; Zahl übergeben?
bne .goon ;
jmp _PlayButton ; PlayButton wenn kein Track da
.goon move.w d0,-(a7) ; Track (UWORD)
move.l a5,-(a7) ; Application (APTR)
jsr _DirectChoice
addq.l #6,a7 ; Stack wieder zurücksetzen
.EXIT rts
**************************************************************************
*
* OPEN
*
rx_UNLOADCD:
moveq #TRUE,d0 ; cdx liegt bereits in a0
bsr _CDEjectA ; Schublade ausfahren
bra ExitSCSIErr2RC ; nur RETURN_OK oder RETURN_SCSIERR
**************************************************************************
*
* CLOSE
*
rx_LOADCD: moveq #FALSE,d0
bsr _CDEjectA ; Schublade einfahren
bra ExitSCSIErr2RC
**************************************************************************
*
* LOCKCD
*
rx_LOCKCD:
moveq #TRUE,d0 ; auch hier ist cdx schon in a0
bsr _CDLockA ; Schublade verriegeln
bra ExitSCSIErr2RC
**************************************************************************
*
* UNLOCKCD
*
rx_UNLOCKCD:
moveq #FALSE,d0
bsr _CDLockA ; Schublade entriegeln
bra ExitSCSIErr2RC
**************************************************************************
*
* APPENDELEMENT track
*
rx_APPEND: move.l a2,a0 ; Parameter als Argument
jsr _LVOCVa2i(a6) ; zum Konvertieren
tst.b d1 ; Zahl konvertiert?
beq .EXIT ; (d0=0=FALSE -> Fehler)
move.w d0,-(a7) ; Parameter rückwärts auf den
move.l a5,-(a7) ; Stack schieben
jsr _ProgramAppendElement
addq.l #6,a7 ; Stack wieder zurücksetzen
.EXIT bra ExitBool2RC ; vernünftigen Returncode setzen
; (Bool -> Rexx-Returncode)
**************************************************************************
*
* DELETEELEMENT position
*
rx_DELETE: move.l a2,a0 ; Parameter als Argument
jsr _LVOCVa2i(a6) ; zum Konvertieren
tst.b d1 ; (digits=0 ?)
beq .EXIT
move.l d0,-(a7) ; Parameter rückwärts auf den
move.l a5,-(a7) ; Stack schieben
jsr _ProgramDeleteElement
addq.l #8,a7 ; Stack wieder zurücksetzen
.EXIT bra ExitBool2RC
**************************************************************************
*
* title = GETCDTITLE
*
rx_GETCDTITLE: move.l 40(a5),a0 ; app->cdstr
move.l 44(a0),d0 ; cdstr->cdnameptr
bra ReturnString ; String in Argstring konvertieren
; und als Result2 in RexxMsg eintragen
**************************************************************************
*
* name = GETARTIST
*
rx_GETARTIST: move.l 40(a5),a0 ; app->cdstr
move.l 48(a0),d0 ; cdstr->artistptr
bra ReturnString
**************************************************************************
*
* name = GETSONGNAME [track]
*
rx_GETSONGNAME: exg.l a2,a0 ; a2<->a0 (Parameter als Argument und a0 sichern)
jsr _LVOCVa2i(a6) ; zum Konvertieren
tst.b d1 ; (digits=0 ?)
bne .goon
move.b cdx_CurrentTrack(a2),d0 ; wenn kein Parameter übergeben wurde, dann
.goon subq.l #1,d0 ; aktuellen Track nehmen
move.l d0,-(a7) ; track-1 auf den Stack (da Listen bei 0 anfangen)
move.l 40(a5),a0 ; app->cdstr
move.l 16(a0),-(a7) ; cdstr->cdtitles
jsr _FindNode
addq.l #8,a7 ; Stack zurück
move.l d0,a0
tst.l LN_SUCC(a0) ; Ende der Liste erreicht?
beq .NOTFOUND ; ja: --> mit RETURN_FAIL beenden
move.l LN_NAME(a0),d0 ; Name des Titels
bra ReturnString
.NOTFOUND moveq #RETURN_FAIL,d0
rts
****************************************
*
* SETCDTITLE
*
rx_SETCDTITLE: move.l a2,a0 ; Argument für CopyString -> Quelle
move.l 40(a5),a1 ; app->cdstr
move.l 44(a1),a1 ; cdstr->cdname -> Ziel
move.l #127,d0 ; Maximale Länge
bsr CopyString(pc)
jsr _UpdateWinTitle
rts
****************************************
*
* SETARTIST
*
rx_SETARTIST: move.l a2,a0 ; Argument für CopyString -> Quelle
move.l 40(a5),a1 ; app->cdstr
move.l 48(a1),a1 ; cdstr->artistname -> Ziel
move.l #127,d0 ; Maximale Länge
bsr CopyString(pc)
jsr _UpdateWinTitle
rts
**************************************************************************
*
* bool = ISUNITREADY
*
rx_ISUNITREADY:
bsr _CDTestUnitA ; cdx ist in a0
tst.l d0
bne .NO
moveq #1,d0
bra.s .EXIT
.NO moveq #0,d0
.EXIT bra ReturnValue
**************************************************************************
*
* status = GETSTATUS
*
rx_GETSTATUS:
bsr _CDUpdateA
moveq #0,d0 ; evt. Fehlercode löschen
move.b cdx_AudioStatus(a0),d0
bra ReturnValue ; Zahl in Argstring wandeln und
; in RexxMsg als Result2 eintragen
**************************************************************************
*
* track = GETCURRENTTRACK
*
rx_GETCURTRACK:
move.b cdx_CurrentTrack(a0),d0
bra ReturnValue
**************************************************************************
*
* index = GETCURRENTINDEX
*
rx_GETCURINDEX:
move.b cdx_CurrentIndex(a0),d0
bra ReturnValue
**************************************************************************
*
* blocks = GETTRACKLENGTH
*
rx_GETTOTALTIME:
move.l cdx_TrackLength(a0),d0
bra ReturnValue
**************************************************************************
*
* block = GETTRACKPOSITION
*
rx_GETCURTIME:
move.l cdx_CurrentRelAddr(a0),d0
bra ReturnValue
**************************************************************************
*
* block = GETABSPOSITION
*
rx_GETCURABSTIME:
move.l cdx_CurrentAbsAddr(a0),d0
bra ReturnValue
*******************************
* string = GETCDID
*
rx_GETCDID:
move.l cdx_TOCData(a0),a0
move.l CDID(a0),d0
bra ReturnString
**************************************************************************
*
* blocks = GETCDLENGTH
*
rx_GETCDLENGTH:
move.l cdx_TOCData(a0),a0
move.l Entry+Address(a0),d0 ; cdx_TOCData->Entry[0].Address
bra ReturnValue
**************************************************************************
*
* track = GETFIRSTTRACK
*
rx_GETFIRSTTRACK:
move.l cdx_TOCData(a0),a0
move.b FirstTrack(a0),d0
bra ReturnValue
**************************************************************************
*
* track = GETFIRSTAUDIOTRACK
*
rx_GETFIRSTATRACK:
move.l cdx_TOCData(a0),a0
move.b FirstAudioTrack(a0),d0
bra ReturnValue
**************************************************************************
*
* trackanzahl = GETTRACKNUMBER
*
rx_GETTRACKNUM:
move.l 40(a5),a0 ; app->cdstr
move.b 36(a0),d0 ; cdstr->num_track
bra ReturnValue ; als sekundäres Ergebnis zurück
**************************************************************************
*
* SETVOLUME volume
*
rx_SETVOLUME:
move.l a2,a0 ; Parameter als Argument
jsr _LVOCVa2i(a6) ; String konvertieren
tst.b d1 ; (digits=0 ?)
beq .EXIT
cmp.l #255,d0
bls .goon ; d0 <= 255 --> goon
move.b #255,d0
.goon move.l 40(a5),a0
move.l 8(a0),a0 ; app->cdstr->cdx auch als Argument
move.b d0,cdx_Volume0(a0) ; in alle beiden
move.b d0,cdx_Volume1(a0) ; Volume-Felder den Wert eintragen
moveq #SET_VOLUME,d0 ; SET-Modus als Argument
bsr _CDVolumeA
tst.l d0
bne .scsierr
move.w #9,-(a7) ; WINDOW_VOLUME und
move.l a5,-(a7) ; Application als Parameter
jsr _MakeInterior ; Volumefenster aktualisieren
addq.l #6,a7
moveq #TRUE,d0 ; TRUE: RC=0
.EXIT bra ExitBool2RC
.scsierr moveq #RETURN_SCSIERR,d0 ; RC=15
rts
**************************************************************************
*
* volume = GETVOLUME
*
rx_GETVOLUME:
moveq #GET_VOLUME,d0 ; GET-Modus als Argument
bsr _CDVolumeA ; CDx liegt schon in a0
tst.l d0 ; alles klar?
beq .good
moveq #RETURN_SCSIERR,d0 ; nein: RETURN_SCSIERR als Fehlercode
rts ; und raus
.good move.b cdx_Volume0(a0),d0 ; cdx->volume[0]
moveq #0,d1
move.b cdx_Volume1(a0),d1
add.w d1,d0
lsr.w #1,d0 ; d0 = (volume[0] + volume[1])/2
bra ReturnValue
rx_GETDEVICE: move.l cdx_DeviceName(a0),d0
bra ReturnString
rx_GETUNIT: move.b cdx_Unit(a0),d0
bra ReturnValue
rx_GETLUN: move.b cdx_LUN(a0),d0
bra ReturnValue
rx_GETSENSEKEY:
move.b cdx_SenseKey(a0),d0
bra ReturnValue
rx_GETADDSENSECODE:
move.b cdx_AddSenseCode(a0),d0
bra ReturnValue
rx_GETADDSENSECODEQ:
move.b cdx_AddSenseCodeQual(a0),d0
bra ReturnValue
rx_GETVENDOR: move.l cdx_Vendor(a0),d0
bra ReturnString
rx_GETPRODUCT: lea cdx_Product(a0),a0
move.l a0,d0
bra ReturnString
rx_GETREVISION: lea cdx_Revision(a0),a0
move.l a0,d0
bra ReturnString
rx_GETSPECIFIC: lea cdx_Specific(a0),a0
move.l a0,d0
bra ReturnString
***************************
*
* GETLANGUAGE
*
rx_GETLANGUAGE: lea _li,a0
move.l 4(a0),a0
move.l cat_Language(a0),a0
move.l a0,d0
bra ReturnString
**************************************************************************
*
* SHOW
*
rx_SHOW: move.l a5,-(a7) ; Application auf den Stack
jsr _FreeAppIcon
jsr _OpenApplication
addq.l #4,a7 ; Stack wieder zurück
bra ExitBool2RC
**************************************************************************
*
* HIDE
*
rx_HIDE: move.l a5,-(a7)
jsr _CloseApplication
jsr _CreateAppIcon
addq.l #4,a7
moveq #RETURN_OK,d0
rts
**************************************************************************
*
* OPENWINDOW win
*
rx_OPENWIN: move.l a2,a0 ; Parameter als Argument
jsr _LVOCVa2i(a6) ; zum Konvertieren
tst.b d1 ; Zahl konvertiert?
beq .EXIT ; (d0=0=FALSE -> Fehler)
tst.l d0 ; WINDOW_MAIN (0) muß mit
beq rx_SHOW ; OpenApplication() geöffnet werden
cmp.l #9,d0 ; letztes Fenster (9=WINDOW_VOLUME)
bls .goon ; d0 <= 9 --> .goon
moveq #FALSE,d0
bra .EXIT
.goon move.l (a5),a0 ; app->screen
move.l a0,d0 ; Testen, ob Application geöffnet
bne.s .continue ; wenn nein,
beq rx_SHOW ; öffnen
.continue move.w d0,-(a7) ; Parameter rückwärts auf den
move.l a5,-(a7) ; Stack schieben
jsr _OpenAppWin
addq.l #6,a7 ; Stack wieder zurücksetzen
.EXIT bra ExitBool2RC
**************************************************************************
*
* CLOSEWINDOW win
*
rx_CLOSEWIN: move.l a2,a0 ; Parameter als Argument
jsr _LVOCVa2i(a6) ; zum Konvertieren
tst.b d1 ; Zahl konvertiert?
beq .EXIT ; (d0=0=FALSE -> Fehler)
tst.l d0 ; WINDOW_MAIN (0) muß mit OpenApplication geöffnet werden
beq rx_HIDE
cmp.l #9,d0 ; 9=WINDOW_VOLUME
bls .goon ; d0 <= 9 --> .goon
moveq #FALSE,d0
bra .EXIT
.goon move.w #TRUE,-(a7) ; wirklich schließen
move.w d0,-(a7) ; windownummer
move.l a5,-(a7) ; application
jsr _CloseAppWin
addq.l #8,a7 ; Stack wieder zurücksetzen
moveq #TRUE,d0 ; CloseAppWin gibt void zurück
.EXIT bra ExitBool2RC
**************************************************************************
*
* SHOWMESSAGE text
*
rx_SHOWMSG: move.l a2,-(a7) ; Parameter anzeigen
lea .s(pc),a0
move.l a0,-(a7) ; Formatstring "%s"
lea .Titel(pc),a0
move.l a0,-(a7)
bsr _ShowMsgA ; und anzeigen
lea 12(a7),a7
rts
.s: dc.b '%s',0
.Titel dc.b 'Info',0
CNOP 0,2
**************************************************************************
*
* QUIT
*
rx_QUIT: moveq #TRUE,d7
rts
****************************************************************************
* In der RexxMsg-Struktur mit dem Kommando, die ARexx an den Port von
* ACDPlay schickt, existieren 2 Felder für Ergebnisse: Result1 und Result2.
* In Result1 der beantworteten RexxMessage erwartet ARexx den Fehlercode
* des Kommandos, in Result2 ein Ergebnis (Argstring). Ein Ergebnis darf
* allerdings nur zurückgegeben werden wenn es angefordert wurde. In einem
* Rexxscript geschieht dies mit "OPTIONS RESULTS". ARexx setzt dann in
* der RexxMsg, die an ACDPlay geschickt, wird das Flag RXFF_RESULT.
* Weiterhin darf ein Ergebnis nur zurückgegeben werden, wenn der Fehlercode,
* also Result1, 0 ist. Als primäres Ergebnis nimmt HandleRexxMsgA() den
* Wert aus d0, das sekundäre Ergebnis muß in die RexxMsg-Struktur (a4)
* eingetragen werden. Für Zahlen erledigt das ReturnValue, was die Zahl in
* d0 zu einem ArgString wandelt, in Result2 einträgt und mit RETURN_OK
* zu HandleARexxMsgA() zurückspringt. ReturnString macht das gleiche mit
* einem String in d0.
****************************************************************************
ExitBool2RC: tst.w d0
bne .OK ; <> 0 : RETURN_OK
moveq #RETURN_FAIL,d0 ; == 0 : RETURN_FAIL
bra .EXIT
.OK moveq #RETURN_OK,d0
.EXIT rts
ExitSCSIErr2RC: tst.l d0
beq .EXIT
moveq #RETURN_SCSIERR,d0
.EXIT rts
ReturnValue: move.l rm_Action(a4),d1
btst.l #RXFB_RESULT,d1 ; Wird 2.Ergebnis angefordert?
beq .EXIT ; Nein: keins liefern, da es nicht freigegeben werden würde
jsr _LVOCVi2arg(a6) ; LONG Wert aus d0 in ArgString konvertieren
move.l d0,rm_Result2(a4) ; Argstring (oder NULL falls Fehler) als 2.Ergebnis eintragen
.EXIT moveq #RETURN_OK,d0 ; 1.Result muß dann 0 sein!
rts
ReturnString: move.l rm_Action(a4),d1
btst.l #RXFB_RESULT,d1 ; Wird 2.Ergebnis angefordert?
beq .EXIT ; Nein: keins liefern, da es nicht freigegeben werden würde
move.l d0,d2 ; strptr sichern
beq .EXIT ; NULL braucht nicht zu konvertiert werden :-)
move.l d0,a0 ; Parameter
jsr _LVOStrlen(a6) ; Stringlänge wird von CreateArgString benötigt
move.l d2,a0
jsr _LVOCreateArgstring(a6) ; String aus d0 in ArgString konvertieren
move.l d0,rm_Result2(a4) ; Argstring als 2.Ergebnis eintragen
.EXIT moveq #RETURN_OK,d0 ; 1.Result muß dann 0 sein!
rts
***************************
*
* a0 - Quelle, a1 - Ziel, d0 - Maxlen ohne Nullzeichen
*
CopyString: moveq #0,d2 ; Counter
CS_Loop: move.b (a0),d1 ; zum Testen
move.b (a0)++,(a1)++
cmp.l d0,d2 ; zulässige Grenze überschritten?
bhi.s .EXIT
tst.b d1 ; Nullzeichen?
bne.s CS_Loop
.EXIT rts
;---------------------------------------------------------------------------
JmpTable: dc.l rx_PLAY ; Tabelle mit allen ARexxunterfunktionen
dc.l _StopButton ; in der gleichen Reihenfolge wie die
dc.l _PauseButton ; Schlüsselwörter
dc.l _JumpForwardButton
dc.l _JumpBackwardButton
dc.l _EjectButton
dc.l rx_UNLOADCD
dc.l rx_LOADCD
dc.l rx_LOCKCD
dc.l rx_UNLOCKCD
dc.l _ProgramDelete
dc.l _ProgramCopyAll
dc.l _ProgramSave
dc.l _ProgramLoad
dc.l rx_APPEND
dc.l rx_DELETE
dc.l rx_GETCDTITLE
dc.l rx_GETARTIST
dc.l rx_GETSONGNAME
dc.l rx_SETCDTITLE
dc.l rx_SETARTIST
dc.l _SaveTitles
dc.l rx_ISUNITREADY
dc.l rx_GETSTATUS
dc.l rx_GETCURTRACK
dc.l rx_GETCURINDEX
dc.l rx_GETTOTALTIME
dc.l rx_GETCURTIME
dc.l rx_GETCURABSTIME
dc.l rx_GETCDID
dc.l rx_GETCDLENGTH
dc.l rx_GETTRACKNUM
dc.l rx_GETFIRSTTRACK
dc.l rx_GETFIRSTATRACK
dc.l rx_SETVOLUME
dc.l rx_GETVOLUME
dc.l rx_GETDEVICE
dc.l rx_GETUNIT
dc.l rx_GETLUN
dc.l rx_GETSENSEKEY
dc.l rx_GETADDSENSECODE
dc.l rx_GETADDSENSECODEQ
dc.l rx_GETVENDOR
dc.l rx_GETPRODUCT
dc.l rx_GETREVISION
dc.l rx_GETSPECIFIC
dc.l rx_GETLANGUAGE
dc.l rx_SHOW
dc.l rx_HIDE
dc.l rx_OPENWIN
dc.l rx_CLOSEWIN
dc.l rx_SHOWMSG
dc.l rx_QUIT
Commands: dc.b 'PLAY',0 ; CD-ROM Control
dc.b 'STOP',0
dc.b 'PAUSE',0
dc.b 'NEXTSONG',0
dc.b 'PREVSONG',0
dc.b 'EJECT',0
dc.b 'OPEN',0
dc.b 'CLOSE',0
dc.b 'LOCKCD',0
dc.b 'UNLOCKCD',0
;neue Kommandos in ACDPlay 1.5
dc.b 'DELETEPROGRAM',0 ; Program
dc.b 'COPYALLPROGRAM',0
dc.b 'SAVEPROGRAM',0
dc.b 'LOADPROGRAM',0
dc.b 'APPENDELEMENT',0
dc.b 'DELETEELEMENT',0
dc.b 'GETTITLE',0
dc.b 'GETARTIST',0
dc.b 'GETSONGNAME',0
dc.b 'SETCDTITLE',0
dc.b 'SETARTIST',0
dc.b 'SAVETITLES',0
dc.b 'ISUNITREADY',0 ; Current Data
dc.b 'GETSTATUS',0
dc.b 'GETCURRENTTRACK',0
dc.b 'GETCURRENTINDEX',0
dc.b 'GETTRACKLENGTH',0
dc.b 'GETTRACKPOSITION',0
dc.b 'GETABSPOSITION',0
dc.b 'GETCDID',0
dc.b 'GETCDLENGTH',0 ; CD Data
dc.b 'GETTRACKNUMBER',0
dc.b 'GETFIRSTTRACK',0
dc.b 'GETFIRSTAUDIOTRACK',0
dc.b 'SETVOLUME',0 ; Volume
dc.b 'GETVOLUME',0
dc.b 'GETDEVICE',0 ; SCSI Driver
dc.b 'GETUNIT',0
dc.b 'GETLUN',0
dc.b 'GETSENSEKEY',0
dc.b 'GETADDSENSECODE',0
dc.b 'GETADDSENSECODEQUAL',0
dc.b 'GETVENDOR',0 ; Device Identification
dc.b 'GETPRODUCT',0
dc.b 'GETREVISION',0
dc.b 'GETVENDORSPECIFIC',0
dc.b 'GETLANGUAGE',0 ; Locale Stuff
name_SHOW dc.b 'SHOW',0 ; Application
dc.b 'HIDE',0
dc.b 'OPENWINDOW',0
dc.b 'CLOSEWINDOW',0
dc.b 'SHOWMESSAGE',0
dc.b 'QUIT',0
dc.b 0