From caen!sol.ctr.columbia.edu!howland.reston.ans.net!cs.utexas.edu!uunet!dziuxsolim.rutgers.edu!pilot.njin.net!jac Sun Mar 6 21:13:48 EST 1994 Article: 119 of comp.sources.apple2 Path: caen!sol.ctr.columbia.edu!howland.reston.ans.net!cs.utexas.edu!uunet!dziuxsolim.rutgers.edu!pilot.njin.net!jac From: jac@pilot.njin.net (Jonathan Chandross) Newsgroups: comp.sources.apple2 Subject: v001SRC091: RamFAST CD-ROM Audio Drivers Message-ID: Date: 2 Mar 94 01:42:07 GMT Organization: Rutgers Univ., New Brunswick, N.J. Lines: 3289 Approved: jac@pilot.njin.net Submitted-by: Jawaid Bazyar (bazyar@netcom.com) Posting-number: Volume 1, Source:91 Archive-name: gno/driver/ramfast/cdrom_v1.0 Architecture: 2gs Version-number: 1.00 Here is the source (ORCA/C and ORCA/M) to some RamFAST Media Control drivers which allow you to play audio compact discs on a CD-ROM drive connected to a RamFASC SCSI interface card. Until now, there has been no way to play audio CD's in any CD-ROM hooked up to a RamFAST board. These drivers are also provided as yet another example of how to program the RamFAST SCSI card directly. The drivers support the following CD-ROM drives: Apple CD-150 NEC (all models) Texel (all models. The Sequential Systems drive is made by Texel) Requires GNO/ME. Enjoy. =Read.Me - -CD-ROM Audio Drivers For RamFAST -Requires GNO/ME - -Here is the source (ORCA/C and ORCA/M) to some RamFAST Media Control -drivers which allow you to play audio compact discs on a CD-ROM drive -connected to a RamFASC SCSI interface card. Until now, there has been -no way to play audio CD's in any CD-ROM hooked up to a RamFAST board. -These drivers are also provided as yet another example of how to -program the RamFAST SCSI card directly. - -The drivers support the following CD-ROM drives: - Apple CD-150 - NEC (all models) - Texel (all models. The Sequential Systems drive is made by Texel) - -If your drive is not supported, you may be able to modify one of the -existing drivers. - --------------------- -Building The Drivers --------------------- -This source code is designed to be built under the GNO/ME system. To -build it, just type "make". - ----------------------- -Installing The Drivers ----------------------- -Start by installing the Media Control toolkit. This is found on the Apple -IIGS System Install disks. Run the installer and choose "Custom" install. -Then select and install "Media: CD-150". - -Quit the installer, and copy the RF. file corresponding to your -CD-ROM drive to the - *:System:Drivers:Media.Control -directory, where "*" represents your boot volume. - -Now reboot the computer to make sure the new files you installed are -activated. Open the Control Panel NDA, and open the new "Media Control" -panel. Select the RF. name that you installed (there will also -be "AppleCDSC", this driver only works for the Apple SCSI card). - -Close up the control panel, and open the "Media Controller" NDA. Put an -audio CD in your CD-ROM drive, click "Play", and away you go! - -Note: the "CD-Remote" NDA, while it looks nicer than "Media Controller", -is hard-coded to work only with the Apple CD-150 and an Apple SCSI card. - ------ -Files ------ -Read.Me This file -cd150.c Driver for Apple CD-150 CD-ROM drive -makefile Script for make to build software -mc.h Media control definitions -mediarf.asm Media control toolkit interface for C routines -mediarf.mac Media control toolkit interface macros -nec.c Driver for a NEC CD-ROM drive -rf.mac RamFAST direct SCSI command access macros. -rfscsi.asm RamFAST direct SCSI command access assembly routines -scsi.c Finds RamFAST slot, CD-ROM id, etc. -scsi.h Definitions used by scsi.h -texel.c Driver for a Texel CD-ROM drive -types.h Common data structure definitions -util.c Utility routines (BCD <-> decimal, etc.) - ---------- -Copyright ---------- -COPYRIGHT 1994 BY SEQUENTIAL SYSTEMS -ALL RIGHTS RESERVED - -Permission to redistribute granted provided that: - (1) all copyright notices remain intact - (2) all files are transferred together in the original archive - (3) modified versions are not distributed. - -If you have modified this software and would like to redistribute it, you -must contact the author for permission to do so. - ------------------------------ -Other Uses For A CD-ROM Drive ------------------------------ -Sequential Systems' discQuest package allows IIgs CD-ROM owners to use -fifteen multimedia CD-ROM titles. For more information, contact: - Sequential Systems Inc. - 1200 Diamond Circle - Lafayette, CO 80026 - - (303) 666-4549 Main switchboard - (303) 665-0933 Fax - (800) 759-4549 Sales - (800) 999-1717 Technical Support - (303) 666-7797 BBS (v.32bis/v.42bis 300 - 14400 baud) - This BBS has an autofax service which can fax you - product information. - - -Jawaid Bazyar -bazyar@netcom.com -Sequential Systems Inc. -1200 Diamond Circle -Lafayette, CO 80026 - -Version 1.00 -February 1994 =Manifest -Manifest -Read.Me -cd150.c -makefile -mc.h -mediarf.asm -mediarf.mac -nec.c -rf.mac -rfscsi.asm -scsi.c -scsi.h -texel.c -types.h -util.c =cd150.c -/* - * CD150.c - * - * Media Control Driver (main code) for the RamFAST SCSI Card - * By Jawaid Bazyar - * Copyright 1994, Sequential Systems Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mc.h" - -#pragma noroot -#pragma lint -1 - -#include "scsi.h" -#include "types.h" - -word xMCSearchTo(word chan, word UnitType, Long searchLoc); -unsigned long xMCGetPosition(word, word); -unsigned getAudioStatus(void); - -#pragma optimize 9 - -byte outdata[0x40]; -byte tocdata[0x40]; -byte gettoc[] = {0xC1,0,0,0,0,0,0,0,10,0}; -byte pause[] = {0xCA, 0x10, 0,0,0,0,0,0,0,0}; -byte search[] = {0xC8,0,0,0,0,0,0,0,0,0}; -byte playtrack[] = {0xC6,0,0,0,0,0,0,0,0xFF,0}; -byte getst[] = {0xC4,0,0,0,0,0,0,0,0x40,0}; -byte prevallow[] = {0x1E,0,0,0,0,0}; -byte startstop[] = {0x1B,0,0,0,0x2,0}; -byte readsubq[] = {0xC2,0,0,0,0,0,0,0,9,0}; -byte play[] = {0xC9,0,0,0,0,0,0,0,0,0}; -byte stop[] = {0xCB,0,0,0,0,0,0,0,0,0}; -byte status[] = {0xCC,0,0,0,0,0,0,0,6,0}; -byte scan[] = {0xCD,0,0,0,0,0,0,0,0,0x40}; -byte capacity[] = {0x25,0,0,0,0,0,0,0,0,0}; - -unsigned playMode = 9; -unsigned stopFlag = 0; - -/* -------------------------------------------------------------------- - - Routines to handle Media Control driver commands - - -------------------------------------------------------------------- */ - -void initname(void) -{ -extern char DriverNamStr[]; -static char dn[] = "\pMCToolkit RF/CD150 1.0"; - - memcpy(DriverNamStr,dn,dn[0]); -} - -void setStopAtLeadOut(void) -{ - gettoc[9] = 0x40; - gettoc[5] = 0; - ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x40,tocdata); - memcpy(stop+3,tocdata,3); - if (stop[5]) stop[5] = DecToBCD(BCDToDec(stop[5])-1); - else { - stop[5] = 0x73; - if (stop[4]) stop[4] = DecToBCD(BCDToDec(stop[4])-1); - else { - stop[4] = 0x59; - stop[3] = DecToBCD(BCDToDec(stop[3])-1); - } - } - stop[2] = 0; - stop[9] = 0x40; - ExecSCSICmd(CDROM_SCSI_ID,stop,0x10,tocdata); - stopFlag = 0; -} - -Long xMCGetFeatures(word mcChannelNo, word mcFeatSet) -{ - switch (mcFeatSet) { - case mcFTypes: return 7l; - case mcFStep: return 0l; - case mcFRecord: return 0l; - case mcFVideo: return 0l; - case mcFEject: return 1l; - case mcFLock: return 1l; - case mcFVDisplay: return 0l; - case mcFVOverlay: return 0l; - case mcFVOChars: return 0l; - case mcFVolume: return 0l; - default: return 0xFFFF2609l; - } -} - -unsigned long start_lba; - -unsigned xMCGetNoTracks(word chan) -{ - gettoc[5] = 0; - gettoc[8] = 4; - gettoc[9] = 0; - if (ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x6,tocdata)) { - scsi_error(tocdata); - return 0xFFFFFFFF; - } - return tocdata[1]; -} - -unsigned long xMCGetDiscID(word mcChannelNo) -{ -unsigned long ll; - - if (ExecSCSICmd(CDROM_SCSI_ID,capacity,0x8,tocdata)) { - return 0xFFFF2609; - } - memcpy(&ll,capacity,4); - ll = swap_orderl(ll); - return ll; -} - -unsigned long xMCGetDiscTOC(word chan,word track) -{ -unsigned long lba; - - gettoc[9] = 0x80; - gettoc[5] = track; - if (ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x40,tocdata)) { - scsi_error(tocdata); - return 0xFFFF2609; - } - lba = *((long*)(tocdata+2)); - lba = swap_orderl(lba)/* - start_lba*/; - return xConvTimeBinToBCD(lba); -} - -word xMCPlay(word chan) -{ -unsigned long ll; - if (stopFlag == 1) stopFlag ++; - else if (stopFlag == 2) { - setStopAtLeadOut(); - } - ll = xMCGetPosition(chan,mcInTime); - ll = swap_orderl(ll); - memcpy(search+3,((byte *)(&ll)+1),3); - if (getAudioStatus()) return 0; - search[2] = 0; - search[1] = 0x10 | playMode; - search[9] = 0x40; - if (ExecSCSICmd(CDROM_SCSI_ID,search,0x40,tocdata)) - return 0x2609; - else return 0; -} - -void xMCPause(word chan) -{ - pause[1] = 0x10; - ExecSCSICmd(CDROM_SCSI_ID,pause,0x40,tocdata); -} - -/* Unimplemented */ -void xMCSendRawData(word chan, void *data) -{ -} - -word xMCGetStatus(word mcChannelNo, word mcStatusSel) -{ - switch (mcStatusSel) { - case mcSDeviceType: - return mcSCDAudio; - case mcSPlayStatus: - if (ExecSCSICmd(CDROM_SCSI_ID,getst,0x40,tocdata)) - return mcSParked; - if (tocdata[5] == 0) return mcSPlaying; - if (tocdata[5] == 1) return mcSStill; - return mcSUnknown; - case mcSDoorStatus: - return mcSUnknown; - } -} - -word xMCControl(word mcChannelNo, word ctlCommand) -{ - switch (ctlCommand) { - case mcCEject: - startstop[4] = 0x2; - ExecSCSICmd(CDROM_SCSI_ID,startstop,6,tocdata); - break; - case mcCLockDev: - prevallow[4] = 1; - ExecSCSICmd(CDROM_SCSI_ID,prevallow,0x40,tocdata); - break; - case mcCUnLockDev: - prevallow[4] = 0; - ExecSCSICmd(CDROM_SCSI_ID,prevallow,0x40,tocdata); - break; - default: return 0x2601; - } - return 0; -} - -void xMCScan(word mcChannelNo, int mcDirection) -{ -unsigned long ll; - - ll = xMCGetPosition(mcChannelNo,mcInTime); - ll = swap_orderl(ll); - memcpy(scan+3,((byte *)&ll)+1,3); - - if (mcDirection > 0) { /* scan forward */ - scan[1] = 0; - } else { /* scan backward */ - scan[1] = 0x10; - } - ExecSCSICmd(CDROM_SCSI_ID,scan,0x10,tocdata); -} - -void xMCGetSpeeds(word mcChannelNo, char *pStrPtr) -{ - strcpy(pStrPtr,"\p150"); -} - -void xMCSpeed(word mcChannelNo, word mcFPS) -{ -} - -unsigned xMCStopAt(word mcChannelNo, word mcUnitType, unsigned long mcStopLoc) -{ -unsigned long ll; - - switch (mcUnitType) { - case mcInTime: - ll = swap_orderl(mcStopLoc); - memcpy(stop+3,((byte *)&ll)+1,3); - stop[2] = 0; - stop[9] = 0x40; - if (ExecSCSICmd(CDROM_SCSI_ID,stop,0x10,tocdata)) - return 0x2609; - break; - } - stopFlag = 1; - return 0; -} - -unsigned xMCStop(word mcChannelNo) -{ - stopFlag = 2; /* make sure we reset stop to end of disc */ - xMCSearchTo(mcChannelNo,mcInChapters,1); - setStopAtLeadOut(); - startstop[4] = 0; - xMCPause(mcChannelNo); - if (ExecSCSICmd(CDROM_SCSI_ID,startstop,0x40,tocdata)) return 0x2609; - else return 0; -} - -word xMCSetAudio(word mcChannelNo, word mcAudioCtl) -{ -unsigned long ll; - - playMode = mcAudioCtl; - play[1] = playMode; - ll = xMCGetPosition(mcChannelNo,mcInTime); - ll = swap_orderl(ll); - memcpy(play+3,((byte *)(&ll)+1),3); - play[9] = 0x40; - if (getAudioStatus()) - if (ExecSCSICmd(CDROM_SCSI_ID,play,0x10,tocdata)) - return 0x2607; - return 0; -} - -word xMCJog(word mcChannelNo, word mcUnitType, long mcNJog, int mcJogRepeat) -{ -long track; -unsigned err; - - switch (mcUnitType) { - case mcInFrames: return 0x2601; - case mcInChapters: - ExecSCSICmd(CDROM_SCSI_ID,readsubq,9,tocdata); - if (mcJogRepeat < 0) { - mcJogRepeat = 0 - mcJogRepeat; - mcNJog = 0 - mcNJog; - } - track = BCDToDec(tocdata[1]); - if (mcNJog < 0) { - if ((tocdata[3] != 0) || (tocdata[4] >1)) track++; - } - for (; mcJogRepeat != 0; mcJogRepeat--) { - if (err = xMCSearchTo(mcChannelNo, mcInChapters, track+= mcNJog)) { - SysBeep(); - return err; - } - } - return 0; - default: return 0x2601; - } -} - -unsigned long xMCGetTimes(word mcChannelNo, word mcTimesSel) -{ -unsigned long tm,ll; -hmsf t; - - switch (mcTimesSel) { - case mcElapsedTrack: - ExecSCSICmd(CDROM_SCSI_ID,readsubq,0x9,tocdata); - tm = 0l; - memcpy(((byte *)(&tm)+1),tocdata+3,3); - tm = swap_orderl(tm); - return tm; - - case mcRemainTrack: - return -1; - case mcElapsedDisc: - return xMCGetPosition(mcChannelNo,mcInTime); - - case mcRemainDisc: - - case mcTotalDisc: - case mcTotalFrames: - return 0xFFFF2609; - break; - case mcTracks: - gettoc[5] = 0; - gettoc[8] = 4; - gettoc[9] = 0; - ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x4,tocdata); - return (tocdata[1] << 16) | tocdata[0]; - - default: - return -1; - } -} - -unsigned long xMCGetPosition(word mcChannelNo, word mcUnitType) -{ -unsigned long tm; - - if (ExecSCSICmd(CDROM_SCSI_ID,readsubq,9,tocdata)) - return 0xFFFF2607; - - switch (mcUnitType) { - case mcInChapters: - return BCDToDec(tocdata[1]); - case mcInFrames: - tm = ((BCDToDec(tocdata[6]) * 60l * 75l) + - (BCDToDec(tocdata[7]) * 75l) + - (BCDToDec(tocdata[8]))) - 150; - return tm; - case mcInTime: - if (ExecSCSICmd(CDROM_SCSI_ID,readsubq,0x40,tocdata)) - return 0xFFFF2607; - tm = 0l; - memcpy(((byte *)(&tm)+1),tocdata+6,3); - tm = swap_orderl(tm); - /*tm = xConvTimeBinToBCD(tm);*/ - return tm; - } -} - -unsigned getAudioStatus(void) -{ - ExecSCSICmd(CDROM_SCSI_ID,status,0x40,tocdata); - switch (tocdata[0]) { - case 0: - case 2: return 0x10; - - case 1: - case 3: - case 4: - default: return 0; - } -} - -word xMCSearchTo(word chan, word UnitType, Long searchLoc) -{ -msf lo; - - switch ( UnitType) { - case mcInChapters: - setStopAtLeadOut(); - search[1] = getAudioStatus() | playMode; - search[9] = 0x80; - search[2] = search[3] = search[4] = 0; - search[5] = DecToBCD(searchLoc); - if (ExecSCSICmd(CDROM_SCSI_ID,search,0x40,tocdata)) - return 0x2609; - break; - case mcInFrames: - return 0x2609; - case mcInTime: - setStopAtLeadOut(); - search[1] = getAudioStatus() | playMode; - searchLoc = swap_orderl(searchLoc); - memcpy(search+2,(byte *)&searchLoc,4); - search[9] = 0x40; - if (ExecSCSICmd(CDROM_SCSI_ID,search,0x40,tocdata)) { - scsi_error(tocdata); - return 0x2609; - } - break; - default: return 0x2609; - } - return 0; -} =makefile -o/texel.a: texel.c - compile +w texel.c keep=o/texel - -o/cd150.a: cd150.c - compile +w cd150.c keep=o/cd150 - -o/nec.a: nec.c - compile +w nec.c keep=o/nec - -o/rfscsi.root: rfscsi.asm rf.mac - compile rfscsi.asm keep=o/rfscsi - -o/mediarf.root: mediarf.asm mediarf.mac - compile +w mediarf.asm keep=o/mediarf - -o/util.a: util.c types.h - compile +w util.c keep=o/util - -o/scsi.a: scsi.c types.h scsi.h - compile +w scsi.c keep=o/scsi - -RF.Texel: o/texel.a o/rfscsi.root o/mediarf.root o/scsi.a o/util.a - link o/mediarf o/texel o/util o/scsi o/rfscsi keep=RF.Texel - chtyp -t \$bb -a \$420 RF.Texel - cp RF.Texel /name1/system/drivers/media.control - -RF.CD150: o/cd150.a o/rfscsi.root o/mediarf.root o/scsi.a o/util.a - link o/mediarf o/cd150 o/util o/scsi o/rfscsi keep=RF.CD150 - chtyp -t \$bb -a \$420 RF.CD150 - cp RF.CD150 /name1/system/drivers/media.control - -RF.NEC: o/nec.a o/rfscsi.root o/mediarf.root o/scsi.a o/util.a - link o/mediarf o/nec o/util o/scsi o/rfscsi keep=RF.NEC - chtyp -t \$bb -a \$420 RF.NEC - cp RF.NEC /name1/system/drivers/media.control =mc.h -/* - * mc.h - * - * My own Media Control declarations, cuz I didn't have - * the "official" one handy! - */ - -#define mcInChapters 1 -#define mcInFrames 2 -#define mcInTime 3 - -#define mcSUnknown 0 -#define mcSDeviceType 0x0000 -#define mcSLaserDisc 1 -#define mcSCDAudio 2 -#define mcSCDLaserCD 3 -#define mcSVCR 4 -#define mcSCamCorder 5 -#define mcSPlayStatus 0x0001 -#define mcSPlaying 1 -#define mcSStill 2 -#define mcSParked 3 -#define mcSDoorStatus 0x0002 -#define mcSDoorOpen 1 -#define mcSDoorClosed 2 -#define mcSDiscType 0x0003 -#define mcS_CLV 1 -#define mcS_CAV 2 -#define mcS_CDV 3 -#define mcS_CD 4 -#define mcSDiscSize 0x0004 -#define mcSDisc3inch 3 -#define mcSDisc5inch 5 -#define mcSDisc8inch 8 -#define mcSDisc12inch 12 -#define mcSDiscSide 0x0005 -#define mcSSideOne 1 -#define mcSSideTwo 2 -#define mcSVolumeL 0x0006 -#define mcSVolumeR 0x0007 - -#define mcFTypes 0 -#define mcFStep 1 -#define mcFRecord 2 -#define mcFVideo 3 -#define mcFEject 4 -#define mcFLock 5 -#define mcFVDisplay 6 -#define mcFVOverlay 7 -#define mcFVOChars 8 -#define mcFVolume 9 - -#define AudioOff 0 -#define AudioRight 1 -#define AudioLinR 2 -#define AudioMinR 3 -#define AudioRinL 4 -#define AudioRinLR 5 -#define AudioReverse 6 -#define AudioRinLMR 7 -#define AudioLeft 8 -#define AudioStereo 9 -#define AudioLinLR 10 -#define AudioLinLMR 11 -#define AudioMinL 12 -#define AudioMinLRinR 13 -#define AudioMinLLinR 14 -#define AudioMonaural 15 - -#define mcCEject 2 -#define mcCLockDev 9 -#define mcCUnLockDev 10 - -/* MCGetTimes selector values */ - -#define mcElapsedTrack 0 -#define mcRemainTrack 1 -#define mcElapsedDisc 2 -#define mcRemainDisc 3 -#define mcTotalDisc 4 -#define mcTotalFrames 5 -#define mcTracks 6 -#define mcDiscID 7 =mediarf.asm -**************************************************************** -* -* Media Control driver for the RamFAST SCSI card -* -* mediarf.asm - interface routines to call actual C code -* Based on "AppleCDSC.aii" by Dan Hitchens, Apple Computer -* -* Copyright 1994, Sequential Systems Inc. -* -**************************************************************** - - case on - mcopy mediarf.mac - -DecBusyFlag gequ $E10068 - -DirectStack gequ 10 -DS3 gequ DirectStack+3 ; dp plus phd and phb - -DP0 gequ 0 -DP1 gequ 1 -DP2 gequ 2 - -InChapters gequ 1 -InFrames gequ 2 -InTimes gequ 3 - -UnImp gequ $2601 - -* Control values for MCControl - -mcCInit gequ 1 -mcCEject gequ 2 -mcCVideoOn gequ 3 -mcCVideoOff gequ 4 -mcCDisplayOn gequ 5 -mcCDisplayOff gequ 6 -mcCBlankVideo gequ 7 -mcCDefaultCom gequ 8 -mcCLockDev gequ 9 -mcCUnLockDev gequ 10 - -mcCIgnoreDS gequ 200 ; ignore disk switch errors -mcCReportDS gequ 201 ; report disk switches to user - -* Status values for MCGetStatus - -mcSUnknown gequ 0 ; player unable to determine status - -mcSDeviceType gequ $0000 ; device type selector -mcSLaserDisc gequ 1 -mcSCDAudio gequ 2 -mcSLaserCD gequ 3 -mcSVCR gequ 4 -mcSCamCorder gequ 5 - -mcSPlayStatus gequ $0001 ; play status selector value -mcSPlaying gequ 1 -mcSStill gequ 2 -mcSParked gequ 3 - -mcSDoorStatus gequ $0002 -mcSDoorOpen gequ 1 -mcSDoorClosed gequ 2 - -mcSDiscType gequ $0003 -mcS_CLV gequ 1 -mcS_CAV gequ 2 -mcS_CDV gequ 3 -mcS_CD gequ 4 - -mcSDiscSize gequ $0004 -mcSDisc3inch gequ 3 -mcSDisc5inch gequ 5 -mcSDisc8inch gequ 8 -mcSDisc12inch gequ 12 - -mcSDiscSide gequ $0005 -mcSSideOne gequ 1 -mcSSideTwo gequ 2 - -mcSVolumeL gequ $0006 -mcSVolumeR gequ $0007 - -* Audio values - -AudioOff gequ 0 -AudioRight gequ 1 -AudioLinR gequ 2 ; audio left in right only -AudioMinR gequ 3 ; audio mixed in right only -AudioRinL gequ 4 ; audio right in left only -AudioRinLR gequ 5 ; audio R in left and right -AudioReverse gequ 6 ; audio right in left, left in right -AudioRinLMR gequ 7 ; audio right in left, mixed in right -AudioLeft gequ 8 ; audio left channel only -AudioStereo gequ 9 ; full stereo -AudioLinLR gequ 10 ; Audio left in left and right -AudioLinLMR gequ 11 ; -AudioMinL gequ 12 -AudioMinLRinR gequ 13 -AudioMinLLinR gequ 14 -AudioMonaural gequ 15 - -* MCGetTimes values - -mcElapsedTrack gequ 0 -mcRemainTrack gequ 1 -mcElapsedDisc gequ 2 -mcRemainDisc gequ 3 -mcTotalDisc gequ 4 - -mcTotalFrames gequ 5 ; total # frames on disc -mcTracks gequ 6 ; returns first and last track #s -mcDiscID gequ 7 ; returns a disc identifier - - -RF_Texel START - dc i2'0' ; driver marker - dc i2'(EndVector-DriverVrts)/4' ; count of supported calls - - jmp EntryPoint - - dc i2'$0100' -drivername ENTRY ; this gets modified by "initname" - str 'RF/Texel ' - -DriverVrts dc a4'MCGetName' ; 0 gets driver name & version - dc a4'MCDStartUp' ; 1 starts up the driver - dc a4'MCDShutDown' ; 2 shuts down the driver - dc a4'MCGetFeatures' ; 3 gets features - dc a4'MCPlay' ; 4 play the device - dc a4'MCPause' ; 5 pause device - dc a4'MCSendRawData' ; 6 send raw data to device - dc a4'MCGetStatus' ; 7 return dev status info - dc a4'MCControl' ; 8 sets dev control info - dc a4'MCScan' ; 9 scan forward or reverse - dc a4'MCGetSpeeds' ; 10 return valid speeds - dc a4'MCSpeed' ; 11 sets speed for MCPlay - dc a4'MCStopAt' ; 12 sets stopping point - dc a4'MCJog' ; 13 jog device N units - dc a4'MCSearchTo' ; 14 search to location - dc a4'MCSearchDone' ; 15 status of if done - dc a4'MCSearchWait' ; 16 waits for search to finish - dc a4'MCGetPosition' ; 17 returns current position - dc a4'MCSetAudio' ; 18 Controls audio - dc a4'MCGetTimes' ; 19 gets disc times - dc a4'MCGetDiscTOC' ; 20 gets disc's table of contents - dc a4'MCGetDiscID' ; 21 gets disc's ID - dc a4'MCGetNoTracks' ; 22 get # of tracks - dc a4'MCRecord' ; 23 put device into record mode - dc a4'MCStop' ; 24 stops device - dc a4'MCWaitRawData' ; 25 waits for raw data - dc a4'MCSetVolume' ; 26 sets the volume -EndVector anop - -EntryPoint phd - phb - phk - plb - tsc - sec - sbc #DirectStack ; reserve 10 bytes for DP - tcs - inc a - tcd ; set DP address - jmp (DriverVrts,X) - END - -DynamicExits START -Exit20 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+25,s - lda DS3+3,s - sta DS3+23,s - lda DS3+1,s - sta DS3+21,s - tsc - clc - adc #20 - tcs - brl exit0x - -Exit16 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+21,s - lda DS3+3,s - sta DS3+19,s - lda DS3+1,s - sta DS3+17,s - tsc - clc - adc #16 - tcs - brl exit0x - -Exit14 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+19,s - lda DS3+3,s - sta DS3+17,s - lda DS3+1,s - sta DS3+15,s - tsc - clc - adc #14 - tcs - brl exit0x - -Exit12 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+17,s - lda DS3+3,s - sta DS3+15,s - lda DS3+1,s - sta DS3+13,s - tsc - clc - adc #12 - tcs - brl exit0x - -Exit10 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+15,s - lda DS3+3,s - sta DS3+13,s - lda DS3+1,s - sta DS3+11,s - tsc - clc - adc #10 - tcs - brl exit0x - -Exit8 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+13,s - lda DS3+3,s - sta DS3+11,s - lda DS3+1,s - sta DS3+9,s - pla - pla - pla - pla - brl exit0x - -Exit6 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+11,s - lda DS3+3,s - sta DS3+9,s - lda DS3+1,s - sta DS3+7,s - pla - pla - pla - brl exit0x - -Exit4 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+9,s - lda DS3+3,s - sta DS3+7,s - lda DS3+1,s - sta DS3+5,s - pla - pla - brl exit0x - -Exit2 ENTRY - tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd - lda DS3+5,s - sta DS3+7,s - lda DS3+3,s - sta DS3+5,s - lda DS3+1,s - sta DS3+3,s - pla - brl exit0x - -Exit0 tax - lda DirectStack,s - pha - plb - plb - lda DirectStack+2,s - tcd -exit0x anop - tsc - clc - adc #DS3 - tcs - txa - pha - jsl DecBusyFlag - pla - cmp #1 - rtl - END - -MCDStartUp START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -userid word -PortNamePtr long -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - jsl initname - jsl determineSCSIType - - plb - pld - lda #0 - jmp Exit8 - END - -MCDShutDown START - lda #0 - jmp Exit2 - END - -MCGetName START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -RetName long -ChannelNo word - - ph4 #DriverNamStr - lda RetName+6,s - pha - lda RetName+6,s - pha - - pea 0 - lda DriverNamStr - and #$00FF - inc a - pha - _BlockMove - - lda #0 - jmp Exit6 - -DriverNamStr ENTRY - str 'MCToolkit RF/Texel 1.0' -ConnectPort ds 37 -DriverNLen dc i2'ConnectPort-DriverNamStr-1' - END - -MCGetFeatures START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -Selector word -ChannelNo word -FeatureVal long - - tsc - phd - tcd - phb - phk - plb - pei (Selector) - pei (ChannelNo) - jsl xMCGetFeatures - sta FeatureVal - stx FeatureVal+2 - plb - pld - lda #0 - jmp Exit4 - END - -MCPlay START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (ChannelNo) - jsl xMCPlay - - plb - pld - - jmp Exit2 - END - -MCPause START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (ChannelNo) - jsl xMCPause - - plb - pld - lda #0 - jmp Exit2 - END - -MCSendRawData START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -RawData long -ChannelNo word - - lda #UnImp - jmp Exit6 - END - -MCGetStatus START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -StatusSel word -ChannelNo word -Returned word - - tsc - phd - tcd - phb - phk - plb - - pei (StatusSel) - pei (ChannelNo) - jsl xMCGetStatus - sta Returned - - plb - pld - lda #0 - jmp Exit4 - END - -MCControl START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -CtlCommand word -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (CtlCommand) - pei (ChannelNo) - jsl xMCControl - - plb - pld - jmp Exit4 - END - -MCScan START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ScanDir word -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (ScanDir) - pei (ChannelNo) - jsl xMCScan - - plb - pld - lda #0 - jmp Exit4 - END - -MCGetSpeeds START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -PStringPtr long -ChannelNo word - - lda #UnImp - jmp Exit6 - END - -MCSpeed START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -SpeedVal word -ChannelNo word - - lda #UnImp - jmp Exit4 - END - -MCStopAt START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -StopLoc long -mcUnitType word -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (StopLoc+2) - pei (StopLoc) - pei (mcUnitType) - pei (ChannelNo) - jsl xMCStopAt - - plb - pld - jmp Exit8 - END - -MCJog START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -JogRepeat word -nJog long -mcUnitType word -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (JogRepeat) - pei (nJog+2) - pei (nJog) - pei (mcUnitType) - pei (ChannelNo) - jsl xMCJog - - plb - pld - jmp Exit10 - END - -MCSearchTo START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -SearchLoc Long -mcUnitType word -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (SearchLoc+2) - pei (SearchLoc) - pei (mcUnitType) - pei (ChannelNo) - jsl xMCSearchTo - - plb - pld - lda #0 - jmp Exit10 - END - -MCSearchDone START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word -DoneStatus word - - lda #1 - sta DoneStatus,s - lda #0 - jmp Exit2 - END - -MCSearchWait START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word - - lda #0 - jmp Exit2 - END - -MCGetPosition START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -mcUnitType word -ChannelNo word -CurrPos long - - tsc - phd - tcd - phb - phk - plb - - pei (mcUnitType) - pei (ChannelNo) - jsl xMCGetPosition - sta CurrPos - stx CurrPos+2 - cpx #$FFFF ; error occur? - bne noerror - stz CurrPos - stz CurrPos+2 - - plb - pld - jmp Exit4 - -noerror plb - pld - lda #0 - jmp Exit4 - END - -MCSetAudio START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -AudioCtrl word -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (AudioCtrl) - pei (ChannelNo) - jsl xMCSetAudio - - plb - pld - jmp Exit4 - - END - -MCGetTimes START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -mcTimeSelect word -ChannelNo word -TimeInfo long - - lda #UnImp - jmp Exit4 - END - -MCGetNoTracks START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word -Tracks word - - tsc - phd - tcd - phb - phk - plb - - pei (ChannelNo) - jsl xMCGetNoTracks - sta Tracks - - plb - pld - lda #0 - jmp Exit2 - END - -MCGetDiscTOC START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -TrackNo word -ChannelNo word -TrackTOC Long - - tsc - phd - tcd - phb - phk - plb - - pei (TrackNo) - pei (ChannelNo) - jsl xMCGetDiscTOC - sta TrackTOC - stx TrackTOC+2 - - plb - pld - lda #0 - jmp Exit4 - END - -MCGetDiscID START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word -DiscID long - - tsc - phd - tcd - phb - phk - plb - - pei (ChannelNo) - jsl xMCGetDiscID - cpx #$FFFF - beq err - sta DiscID - stx DiscID+2 - - lda #0 -err plb - pld - jmp Exit2 - END - -MCRecord START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word - - lda #UnImp - jmp Exit2 - END - -MCStop START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -ChannelNo word - - tsc - phd - tcd - phb - phk - plb - - pei (ChannelNo) - jsl xMCStop - - plb - pld - - jmp Exit2 - END - -MCWaitRawData START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -Term_Mask word -TickWait word -GSOSString long -ChannelNo word - - lda GSOSString,s - sta DP0 - lda GSOSString+2,s - sta DP2 - lda #0 - ldy #2 - sta [DP0],y ; set xfer count into GS/OS string - lda #UnImp - jmp Exit8 - END - -MCSetVolume START - DefineStack -ZPBlock block DirectStack -OrigB byte -OrigD word -RTL1 block 3 -RTL2 block 3 -RightVolume word -LeftVolume word -ChannelNo word - - lda #UnImp - jmp Exit6 - END =mediarf.mac - MACRO -&lab str &string -&lab dc i1'L:&string',C'&string' - MEND - MACRO -&lab _BlockMove -&lab ldx #$2B02 - jsl $E10000 - MEND - macro -&l ph4 &n1 - aif "&n1"="*",.f - lclc &c -&l anop -&c amid &n1,1,1 - aif "&c"="#",.d - aif s:longa=1,.a - rep #%00100000 -.a - aif "&c"<>"{",.b -&c amid &n1,l:&n1,1 - aif "&c"<>"}",.g -&n1 amid &n1,2,l:&n1-2 - ldy #2 - lda (&n1),y - pha - lda (&n1) - pha - ago .e -.b - aif "&c"<>"[",.c - ldy #2 - lda &n1,y - pha - lda &n1 - pha - ago .e -.c - aif "&c"<>"<",.c1 -&n1 amid &n1,2,l:&n1-1 - pei &n1+2 - pei &n1 - ago .e -.c1 - lda &n1+2 - pha - lda &n1 - pha - ago .e -.d -&n1 amid &n1,2,l:&n1-1 - pea +(&n1)|-16 - pea &n1 - ago .f -.e - aif s:longa=1,.f - sep #%00100000 -.f - mexit -.g - mnote "Missing closing '}'",16 - mend - MACRO - DefineStack - GBLA &DummyPC -&DummyPC SETA 1 - MEND - MACRO -&lab BYTE -&lab equ &DummyPC -&DummyPC SETA &DummyPC+1 - MEND - MACRO -&lab WORD -&lab equ &DummyPC -&DummyPC SETA &DummyPC+2 - MEXIT - MEND - MACRO -&lab LONG -&lab equ &DummyPC -&DummyPC SETA &DummyPC+4 - MEND - MACRO -&lab BLOCK &Value - AIF C:&lab=0,.skiplab -&lab equ &DummyPC -.skiplab -&DummyPC SETA &DummyPC+&Value - MEND =nec.c -/* - * NEC.c - * - * Media Control Driver (main code) for the RamFAST SCSI Card - * By Jawaid Bazyar - * Copyright 1994, Sequential Systems Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include "mc.h" - -#pragma noroot -#pragma lint -1 - -#include "scsi.h" -#include "types.h" - -word xMCSearchTo(word chan, word UnitType, Long searchLoc); -unsigned long xMCGetPosition(word, word); -unsigned getAudioStatus(word); - -#pragma optimize 9 - -byte outdata[0x40]; -byte tocdata[0x40]; -byte gettoc[] = {0xDE,0,0,0,0,0,0,0,0,0}; -byte pause[] = {0xDA,0,0,0,0,0,0,0,0,0}; -byte search[] = {0xD8,0,0,0,0,0,0,0,0,0}; -byte getst[] = {0xDD,10,0,0,0,0,0,0,0,0}; -byte prevallow[] = {0x1E,0,0,0,0,0}; -byte startstop[] = {0x1B,0,0,0,0x2,0}; -byte readsubq[] = {0xDD,10,0,0,0,0,0,0,0,0}; -byte play[] = {0xD9,0,0,0,0,0,0,0,0,0}; -byte stop[] = {0xD9,0,0,0,0,0,0,0,0,0}; -byte status[] = {0xDD,0,0,0,0,0,0,0,6,0}; -byte scan[] = {0xCD,0,0,0,0,0,0,0,0,0x40}; -byte capacity[] = {0x25,0,0,0,0,0,0,0,0,0}; - -byte stopaddr[3]; - -unsigned playMode = 3; -unsigned stopFlag = 2; -unsigned didSearchTo = 0; - -/* -------------------------------------------------------------------- - - Routines to handle Media Control driver commands - - -------------------------------------------------------------------- */ - -void initname(void) -{ -extern char DriverNamStr[]; -static char dn[] = "\pMCToolkit RF/NEC 1.0"; - - memcpy(DriverNamStr,dn,dn[0]); -} - -void setStopAtLeadOut(word chan) -{ - gettoc[1] = 0x1; - gettoc[2] = 0; - ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x40,tocdata); - memcpy(stop+2,tocdata,3); - if (stop[4]) stop[4] = DecToBCD(BCDToDec(stop[4])-1); - else { - stop[4] = 0x73; - if (stop[3]) stop[3] = DecToBCD(BCDToDec(stop[3])-1); - else { - stop[3] = 0x59; - stop[2] = DecToBCD(BCDToDec(stop[2])-1); - } - } - stop[9] = 0x40; - if (getAudioStatus(chan)) { - ExecSCSICmd(CDROM_SCSI_ID,stop,0x10,tocdata); - } - memcpy(stopaddr,stop+2,3); - stopFlag = 0; -} - -Long xMCGetFeatures(word mcChannelNo, word mcFeatSet) -{ - switch (mcFeatSet) { - case mcFTypes: return 7l; - case mcFStep: return 0l; - case mcFRecord: return 0l; - case mcFVideo: return 0l; - case mcFEject: return 1l; - case mcFLock: return 1l; - case mcFVDisplay: return 0l; - case mcFVOverlay: return 0l; - case mcFVOChars: return 0l; - case mcFVolume: return 0l; - default: return 0xFFFF2609l; - } -} - -unsigned long start_lba; - -unsigned xMCGetNoTracks(word chan) -{ - gettoc[2] = 0; - gettoc[1] = 0; - if (ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x6,tocdata)) { - scsi_error(tocdata); - return 0xFFFFFFFF; - } - return tocdata[1]; -} - -unsigned long xMCGetDiscID(word mcChannelNo) -{ -unsigned long ll; - - if (ExecSCSICmd(CDROM_SCSI_ID,capacity,0x8,tocdata)) { - return 0xFFFF2609; - } - memcpy(&ll,capacity,4); - ll = swap_orderl(ll); - return ll; -} - -unsigned long xMCGetDiscTOC(word chan,word track) -{ -unsigned long lba; - - gettoc[1] = 0x2; - gettoc[2] = track; - if (ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x40,tocdata)) { - scsi_error(tocdata); - return 0xFFFF2609; - } - tocdata[3] = 0; - lba = *((long*)(tocdata)); - lba = swap_orderl(lba)/* - start_lba*/; - return lba; -} - -word xMCPlay(word chan) -{ -unsigned long ll; - if (stopFlag == 1) stopFlag ++; - else if (stopFlag == 2) { - setStopAtLeadOut(chan); - } - memcpy(play+2,stopaddr,3); - play[9] = 0x40; - play[1] = playMode; - if (!didSearchTo) - xMCSearchTo(chan,mcInChapters,1); - if (ExecSCSICmd(CDROM_SCSI_ID,play,0x40,tocdata)) - return 0x2609; - else return 0; -} - -void xMCPause(word chan) -{ - ExecSCSICmd(CDROM_SCSI_ID,pause,0x40,tocdata); -} - -/* Unimplemented */ -void xMCSendRawData(word chan, void *data) -{ -} - -word xMCGetStatus(word mcChannelNo, word mcStatusSel) -{ - switch (mcStatusSel) { - case mcSDeviceType: - return mcSCDAudio; - case mcSPlayStatus: - ExecSCSICmd(CDROM_SCSI_ID,getst,0x9,tocdata); - if (tocdata[0] == 0) return mcSPlaying; - else return mcSStill; - case mcSDoorStatus: - return mcSUnknown; - } -} - -word xMCControl(word mcChannelNo, word ctlCommand) -{ - switch (ctlCommand) { - case mcCEject: - startstop[4] = 0x2; - ExecSCSICmd(CDROM_SCSI_ID,startstop,6,tocdata); - break; - case mcCLockDev: - prevallow[4] = 1; - ExecSCSICmd(CDROM_SCSI_ID,prevallow,0x40,tocdata); - break; - case mcCUnLockDev: - prevallow[4] = 0; - ExecSCSICmd(CDROM_SCSI_ID,prevallow,0x40,tocdata); - break; - default: return 0x2601; - } - return 0; -} - -void xMCScan(word mcChannelNo, int mcDirection) -{ -unsigned long ll; - - ll = xMCGetPosition(mcChannelNo,mcInTime); - ll = swap_orderl(ll); - memcpy(scan+3,((byte *)&ll)+1,3); - - if (mcDirection > 0) { /* scan forward */ - scan[1] = 0; - } else { /* scan backward */ - scan[1] = 0x10; - } - ExecSCSICmd(CDROM_SCSI_ID,scan,0x10,tocdata); -} - -void xMCGetSpeeds(word mcChannelNo, char *pStrPtr) -{ - strcpy(pStrPtr,"\p150"); -} - -void xMCSpeed(word mcChannelNo, word mcFPS) -{ -} - -unsigned xMCStopAt(word mcChannelNo, word mcUnitType, unsigned long mcStopLoc) -{ -unsigned long ll; - - switch (mcUnitType) { - case mcInTime: - ll = swap_orderl(mcStopLoc); - memcpy(stop+2,((byte *)&ll)+1,3); - stop[1] = 0; - stop[9] = 0x40; - memcpy(stopaddr,stop+2,3); - if (ExecSCSICmd(CDROM_SCSI_ID,stop,0x10,tocdata)) - return 0x2609; - break; - } - stopFlag = 1; - return 0; -} - -unsigned xMCStop(word mcChannelNo) -{ - stopFlag = 2; /* make sure we reset stop to end of disc */ - xMCSearchTo(mcChannelNo,mcInChapters,1); - setStopAtLeadOut(mcChannelNo); - startstop[4] = 0; - xMCPause(mcChannelNo); - didSearchTo = 0; - if (ExecSCSICmd(CDROM_SCSI_ID,startstop,0x40,tocdata)) return 0x2609; - else return 0; -} - -word xMCSetAudio(word mcChannelNo, word mcAudioCtl) -{ -unsigned long ll; - - playMode = 0; - if (mcAudioCtl & 0x3) playMode |= 0x2; - if (mcAudioCtl & 0xC) playMode |= 0x1; - play[1] = playMode; - play[9] = 0xC0; - if (getAudioStatus(mcChannelNo)) - if (ExecSCSICmd(CDROM_SCSI_ID,play,0x10,tocdata)) - return 0x2607; - return 0; -} - -word xMCJog(word mcChannelNo, word mcUnitType, long mcNJog, int mcJogRepeat) -{ -long track; -unsigned err; - - switch (mcUnitType) { - case mcInFrames: return 0x2601; - case mcInChapters: - ExecSCSICmd(CDROM_SCSI_ID,readsubq,9,tocdata); - if (mcJogRepeat < 0) { - mcJogRepeat = 0 - mcJogRepeat; - mcNJog = 0 - mcNJog; - } - track = BCDToDec(tocdata[2]); - if (mcNJog < 0) { - if ((tocdata[4] != 0) || (tocdata[5] >1)) track++; - } - for (; mcJogRepeat != 0; mcJogRepeat--) { - if (err = xMCSearchTo(mcChannelNo, mcInChapters, track+= mcNJog)) { - SysBeep(); - return err; - } - } - return 0; - default: return 0x2601; - } -} - -unsigned long xMCGetTimes(word mcChannelNo, word mcTimesSel) -{ -unsigned long tm; - - switch (mcTimesSel) { - case mcElapsedTrack: - ExecSCSICmd(CDROM_SCSI_ID,readsubq,0x9,tocdata); - tm = 0l; - memcpy(((byte *)(&tm)+1),tocdata+4,3); - tm = swap_orderl(tm); - return tm; - - case mcRemainTrack: - return -1; - case mcElapsedDisc: - return xMCGetPosition(mcChannelNo,mcInTime); - - case mcRemainDisc: - - case mcTotalDisc: - - case mcTotalFrames: - - return -1; - case mcTracks: - gettoc[2] = 0; - gettoc[0] = 4; - gettoc[1] = 0; - ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x4,tocdata); - return (tocdata[1] << 16) | tocdata[0]; - - default: - return -1; - } -} - -unsigned long xMCGetPosition(word mcChannelNo, word mcUnitType) -{ -unsigned long tm; - - if (ExecSCSICmd(CDROM_SCSI_ID,readsubq,9,tocdata)) - return 0xFFFF2607; - - switch (mcUnitType) { - case mcInChapters: - return BCDToDec(tocdata[2]); - case mcInFrames: - tm = ((BCDToDec(tocdata[6]) * 60l * 75l) + - (BCDToDec(tocdata[7]) * 75l) + - (BCDToDec(tocdata[8]))) - 150; - return tm; - case mcInTime: - if (ExecSCSICmd(CDROM_SCSI_ID,readsubq,0x40,tocdata)) - return 0xFFFF2607; - tm = 0l; - memcpy(((byte *)(&tm)+1),tocdata+7,3); - tm = swap_orderl(tm); - /*tm = xConvTimeBinToBCD(tm);*/ - return tm; - } -} - -unsigned getAudioStatus(word mcChannelNo) -{ -unsigned x = xMCGetStatus(mcChannelNo,mcSPlayStatus); - - if (x == mcSPlaying) return 0x10; - else return 0x00; -} - -word xMCSearchTo(word chan, word UnitType, Long searchLoc) -{ -msf lo; - - switch ( UnitType) { - case mcInChapters: - setStopAtLeadOut(chan); - search[1] = getAudioStatus(chan) >> 4; - search[9] = 0x80; - search[3] = search[4] = search[5] = 0; - search[2] = DecToBCD(searchLoc); - didSearchTo = 1; - if (ExecSCSICmd(CDROM_SCSI_ID,search,0x40,tocdata)) - return 0x2609; - break; - case mcInFrames: - return 0x2609; - case mcInTime: - setStopAtLeadOut(chan); - search[1] = getAudioStatus(chan) >> 4; - searchLoc = swap_orderl(searchLoc); - memcpy(search+2,((byte *)&searchLoc)+1,4); - search[9] = 0x40; - didSearchTo = 1; - if (ExecSCSICmd(CDROM_SCSI_ID,search,0x40,tocdata)) { - scsi_error(tocdata); - return 0x2609; - } - break; - default: break; - } - didSearchTo = 1; - return 0; -} =rf.mac - macro -&l ret &r -&l anop - lclc &len - aif c:&r,.a - lclc &r -&r setc 0 -&len setc 0 - ago .h -.a -&len amid &r,2,1 - aif "&len"=":",.b -&len amid &r,1,2 -&r amid &r,4,l:&r-3 - ago .c -.b -&len amid &r,1,1 -&r amid &r,3,l:&r-2 -.c - aif &len<>2,.d - ldy &r - ago .h -.d - aif &len<>4,.e - ldx &r+2 - ldy &r - ago .h -.e - aif &len<>10,.g - ldy #&r - ldx #^&r - ago .h -.g - mnote 'Not a valid return length',16 - mexit -.h - aif &totallen=0,.i - lda &worklen+2 - sta &worklen+&totallen+2 - lda &worklen+1 - sta &worklen+&totallen+1 -.i - pld - tsc - clc - adc #&worklen+&totallen - tcs - aif &len=0,.j - tya -.j - rtl - mend - macro -&l sub &parms,&work -&l anop - aif c:&work,.a - lclc &work -&work setc 0 -.a - gbla &totallen - gbla &worklen -&worklen seta &work -&totallen seta 0 - aif c:&parms=0,.e - lclc &len - lclc &p - lcla &i -&i seta c:&parms -.b -&p setc &parms(&i) -&len amid &p,2,1 - aif "&len"=":",.c -&len amid &p,1,2 -&p amid &p,4,l:&p-3 - ago .d -.c -&len amid &p,1,1 -&p amid &p,3,l:&p-2 -.d -&p equ &totallen+4+&work -&totallen seta &totallen+&len -&i seta &i-1 - aif &i,^b -.e - tsc - aif &work=0,.f - sec - sbc #&work - tcs -.f - phd - tcd - mend - macro -&l long &a,&b - lclb &i - lclb &m -&a amid &a,1,1 -&m setb ("&a"="M").or.("&a"="m") -&i setb ("&a"="I").or.("&a"="i") - aif c:&b=0,.a -&b amid &b,1,1 -&m setb ("&b"="M").or.("&b"="m").or.&m -&i setb ("&b"="I").or.("&b"="i").or.&i -.a -&l rep #&m*32+&i*16 - aif .not.&m,.b - longa on -.b - aif .not.&i,.c - longi on -.c - mend - macro -&l short &a,&b - lclb &i - lclb &m -&a amid &a,1,1 -&m setb ("&a"="M").or.("&a"="m") -&i setb ("&a"="I").or.("&a"="i") - aif c:&b=0,.a -&b amid &b,1,1 -&m setb ("&b"="M").or.("&b"="m").or.&m -&i setb ("&b"="I").or.("&b"="i").or.&i -.a -&l sep #&m*32+&i*16 - aif .not.&m,.b - longa off -.b - aif .not.&i,.c - longi off -.c - mend =rfscsi.asm -* -* Notes: This _may_ not work if DMA is disabled on a RamFAST. Verify. -* - - case on - mcopy rf.mac - -COMMAND_PORT gequ $E1C080 -STATUS_PORT gequ $E1C082 -STORE_DATA_PORT gequ $E1C084 -READ_DATA_PORT gequ $E1C086 - -SPEED_REG gequ $E1C036 -DMA_BANK gequ $E1C037 - -SMART_PORT_END gequ 9 - -SET_DMA_BANK_COMMAND gequ $92 -FATAL_ERRORS gequ $F0 - -GetSCSI_ID START - -res equ 1 - - sub (2:unit_num),2 - - pea SCParms|-16 - pea SCParms - pea 0 ; SmartPort STATUS call - jsl DoRFSmart - cmp #0 - beq noerror - lda #-1 - sta res - bra gohome - -noerror lda unit_num - dec a - asl a - asl a - asl a - asl a - tax - lda stlist_ptr+$44,x - and #$FF - sta res -gohome ret 2:res - -SCParms dc i1'3' ; parameter count - dc i1'$80' ; SCSI unit number (unused) - dc a2'stlist_ptr' - dc i1'0' ; status code - dc i1'0' unused - dc 3i1'0' unused - -stlist_ptr ds 256 - - END - - -ExecSCSICmd START - -res equ 1 - - sub (4:outptr,2:outcnt,4:cmd,2:scid),2 - - phb - phk - plb - - short m - lda scid - ora #$80 - sta SCidplus80 - long m - - ldy #10 -lp1 lda [cmd],y - sta SCCommand,y - dey - dey - bpl lp1 - - pea SCParms|-16 - pea SCParms - pea 8 ; send SCSI command - jsl DoRFSmart - sta res - - cmp #0 - beq noerror - phy -; txy ; only ever transfer outcnt bytes!! - ldy outcnt - beq x123 - short m - dey -lp9 lda sensedata,y - sta [outptr],y - dey - bpl lp9 - long m - ply - bra x123 - -noerror ldy outcnt - beq done - dey - short m -lp2 lda XBuf,y - sta [outptr],y - dey - bpl lp2 -x123 long m -done anop - plb - ret 2:res - -SCParms dc i1'$04' -SCidplus80 dc i1'$82' - dc a2'SCCommand' - dc i1'$FF' - dc i2'$40' - dc a2'XBuf' - -SCCommand dc i1'$D8,$01,$02,0,0,0,0,0,0,$80,0,0' -sensedata ds 32 -XBuf ds 64 - END - -; SCSI WRITE data command -ExecSCSIWCmd START - -res equ 1 - - sub (4:sense,4:inptr,2:incnt,4:cmd,2:scid),2 - - phb - phk - plb - - short m - lda scid - ora #$80 - sta SCidplus80 - long m - - ldy incnt - sta xmitcnt - beq done - dey - short m -lp2 lda [inptr],y - sta XBuf,y - dey - bpl lp2 - long m -done anop - - ldy #10 -lp1 lda [cmd],y - sta SCCommand,y - dey - dey - bpl lp1 - - pea SCParms|-16 - pea SCParms - pea 9 ; send SCSI command - jsl DoRFSmart - sta res - - cmp #0 - beq noerror - phy -; txy - ldy #$20 -lp9 lda sensedata,y - sta [sense],y - dey - bpl lp9 - ply - long m -noerror plb - ret 2:res - -SCParms dc i1'$04' -SCidplus80 dc i1'$82' - dc a2'SCCommand' - dc i1'$FF' -xmitcnt dc i2'$40' - dc a2'XBuf' - -SCCommand dc i1'$D8,$01,$02,0,0,0,0,0,0,$80,0,0' -sensedata ds 32 -XBuf ds 64 - END - - -* The destination of the data MUST be in the same bank as the command -* block, for now at least - -DoRFSmart PRIVATE -errornum equ 1 -addr_low equ 3 -num_blocks equ 7 - - sub (4:cmdptr,2:cmdnum),8 - - php - sei - - lda #0 ; clear high byte - stz errornum ; clear high byte - short m,i - - ldx |SLOT8 - lda cmdnum ; Send SCSI Command Packet - ora #$10 - sta COMMAND_PORT,X ; - lda STATUS_PORT,X - beq okay - - lda #1 ; indicates IIGS, == 0 is IIe - sta STORE_DATA_PORT,X - lda |SLOT8 - sta STORE_DATA_PORT,X - -okay txa - sta STORE_DATA_PORT,X - ldy #1 -loop1 lda [cmdptr],y - sta STORE_DATA_PORT,X - iny - cpy #SMART_PORT_END - bne loop1 - - ldy #SPEED_REG let terry do a cache lookup - phy - ply - ldy #SPEED_REG - phy - ply - - lda >SPEED_REG - pha - and #$7F - sta >SPEED_REG - lda cmdptr+2 - sta >DMA_BANK - - lda STATUS_PORT,X ; do the DMA! - - lda STATUS_PORT,X - bmi vector_on_it -exit sta errornum - pla - sta >SPEED_REG - long m,i - plp - ret 2:errornum - - longa off - longi off - -validerr asl a - tay - lda jmp_table+1,y - pha - lda jmp_table,y - pha - rts - -error_handler lda STATUS_PORT,X - bmi vector_on_it - jmp get_out -vector_on_it cmp #FATAL_ERRORS - bcc not_fatal - brk $FF -not_fatal cmp #SET_DMA_BANK_COMMAND+1 - bcc validerr - brk $FE - -jmp_table dc a2'get_blk_cmd-1' ; $80 - dc a2'put_blk_cmd-1' ; $81 - dc a2'get_bytes_cmd-1' ; $82 - dc a2'put_bytes_cmd-1' ; $83 - dc a2'getxy_cmd-1' ; $84 - dc a2'bootdone-1' ; $85 - dc a2'inc_dma_reg-1' ; $86 - dc a2'error_handler-1' ; $87 - dc a2'error_handler-1' ; $88 - dc a2'error_handler-1' ; $89 - dc a2'out_of_sync-1' ; $8A - dc a2'error_handler-1' ; $8B - dc a2'error_handler-1' ; $8C - dc a2'error_handler-1' ; $8D - dc a2'fatal_boot-1' ; $8E - dc a2'go_away-1' ; $8F - dc a2'error_handler-1' ; $90 (disk switched) - dc a2'get_garbage-1' ; $91 - dc a2'set_dma_bank-1' ; $92 - -getxy_cmd anop - lda READ_DATA_PORT,X - pha - lda READ_DATA_PORT,X - tay - lda READ_DATA_PORT,X - plx - jmp get_out - -inc_dma_reg anop - lda >DMA_BANK - inc a - sta >DMA_BANK - jmp error_handler -get_blk_cmd anop - lda >READ_DATA_PORT,X - sta addr_low - lda >READ_DATA_PORT,X - sta addr_low+1 - lda >READ_DATA_PORT,X ;throw away the high byte - lda cmdptr+2 ; and use the command pointer - sta addr_low+2 ; bank address instead - - lda >READ_DATA_PORT,X - sta num_blocks - ldy #0 -gbc_loop lda >READ_DATA_PORT,X - sta [addr_low],y - iny - bne gbc_loop - inc addr_low+1 - dec num_blocks - bne gbc_loop - jmp error_handler - - brk $80 -put_blk_cmd anop - brk $81 -get_bytes_cmd anop - brk $82 -put_bytes_cmd anop - lda READ_DATA_PORT,X - sta addr_low - lda READ_DATA_PORT,X - sta addr_low+1 - lda READ_DATA_PORT,X ; drew says to throw it away, I'm not sure... - lda READ_DATA_PORT,X - sta num_blocks - lda READ_DATA_PORT,X - sta num_blocks+1 - beq done_pbc_pages -loop_pbc lda [addr_low],y - sta STORE_DATA_PORT,X - iny - bne loop_pbc - inc addr_low+1 - dec num_blocks+1 - bne loop_pbc -done_pbc_pages anop -loop2_pbc lda [addr_low],y - sta STORE_DATA_PORT,X - iny - dec num_blocks - bne loop2_pbc - jmp error_handler - -bootdone anop - brk $85 -set_dma_bank anop - lda STATUS_PORT,X - sta >DMA_BANK - jmp error_handler -get_garbage anop - lda STATUS_PORT,X - jmp error_handler -out_of_sync anop - brk $8A -fatal_boot anop - brk $8E - -go_away anop - cli - ldy #10 -lp1234 dey - bne lp1234 - sei - lda READ_DATA_PORT,X - jmp error_handler - -get_out anop - jmp exit - - END - =scsi.c -/* Figures out various information about the RamFAST; what slot it's - in, what ID the CD-ROM is, etc. */ - -#include -#include -#include -#include "scsi.h" -#include "types.h" - -#pragma noroot -#pragma lint -1 -#pragma optimize 9 - -unsigned IDarray[] = {0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40}; -unsigned SLOT8, - SCSIType, - SCSISlot, - CDROM_SCSI_ID, - CD_ROM_TYPE, - CDROM_DEVNUM; - -int GetSCSIDeviceType(unsigned id) -{ -static byte inquiry[] = {0x12,0,0,0,0x3b,0}; -static byte inq_data[0x40]; - - ExecSCSICmd(id,inquiry,0x3b,inq_data); - return (inq_data[0] & 0xF); -} - -void RFSetCDROMType(void) -{ -static byte inquiry[] = {0x12,0,0,0,0x40,0}; -static byte inq_data[0x40]; - - ExecSCSICmd(CDROM_SCSI_ID,inquiry,0x40,inq_data); - if ((inq_data[3] & 7) == 2) CD_ROM_TYPE = SCSI_II; - else if ((!strncmp(inq_data+8,"TEXEL",5)) || - (!strncmp(inq_data+8,"ShinaKen",8))) - CD_ROM_TYPE = TEXEL; - else if (!strncmp(inq_data+8,"NEC",3)) - CD_ROM_TYPE = NEC; - else if (!strncmp(inq_data+8,"APPLE",5)) - CD_ROM_TYPE = APPLE_CD150; -} - -int determineSCSIType(void) -{ -unsigned i,tmp; - - SCSISlot = 7; /* hard code it for now */ - SLOT8 = SCSISlot * 0x10; - - SCSIType = SCSI_RAMFAST; - for (i = 0; i < 8; i++) { - /*printf("checking ID: %d\n",i);*/ - tmp = GetSCSIDeviceType(i); - if (tmp == 5) break; - } - if (i == 8) { - SysBeep(); - return -1; - } - CDROM_SCSI_ID = i; - RFSetCDROMType(); - return i; -} - -void scsi_error(byte *x) -{ -} =scsi.h -/* - * scsi.h - * - * various definitions and declarations for the RamFAST SCSI - * access code in rfscsi.asm - */ - -#define NEC 1 -#define TEXEL 2 -#define APPLE_CD150 3 -#define SCSI_II 4 - -#define SCSI_APPLE 0 -#define SCSI_RAMFAST 1 - -int ExecSCSICmd(int,void *,unsigned,void *); -int ExecSCSIWCmd(int, void *, unsigned, void *, void *); -void scsi_error(byte *); - -extern unsigned SLOT8, - SCSIType, - SCSISlot, - CDROM_SCSI_ID, - CD_ROM_TYPE, - CDROM_DEVNUM; =texel.c -/* - * texel.c - * - * Media Control Driver (main code) for the RamFAST SCSI Card - * By Jawaid Bazyar - * Copyright 1994, Sequential Systems Inc. - */ - -#include -#include -#include -#include -#include -#include -#include -#include -#include "mc.h" - -#pragma noroot -#pragma lint -1 - -#include "scsi.h" -#include "types.h" - -int xMCSearchTo(word chan, word UnitType, Long searchLoc); - -#pragma optimize 9 - -byte outdata[32]; -byte tocdata[0x40]; -byte gettoc[] = {0xC1,0,0,0,0,1,0,0,10,0}; -byte pause[] = {0xC5, 0x10, 0,0,0,0,0,0,0,0}; -byte play[] = {0xC7, 0,0,0,0,0,99,59,74,0}; -byte playtrack[] = {0xC6, 0,0,0,0,0,0,0,0xFF,0}; -static byte getst[] = {0xC4,0,0,0,0,0,0,0,0x40,0}; -byte prevallow[] = {0x1E, 0,0,0,0,0}; -byte startstop[] = {0x1B, 0,0,0,0x2,0}; -byte audioctl[] = {0xC9,0,0,0,0,0,0,18,0,0}; -byte audiodat[] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; -byte readsubq[] = {0xC2,0,0x40,0,0,0,0,0,0x40,0}; -byte capacity[] = {0x25,0,0,0,0,0,0,0,0,0}; - - -/* -------------------------------------------------------------------- - - Routines to handle Media Control driver commands - - -------------------------------------------------------------------- */ - -void initname(void) -{ -extern char DriverNamStr[]; -static char dn[] = "\pMCToolkit RF/Texel 1.0"; - - memcpy(DriverNamStr,dn,dn[0]); -} - -Long xMCGetFeatures(word mcChannelNo, word mcFeatSet) -{ - switch (mcFeatSet) { - case mcFTypes: return 7l; - case mcFStep: return 0l; - case mcFRecord: return 0l; - case mcFVideo: return 0l; - case mcFEject: return 1l; - case mcFLock: return 1l; - case mcFVDisplay: return 0l; - case mcFVOverlay: return 0l; - case mcFVOChars: return 0l; - case mcFVolume: return 0l; - default: return 0xFFFF2609l; - } -} - -unsigned long start_lba; - -unsigned xMCGetNoTracks(word chan) -{ - gettoc[5] = 1; - if (ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x40,tocdata)) { - scsi_error(tocdata); - return 0xFFFFFFFF; - } - return gettoc[3]; -} - -unsigned long xMCGetDiscID(word mcChannelNo) -{ -unsigned long ll; - - if (ExecSCSICmd(CDROM_SCSI_ID,capacity,0x8,tocdata)) { - return 0xFFFF2609; - } - memcpy(&ll,capacity,4); - ll = swap_orderl(ll); - return ll; -} - -unsigned long xMCGetDiscTOC(word chan,word track) -{ -unsigned long lba; - - gettoc[5] = track; - if (ExecSCSICmd(CDROM_SCSI_ID,gettoc,0x40,tocdata)) { - scsi_error(tocdata); - return 0xFFFFFFFF; - } - lba = *((long*)(tocdata+6)); - lba = swap_orderl(lba)/* - start_lba*/; - return xConvTimeBinToBCD(lba); -} - -word xMCPlay(word chan) -{ - pause[1] = 0; - if (ExecSCSICmd(CDROM_SCSI_ID,pause,0x40,tocdata)) - return 0x2609; - else return 0; -} - -void xMCPause(word chan) -{ - pause[1] = 0x10; - ExecSCSICmd(CDROM_SCSI_ID,pause,0x40,tocdata); -} - -/* Unimplemented */ -void xMCSendRawData(word chan, void *data) -{ -} - -word xMCGetStatus(word mcChannelNo, word mcStatusSel) -{ - switch (mcStatusSel) { - case mcSDeviceType: - return mcSCDAudio; - case mcSPlayStatus: - if (ExecSCSICmd(CDROM_SCSI_ID,getst,0x40,tocdata)) - return mcSParked; - if (tocdata[5] == 0) return mcSPlaying; - if (tocdata[5] == 1) return mcSStill; - return mcSUnknown; - case mcSDoorStatus: - return mcSUnknown; - } -} - -word xMCControl(word mcChannelNo, word ctlCommand) -{ - switch (ctlCommand) { - case mcCEject: - startstop[4] = 0x2; - ExecSCSICmd(CDROM_SCSI_ID,startstop,0x40,tocdata); - break; - case mcCLockDev: - prevallow[4] = 1; - ExecSCSICmd(CDROM_SCSI_ID,prevallow,0x40,tocdata); - break; - case mcCUnLockDev: - prevallow[4] = 0; - ExecSCSICmd(CDROM_SCSI_ID,prevallow,0x40,tocdata); - break; - default: return 0x2601; - } - return 0; -} - -void xMCScan(word mcChannelNo, word mcDirection) -{ -} - -void xMCGetSpeeds(word mcChannelNo, char *pStrPtr) -{ - strcpy(pStrPtr,"\p150"); -} - -void xMCSpeed(word mcChannelNo, word mcFPS) -{ -} - -void xMCStopAt(word mcChannelNo, word mcUnitType, unsigned long mcStopLoc) -{ -} - -word xMCStop(word mcChannelNo) -{ - xMCSearchTo(mcChannelNo,mcInChapters,1); - startstop[4] = 0; - if (ExecSCSICmd(CDROM_SCSI_ID,startstop,0x40,tocdata)) - return 0x2609; - else return 0; -} - -#define MUTED 0x0 -#define RIGHT 0x1 /* Left */ -#define LEFT 0x2 /* Right */ - -word xMCSetAudio(word mcChannelNo, word mcAudioCtl) -{ -word ctl_right,ctl_left; - - switch (mcAudioCtl) { - case AudioOff: - ctl_left = MUTED; - ctl_right = MUTED; break; - case AudioRight: - ctl_left = MUTED; - ctl_right = RIGHT; break; - case AudioLinR: - ctl_left = MUTED; - ctl_right = LEFT; break; - case AudioMinR: - ctl_left = MUTED; - ctl_right = LEFT|RIGHT; break; - case AudioRinL: - ctl_left = RIGHT; - ctl_right = MUTED; break; - case AudioRinLR: - ctl_left = RIGHT; - ctl_right = RIGHT; break; - case AudioReverse: - ctl_left = RIGHT; - ctl_right = LEFT; break; - case AudioRinLMR: - ctl_left = RIGHT; - ctl_right = LEFT|RIGHT; break; - case AudioLeft: - ctl_left = LEFT; - ctl_right = MUTED; break; - case AudioStereo: - ctl_left = LEFT; - ctl_right = RIGHT; break; - case AudioLinLR: - ctl_left = LEFT; - ctl_right = LEFT; break; - case AudioLinLMR: - ctl_left = LEFT; - ctl_right = LEFT|RIGHT; break; - case AudioMinL: - ctl_left = LEFT|RIGHT; - ctl_right = MUTED; break; - case AudioMinLRinR: - ctl_left = LEFT|RIGHT; - ctl_right = RIGHT; break; - case AudioMinLLinR: - ctl_left = LEFT|RIGHT; - ctl_right = LEFT; break; - case AudioMonaural: - ctl_left = LEFT|RIGHT; - ctl_right = LEFT|RIGHT; - default: return 0x2601; - } - audiodat[10] = ctl_left; - audiodat[11] = 0xFF; - audiodat[12] = ctl_right; - audiodat[13] = 0xFF; - - if (ExecSCSIWCmd(CDROM_SCSI_ID,audioctl,18,audiodat,tocdata)) - return 0x2607; - return 0; -} - -word xMCJog(word mcChannelNo, word mcUnitType, long mcNJog, int mcJogRepeat) -{ -long track; -unsigned err; - - switch (mcUnitType) { - case mcInFrames: return 0x2601; - case mcInChapters: - if (ExecSCSICmd(CDROM_SCSI_ID,readsubq,0x40,tocdata)) - return 0x2609; - if (mcJogRepeat < 0) { - mcJogRepeat = 0 - mcJogRepeat; - mcNJog = 0 - mcNJog; - } - track = tocdata[1]; - if (mcNJog < 0) { - if ((tocdata[3] != 0) || (tocdata[4] >1)) track++; - } - for (; mcJogRepeat != 0; mcJogRepeat--) { - if (err = xMCSearchTo(mcChannelNo, mcInChapters, track+= mcNJog)) - return err; - } - return 0; - default: return 0x2601; - } -} - -unsigned long xMCGetTimes(word mcChannelNo, word mcTimesSel) -{ -#if 0 - switch (mcTimesSel) { - case mcElapsedTrack: - - case mcRemainTrack: - - case mcElapsedDisc: - - case mcRemainDisc: - - case mcTotalDisc: - - case mcTotalFrames: - - case mcTracks: - default: -#endif -return -1; -} - -unsigned long xMCGetPosition(word mcChannelNo, word mcUnitType) -{ -unsigned long tm; - - if (ExecSCSICmd(CDROM_SCSI_ID,readsubq,0x40,tocdata)) - return 0xFFFF2607; - switch (mcUnitType) { - case mcInChapters: - return tocdata[1]; - case mcInFrames: - tm = ((tocdata[6] * 60l * 75l) + - (tocdata[7] * 75l) + - (tocdata[8])) - 150; - return tm; - case mcInTime: - tm = 0l; - memcpy(((byte *)(&tm)+1),tocdata+3,3); - tm = swap_orderl(tm); - tm = xConvTimeBinToBCD(tm); - return tm; - } -} - -int xMCSearchTo(word chan, word UnitType, Long searchLoc) -{ - switch ( UnitType) { - case mcInChapters: - playtrack[4] = searchLoc; - playtrack[5] = 1; - if (ExecSCSICmd(CDROM_SCSI_ID,playtrack,0x40,tocdata)) - return 0x2609; - return 0; - case mcInFrames: break; - case mcInTime: - pause[1] = 0x10; /* pause state */ - ExecSCSICmd(CDROM_SCSI_ID,pause,0x40,tocdata); - searchLoc = xConvTimeBCDToBin(searchLoc); - searchLoc = swap_orderl(searchLoc); - memcpy(play+3,(byte *)(&searchLoc)+1,3); - if (ExecSCSICmd(CDROM_SCSI_ID,play,0x40,tocdata)) { - scsi_error(tocdata); - return -1; - } - return 0; - break; - default: break; - } -} =types.h - -typedef struct msf { - byte min; - byte sec; - byte frame; - byte reserved; -} msf; - -typedef struct hmsf { - byte f; - byte s; - byte m; - byte h; -} hmsf; - -byte BCDToDec(byte); -byte DecToBCD(byte); -msf ConvSecToMSF(long); -msf ConvSecToMSFNoBCD(long); -unsigned long swap_orderl(unsigned long); -unsigned long xConvTimeBinToBCD(unsigned long); -unsigned long xConvTimeBCDToBin(unsigned long); =util.c -/* -------------------------------------------------------------------- - - Utility Routines - - -------------------------------------------------------------------- */ - -#include -#include "types.h" - -#pragma lint -1 -#pragma optimize 9 -#pragma noroot - -byte BCDToDec(byte x) -{ -byte y; - - y = ((x / 16) * 10) + (x % 16); - return y; -} - -byte DecToBCD(byte x) -{ -byte y; - - y = (x / 10) * 0x10 + (x % 10); - return y; -} - -#define todig(x) ((x) - '0') - -msf ConvSecToMSF(long x) -{ -byte m,s,m1; -msf out; - - m1 = x/60; - m = DecToBCD(m1); - s = DecToBCD(x - (m1 * 60)); - out.min = m; - out.sec = s; - out.frame = 0; - out.reserved = 0; - return out; -} - -msf ConvSecToMSFNoBCD(long x) -{ -byte m,s,m1; -msf out; - - m1 = x/60; - m = m1; - s = (x - (m1 * 60)); - out.min = m; - out.sec = s; - out.frame = 0; - out.reserved = 0; - return out; -} - -unsigned long swap_orderl(unsigned long x) -{ -unsigned long y; - - asm { - lda x - xba - sta y+2 - lda x+2 - xba - sta y - } - return y; -} - -unsigned long xConvTimeBinToBCD(unsigned long lba) -{ -hmsf *a; - - a = (hmsf*) &lba; - a->f = DecToBCD(a->f); - a->s = DecToBCD(a->s); - a->m = DecToBCD(a->m); - a->h = DecToBCD(a->h); - return lba; -} - -unsigned long xConvTimeBCDToBin(unsigned long lba) -{ -hmsf *a; - - a = (hmsf*) &lba; - a->f = BCDToDec(a->f); - a->s = BCDToDec(a->s); - a->m = BCDToDec(a->m); - a->h = BCDToDec(a->h); - return lba; -} + END OF ARCHIVE