mirror of
https://github.com/cc65/cc65.git
synced 2024-12-24 11:31:31 +00:00
dio implementation by Oliver Schmidt
git-svn-id: svn://svn.cc65.org/cc65/trunk@3432 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
069f0a7015
commit
35676b5c6b
@ -49,12 +49,18 @@ OBJS= _scrsize.o \
|
|||||||
crt0.o \
|
crt0.o \
|
||||||
ctype.o \
|
ctype.o \
|
||||||
cvline.o \
|
cvline.o \
|
||||||
|
dioclose.o \
|
||||||
|
diocommon.o \
|
||||||
|
dioopen.o \
|
||||||
|
dioread.o \
|
||||||
|
diowrite.o \
|
||||||
dosdetect.o \
|
dosdetect.o \
|
||||||
get_ostype.o \
|
get_ostype.o \
|
||||||
getenv.o \
|
getenv.o \
|
||||||
joy_stddrv.o \
|
joy_stddrv.o \
|
||||||
kbhit.o \
|
kbhit.o \
|
||||||
mainargs.o \
|
mainargs.o \
|
||||||
|
mli.o \
|
||||||
oserrlist.o \
|
oserrlist.o \
|
||||||
randomize.o \
|
randomize.o \
|
||||||
rcout.o \
|
rcout.o \
|
||||||
|
12
libsrc/apple2/dioclose.s
Normal file
12
libsrc/apple2/dioclose.s
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
;
|
||||||
|
; Oliver Schmidt, 24.03.2005
|
||||||
|
;
|
||||||
|
; unsigned char __fastcall__ dio_close (dhandle_t handle);
|
||||||
|
;
|
||||||
|
|
||||||
|
.export _dio_close
|
||||||
|
.import dioepilog
|
||||||
|
|
||||||
|
_dio_close:
|
||||||
|
lda #$00
|
||||||
|
jmp dioepilog
|
35
libsrc/apple2/diocommon.s
Normal file
35
libsrc/apple2/diocommon.s
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
;
|
||||||
|
; Oliver Schmidt, 24.03.2005
|
||||||
|
;
|
||||||
|
|
||||||
|
.export dioprolog, diocommon, dioepilog
|
||||||
|
.import popax
|
||||||
|
|
||||||
|
.include "errno.inc"
|
||||||
|
.include "mli.inc"
|
||||||
|
|
||||||
|
dioprolog:
|
||||||
|
; Set buffer
|
||||||
|
sta mliparam + MLI::RW_BLOCK::DATA_BUFFER
|
||||||
|
stx mliparam + MLI::RW_BLOCK::DATA_BUFFER+1
|
||||||
|
|
||||||
|
; Get and set sect_num
|
||||||
|
jsr popax
|
||||||
|
sta mliparam + MLI::RW_BLOCK::BLOCK_NUM
|
||||||
|
stx mliparam + MLI::RW_BLOCK::BLOCK_NUM+1
|
||||||
|
|
||||||
|
; Get and set handle
|
||||||
|
jsr popax
|
||||||
|
sta mliparam + MLI::RW_BLOCK::UNIT_NUM
|
||||||
|
rts
|
||||||
|
|
||||||
|
diocommon:
|
||||||
|
; Call read_block or write_block
|
||||||
|
ldx #RW_BLOCK_COUNT
|
||||||
|
jsr callmli
|
||||||
|
|
||||||
|
dioepilog:
|
||||||
|
; Return success or error
|
||||||
|
sta __oserror
|
||||||
|
ldx #$00
|
||||||
|
rts
|
53
libsrc/apple2/dioopen.s
Normal file
53
libsrc/apple2/dioopen.s
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
;
|
||||||
|
; Oliver Schmidt, 24.03.2005
|
||||||
|
;
|
||||||
|
; dhandle_t __fastcall__ dio_open (driveid_t drive_id);
|
||||||
|
;
|
||||||
|
; drive_id = (slot * 2) + (drive - 1)
|
||||||
|
|
||||||
|
.export _dio_open
|
||||||
|
.import decaxy, return0
|
||||||
|
|
||||||
|
.include "zeropage.inc"
|
||||||
|
.include "errno.inc"
|
||||||
|
.include "mli.inc"
|
||||||
|
|
||||||
|
_dio_open:
|
||||||
|
; Convert drive id into unit number
|
||||||
|
lsr
|
||||||
|
bcc :+
|
||||||
|
ora #%00001000
|
||||||
|
: asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
asl
|
||||||
|
sta mliparam + MLI::ON_LINE::UNIT_NUM
|
||||||
|
|
||||||
|
; Alloc 16-byte buffer just below stack
|
||||||
|
ldy #16
|
||||||
|
lda sp
|
||||||
|
ldx sp+1
|
||||||
|
jsr decaxy
|
||||||
|
sta mliparam + MLI::ON_LINE::DATA_BUFFER
|
||||||
|
stx mliparam + MLI::ON_LINE::DATA_BUFFER+1
|
||||||
|
|
||||||
|
; Get device state
|
||||||
|
lda #ON_LINE_CALL
|
||||||
|
ldx #ON_LINE_COUNT
|
||||||
|
jsr callmli
|
||||||
|
bcc :+
|
||||||
|
|
||||||
|
; DIO level access doesn't necessarily need a
|
||||||
|
; ProDOS 8 disk so ignore "high level" errors
|
||||||
|
cmp #$40
|
||||||
|
bcc oserr
|
||||||
|
|
||||||
|
; Return success
|
||||||
|
: lda mliparam + MLI::ON_LINE::UNIT_NUM
|
||||||
|
ldx #$00
|
||||||
|
stx __oserror
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Return oserror
|
||||||
|
oserr: sta __oserror
|
||||||
|
jmp return0
|
15
libsrc/apple2/dioread.s
Normal file
15
libsrc/apple2/dioread.s
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
;
|
||||||
|
; Oliver Schmidt, 24.03.2005
|
||||||
|
;
|
||||||
|
; unsigned char __fastcall__ dio_read (dhandle_t handle, sectnum_t sect_num, void *buffer);
|
||||||
|
;
|
||||||
|
|
||||||
|
.export _dio_read
|
||||||
|
.import dioprolog, diocommon
|
||||||
|
|
||||||
|
.include "mli.inc"
|
||||||
|
|
||||||
|
_dio_read:
|
||||||
|
jsr dioprolog
|
||||||
|
lda #READ_BLOCK_CALL
|
||||||
|
jmp diocommon
|
15
libsrc/apple2/diowrite.s
Normal file
15
libsrc/apple2/diowrite.s
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
;
|
||||||
|
; Oliver Schmidt, 24.03.2005
|
||||||
|
;
|
||||||
|
; unsigned char __fastcall__ dio_write (dhandle_t handle, sectnum_t sect_num, const void *buffer);
|
||||||
|
;
|
||||||
|
|
||||||
|
.export _dio_write
|
||||||
|
.import dioprolog, diocommon
|
||||||
|
|
||||||
|
.include "mli.inc"
|
||||||
|
|
||||||
|
_dio_write:
|
||||||
|
jsr dioprolog
|
||||||
|
lda #WRITE_BLOCK_CALL
|
||||||
|
jmp diocommon
|
@ -4,6 +4,10 @@
|
|||||||
; Apple ProDOS 8 MLI
|
; Apple ProDOS 8 MLI
|
||||||
;
|
;
|
||||||
|
|
||||||
|
READ_BLOCK_CALL = $80
|
||||||
|
WRITE_BLOCK_CALL= $81
|
||||||
|
RW_BLOCK_COUNT = 3
|
||||||
|
|
||||||
CREATE_CALL = $C0
|
CREATE_CALL = $C0
|
||||||
CREATE_COUNT = 7
|
CREATE_COUNT = 7
|
||||||
|
|
||||||
@ -30,6 +34,12 @@ EOF_COUNT = 2
|
|||||||
|
|
||||||
.struct MLI
|
.struct MLI
|
||||||
.union
|
.union
|
||||||
|
.struct RW_BLOCK
|
||||||
|
PARAM_COUNT .byte
|
||||||
|
UNIT_NUM .byte
|
||||||
|
DATA_BUFFER .addr
|
||||||
|
BLOCK_NUM .word
|
||||||
|
.endstruct
|
||||||
.struct CREATE
|
.struct CREATE
|
||||||
PARAM_COUNT .byte
|
PARAM_COUNT .byte
|
||||||
PATHNAME .addr
|
PATHNAME .addr
|
||||||
|
35
libsrc/apple2/mli.s
Normal file
35
libsrc/apple2/mli.s
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
;
|
||||||
|
; Oliver Schmidt, 30.12.2004
|
||||||
|
;
|
||||||
|
; Apple ProDOS 8 MLI
|
||||||
|
;
|
||||||
|
|
||||||
|
.import __dos_type
|
||||||
|
|
||||||
|
.include "mli.inc"
|
||||||
|
|
||||||
|
.bss
|
||||||
|
|
||||||
|
mliparam: .tag MLI
|
||||||
|
|
||||||
|
.data
|
||||||
|
|
||||||
|
callmli:
|
||||||
|
; Store parameters
|
||||||
|
sta call
|
||||||
|
stx mliparam
|
||||||
|
|
||||||
|
; Check for ProDOS 8
|
||||||
|
lda __dos_type
|
||||||
|
beq oserr
|
||||||
|
|
||||||
|
; Call MLI and return
|
||||||
|
jsr ENTRY
|
||||||
|
call: .byte $00
|
||||||
|
.word mliparam
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Load oserror code and return
|
||||||
|
oserr: lda #$01 ; "Invalid MLI function code number"
|
||||||
|
sec
|
||||||
|
rts
|
Loading…
Reference in New Issue
Block a user