1
0
mirror of https://github.com/cc65/cc65.git synced 2024-07-23 03:28:58 +00:00
cc65/libsrc/atari/siocall.s
cpg e32644afb0 get transfer size from sectsizetab
git-svn-id: svn://svn.cc65.org/cc65/trunk@373 b7a2c559-68d2-44c3-8de9-860c34a00d81
2000-10-16 23:23:22 +00:00

65 lines
1.3 KiB
ArmAsm

;
; Christian Groessler, October 2000
;
; This file provides the __sio_call function
; The function does a SIO call, it's not completely
; generic (e.g. transfer size is fixed), it's used
; to save space with _dio_read and _dio_write functions.
;
; unsigned char __fastcall__ _sio_call(_driveid_t drive_id,
; _sectnum_t sect_num,
; void *buffer,
; unsigned int sio_val);
; _driveid_t - 8bit
; _sectnum_t - 16bit
; sio_val is (sio_command | sio_direction << 8)
;
.export __sio_call
.include "atari.inc"
.import popa,popax
.import sectsizetab
.proc __sio_call
sta DCOMND ; set command into DCB
stx DSTATS ; set data flow directon
jsr popax ; get buffer address
sta DBUFLO ; set buffer address into DCB
stx DBUFHI
jsr popax
sta DAUX1 ; set sector #
stx DAUX2
jsr popa
cmp #NUMDRVS
bcs _inv_dev ; invalid device #
adc #1
sta DUNIT ; unit number (d1,d2,d3,...)
sbc #0
asl a
tax
lda sectsizetab,x
sta DBYTLO ; low byte of bytes to transfer
lda sectsizetab+1,x
sta DBYTHI ; high byte of bytes to transfer
lda #$31 ; D1 (drive_id == 0) has id $31
sta DDEVIC
lda #15
sta DTIMLO ; value got from DOS source
jsr SIOV ; execute
ldx #0
lda DSTATS
bmi _req_err ; error occurred
txa ; no error occurred
_req_err:
rts
_inv_dev:
ldx #0
lda #NONDEV ; non-existent device error
rts
.endproc