September 18, 1999 The GS WorldView - Hard Core Hacker's Corner Presents: ***The RamFAST CD-ROM Audio Drivers*** Lost, buried and forgotten for over five years -- finally, here they are at last. Now that it's a fairly well established fact the RamFAST card will soon become commercial hardware history of the past and no longer be sold from Sequential Systems (which is actually no longer even Sequential Systems) the elusive, formally unavailable and unknown RamFAST CD-ROM Audio Drivers from Jawaid Bazyar (with their source code and example code included) to make custom CD-ROM Audio drivers for most any other CD-ROM drive make and model - for the RamFAST card has arrived. SEE BELOW: ---------- From: jac@pilot.njin.net (Jonathan Chandross) Newsgroups: comp.sources.apple2 Subject: RamFAST CD-ROM Audio Drivers Organization: Rutgers Univ., New Brunswick, N.J. Approved: jac@pilot.njin.net Submitted-by: Jawaid Bazyar Posting-number: Volume 1, Source:91 Archive-name: gno/driver/ramfast/cdrom_v1.0 Architecture: Apple IIgs 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 RamFAST SCSI interface card. Until now, there has been no way to play audio CD's in any CD-ROM hooked up to a RamFAST card. 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