mirror of
https://github.com/elliotnunn/supermario.git
synced 2024-11-22 04:31:30 +00:00
201 lines
6.0 KiB
Plaintext
201 lines
6.0 KiB
Plaintext
|
include 'macintosh.a'
|
||
|
; devices.a
|
||
|
;
|
||
|
; Implements the C interface for device manager register based traps.
|
||
|
; Note: routines appear in same order as "Inside Macintosh"
|
||
|
;
|
||
|
; Copyright Apple Computer, Inc. 1984-1988
|
||
|
; All rights reserved.
|
||
|
; Written by Dan Smith 9-Nov-84 (converted version of the pascal interface)
|
||
|
;
|
||
|
; Modifications:
|
||
|
; 12 Jun 87 KLH GetDCtlEntry fixed in Interface.o
|
||
|
; *** MPW 3.0d2 ***
|
||
|
; 11 Feb 88 KLH Changed C headers to work with new C compiler:
|
||
|
; Changed to using standard glue in Interface.o, so
|
||
|
; much glue removed from CInterface.o.
|
||
|
; *** MPW 3.0d4 ***
|
||
|
|
||
|
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
;
|
||
|
; High-level Routines
|
||
|
;
|
||
|
; Interface for device functions which do not require a parameter block
|
||
|
;
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
|
||
|
;
|
||
|
; OSErr opendriver(name,refNum)
|
||
|
; short *refNum;
|
||
|
; char *name;
|
||
|
;
|
||
|
BLANKS ON
|
||
|
STRING ASIS
|
||
|
|
||
|
opendriver func EXPORT
|
||
|
import p2cstr ; p2cstr(s) char *s;
|
||
|
import c2pstr ; c2pstr(s) char *s;
|
||
|
|
||
|
move.l 4(sp),-(sp) ; address of name
|
||
|
jsr c2pstr ; convert to pascal string
|
||
|
addq #4,sp ; pop parameter
|
||
|
|
||
|
move.l 4(sp),a0 ; get a pointer to the name
|
||
|
move.l 8(sp),a1 ; address of refNum
|
||
|
moveq #(IOQELSIZE/2)-1,d0
|
||
|
@1 clr.w -(sp)
|
||
|
dbra d0,@1
|
||
|
|
||
|
move.l a0,IOFileName(sp) ; set up name
|
||
|
clr.b IOPermssn(sp) ; open for read/write
|
||
|
move.l sp,a0 ; point to it
|
||
|
_Open ; open the driver
|
||
|
|
||
|
move.w IORefNum(sp),(a1) ; set the refNum
|
||
|
add #IOQELSIZE,sp ; pop off command buffer
|
||
|
move.w d0,-(sp) ; save result
|
||
|
move.l 6(sp),-(sp) ; address of name
|
||
|
jsr p2cstr ; convert to C string
|
||
|
addq #4,sp ; pop paramter
|
||
|
move.w (sp)+,d0 ; restore result
|
||
|
ext.l d0 ; sign extend error code
|
||
|
rts
|
||
|
|
||
|
;-------------------------------------------------------------------------------
|
||
|
;
|
||
|
; OSErr CloseDriver(refNum)
|
||
|
; short refNum;
|
||
|
;
|
||
|
;
|
||
|
;;CloseDriver proc EXPORT
|
||
|
;;
|
||
|
;; move.w 6(sp),d0 ; get the refNum
|
||
|
;; sub #IOQELSIZE,sp ; get space for param block
|
||
|
;; move.w d0,IORefNum(sp) ; set up refNum
|
||
|
;; move.l sp,a0
|
||
|
;; _Close ; close it!
|
||
|
;; add #IOQELSIZE,sp ; pop off param block
|
||
|
;; ext.l d0 ; sign extend error code
|
||
|
;; rts
|
||
|
;;
|
||
|
;-------------------------------------------------------------------------------
|
||
|
;
|
||
|
; OSErr Control(refNum,csCode,csParam)
|
||
|
; short refNum,csCode;
|
||
|
; Ptr csParam;
|
||
|
;
|
||
|
;;Control func EXPORT
|
||
|
;;
|
||
|
;; link a6,#-IOQELSIZE ; make room on stack for cmd block
|
||
|
;; lea -IOQELSIZE(a6),a0 ; address of cmd block
|
||
|
;;
|
||
|
;; move.w 10(a6),IORefNum(a0) ; refnum
|
||
|
;; move.w 14(a6),CSCode(a0) ; the control operation to be performed
|
||
|
;; tst.l 16(a6) ; see if there is a parameter block
|
||
|
;; beq.s @1 ; if not, don't bother copying one
|
||
|
;; lea CSParam(a0),a1 ; dest address of op specific params
|
||
|
;; move.l 16(a6),a0 ; src address of op specific params
|
||
|
;; moveq #22,d0 ; max number of bytes to be moved
|
||
|
;; _BlockMove ; copy the op specific params
|
||
|
;; lea -IOQELSIZE(a6),a0 ; put cmd block addr back into a0
|
||
|
;;
|
||
|
;;@1 _Control
|
||
|
;;
|
||
|
;; ext.l d0 ; sign extend error code
|
||
|
;; unlk a6
|
||
|
;; rts
|
||
|
;;
|
||
|
;-------------------------------------------------------------------------------
|
||
|
;
|
||
|
; OSErr Status(refNum,csCode,csParam)
|
||
|
; short refNum,csCode;
|
||
|
; Ptr csParam;
|
||
|
;
|
||
|
;;Status func EXPORT ; analogous to MacControl but returns
|
||
|
;; ; opParams rather than expecting it
|
||
|
;; ; as arg
|
||
|
;;
|
||
|
;; link a6,#-IOQELSIZE ; make room on stack for cmd block
|
||
|
;; lea -IOQELSIZE(a6),a0 ; address of cmd block
|
||
|
;;
|
||
|
;; move.w 10(a6),IORefNum(a0) ; refnum
|
||
|
;; move.w 14(a6),CSCode(a0) ; the control operation to be performed
|
||
|
;; _Status
|
||
|
;;
|
||
|
;; move.w d0,-(sp) ; save result
|
||
|
;; lea CSParam-IOQELSIZE(a6),a0 ; ptr to the status information
|
||
|
;; move.l 16(a6),a1 ; ptr to where to put this information
|
||
|
;; moveq #22,d0 ; max number of bytes to be moved
|
||
|
;; _BlockMove ; copy the op specific params
|
||
|
;;
|
||
|
;; move.w (sp)+,d0 ; get Status result
|
||
|
;; ext.l d0 ; sign extend error code
|
||
|
;; unlk a6
|
||
|
;; rts
|
||
|
;;
|
||
|
;-------------------------------------------------------------------------------
|
||
|
;
|
||
|
; OSErr KillIO(refNum)
|
||
|
; short refNum;
|
||
|
;
|
||
|
;;KillIO func EXPORT
|
||
|
;;
|
||
|
;; link a6,#-32 ; get space for control p-block
|
||
|
;; lea -32(a6),a0 ; point a0 at the block
|
||
|
;; move.w 10(a6),IORefNum(a0) ; refnum
|
||
|
;; _KillIO ; make the control call
|
||
|
;;
|
||
|
;; ext.l d0 ; sign extend error code
|
||
|
;; unlk a6
|
||
|
;; rts
|
||
|
;;
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
;
|
||
|
; Low-Level Routines
|
||
|
;
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
|
||
|
; OSErr PBControl (paramBlock,async) CntrlParam *paramBlock; Boolean async;
|
||
|
; OSErr PBStatus (paramBlock,async) CntrlParam *paramBlock; Boolean async;
|
||
|
; OSErr PBKillIO (paramBlock,async) CntrlParam *paramBlock; Boolean async;
|
||
|
|
||
|
;;PBControl proc EXPORT
|
||
|
;; OsCall _Control
|
||
|
;;
|
||
|
;;PBStatus proc EXPORT
|
||
|
;; OsCall _Status
|
||
|
;;
|
||
|
;;PBKillIO proc EXPORT
|
||
|
;; OsCall _KillIO
|
||
|
;;
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
;
|
||
|
; Accessing a Driver's I/O Queue
|
||
|
;
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
;
|
||
|
; This was corrected in Interface.o, so now the c header file uses that
|
||
|
; corrected glue. 12 Jun 87 - KLH
|
||
|
;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
||
|
|
||
|
; DCtlHandle GetDCtlEntry(refNum)
|
||
|
; short refNum;
|
||
|
;
|
||
|
; does status 1 call to get the DCEHandle
|
||
|
;
|
||
|
;GetDCtlEntry func EXPORT
|
||
|
;
|
||
|
; link a6,#-IOQELSIZE ; make room on stack for cmd block
|
||
|
; lea -IOQELSIZE(a6),a0 ; address of cmd block
|
||
|
;
|
||
|
; move.w 10(a6),IORefNum(a0) ; drive number
|
||
|
; move.w #1,CSCode(a0) ; code to get DCE handle
|
||
|
; _Status
|
||
|
; move.l CSParam(a0),d0 ; return the DCE Handle
|
||
|
;
|
||
|
; unlk a6
|
||
|
; rts
|
||
|
;
|
||
|
END
|