; ; cd.s - cd player for AB3D (C)opyright 1995 Team17 Ltd - Charlie ; $Log: $ ; ; opt O+,P=68020 include "workbench:utilities/devpac/system.gs" ; INCLUDE utils:sysinc/exec_lib.i ; change this for your path!. INCLUDE utils:sysinc/exec/io.i INCLUDE utils:sysinc/devices/cd.i INCLUDE utils:sysinc/exec/lists.i _test bsr _InitCD move.l d0,doneit tst.l d0 beq.s .BadOpen moveq #1,d0 bsr _PlayCD .waitforstop: btst #6,$bfe001 bne.s .waitforstop bsr _StopCD bsr _CloseCD moveq #0,d0 .BadOpen rts ; end test routine.. doneit: dc.l 0 XDEF _InitCD _InitCD ; setup execbase lea Data(pc),a4 move.l 4.w,_ExecBase-Data(a4) move.l _ExecBase(pc),a6 ; setup port sub.l a0,a0 moveq #0,d0 jsr _CreatePort tst.l d0 beq.b .PortError move.l d0,_CDPort-Data(a4) ; MsgPort for cd.device ; Create first extended io port move.l d0,a0 moveq #IOSTD_SIZE,d0 ; sizeof strct IORequest jsr _CreateExtIO tst.l d0 beq.b .PortError move.l d0,_CDReq0-Data(a4) ; Create second extended io port move.l _CDPort(pc),a0 moveq #IOSTD_SIZE,d0 jsr _CreateExtIO tst.l d0 beq.b .PortError move.l d0,_CDReq1-Data(a4) ; second EXTIO ; open device.. lea _CDDev(pc),a0 moveq #0,d0 ; unit number move.l _CDReq0(pc),a1 moveq #0,d1 ; flags. jsr _LVOOpenDevice(a6) tst.l d0 beq.b .PortOk bra.b .PortError .PortOk move.l _CDReq0(pc),a0 move.l _CDReq0(pc),a1 ; copy _CDReq0 -> _CDReq1 moveq #20/4,d0 .loop move.l (a0),(a1) dbra d0,.loop moveq #1,d0 ; return value move.l d0,_CDAvail-Data(a4) rts .PortError moveq #0,d0 ; return value for error.. move.l d0,_CDAvail-Data(a4) rts XDEF _PlayCD _PlayCD lea Data(pc),a4 cmp.l #0,_CDAvail-Data(a4) bne.b .CDOk moveq #0,d0 rts .CDOk move.l d0,-(sp) ; kill any current activity.. bsr.b _StopCD move.l _CDReq0(pc),a1 move.w #CD_PLAYTRACK,IO_COMMAND(a1) move.l (sp)+,d0 move.l d0,IO_OFFSET(a1) ; play from move.l #1,IO_LENGTH(a1) ; number of tracks to play for move.l _ExecBase(pc),a6 jsr _LVOSendIO(a6) rts XDEF _StopCD _StopCD lea Data(pc),a4 ; check if CDReq0 is being used or not... move.l _CDReq0(pc),a1 move.l _ExecBase(pc),a6 jsr _LVOCheckIO(a6) tst.l d0 bne.b .NotUsed jsr _LVOAbortIO(a6) .NotUsed rts XDEF _CloseCD _CloseCD move.l _CDReq0(pc),a1 move.l _ExecBase(pc),a6 jsr _LVOCloseDevice(a6) move.l _CDReq0(pc),a0 jsr _DeleteExtIO rts XDEF _CDPos _CDPos lea Data(pc),a4 ; check if CDReq0 is being used or not... move.l _CDReq0(pc),a1 move.l _ExecBase(pc),a6 jsr _LVOCheckIO(a6) tst.l d0 bne.b .NotUsed moveq #-1,d0 .NotUsed rts _CreatePort movem.l d2-d5/a2,-(sp) move.l $18(sp),d3 move.b $1F(sp),d2 moveq #-1,d5 move.l d5,d0 move.l _ExecBase(pc),a6 jsr _LVOAllocSignal(a6) move.l d0,d4 ble.s .L6 move.l #$10001,d1 moveq #$22,d0 jsr _LVOAllocMem(a6) move.l d0,a2 move.l a2,d5 beq.s .L7 move.l d3,10(a2) move.b d2,9(a2) move.b #4,8(a2) clr.b 14(a2) move.b d4,15(a2) sub.l a1,a1 jsr _LVOFindTask(a6) move.l d0,$10(a2) tst.l d3 beq.s .L4 move.l a2,a1 jsr _LVOAddPort(a6) bra.s .L12 .L4 move.l $14(a2),a0 NEWLIST a0 .L12 move.l a2,d0 bra.s .L1 .L7 move.l d4,d0 jsr _LVOFreeSignal(a6) .L6 moveq #0,d0 .L1 movem.l (sp)+,d2-d5/a2 rts _DeletePort move.l a2,-(sp) move.l 8(sp),a2 tst.l 10(a2) beq.s .L14 move.l a2,a1 move.l _ExecBase(pc),a6 jsr _LVORemPort(a6) .L14 move.b #$FF,8(a2) moveq #-1,d0 move.l d0,$14(a2) moveq #0,d0 move.b 15(a2),d0 jsr _LVOFreeSignal(a6) move.l #$22,a1 move.l a2,d0 jsr _LVOFreeMem(a6) move.l (sp)+,a2 rts _CreateExtIO movem.l d2-d4,-(sp) move.l $10(sp),d2 move.l $14(sp),d3 tst.l d2 beq.s .L3 move.l #$10001,d1 move.l d3,d0 move.l _ExecBase(pc),a6 jsr _LVOAllocMem(a6) move.l d0,a0 move.l a0,d4 beq.s .L3 move.b #7,8(a0) move.w d3,$12(a0) move.l d2,14(a0) move.l a0,d0 bra.s .L1 .L3 moveq #0,d0 .L1 movem.l (sp)+,d2-d4 rts _DeleteExtIO move.l 4(sp),a0 move.l a0,d0 beq.s .L10 moveq #-1,d0 move.l d0,(a0) moveq #-1,d0 move.l d0,$14(a0) moveq #0,d0 move.w $12(a0),d0 move.l a0,a1 move.l _ExecBase(pc),a6 jsr _LVOFreeMem(a6) .L10 rts ; Data Section Data CNOP 0,4 _ExecBase dc.l 0 _CDAvail dc.l 0 _CDPort dc.l 0 _CDReq0 dc.l 0 _CDReq1 dc.l 0 _QCode dcb.b 10000,0 _CDDev: dc.b "cd.device",0 END