mirror of
https://github.com/cc65/cc65.git
synced 2025-01-03 16:33:19 +00:00
Rewrite cbm_write() in assembler
git-svn-id: svn://svn.cc65.org/cc65/trunk@1524 b7a2c559-68d2-44c3-8de9-860c34a00d81
This commit is contained in:
parent
8ef3447248
commit
ef9edbe357
@ -1,3 +1,2 @@
|
|||||||
cbm_load.s
|
cbm_load.s
|
||||||
cbm_save.s
|
cbm_save.s
|
||||||
cbm_write.s
|
|
||||||
|
@ -12,8 +12,7 @@
|
|||||||
@$(AS) -g -o $@ $(AFLAGS) $<
|
@$(AS) -g -o $@ $(AFLAGS) $<
|
||||||
|
|
||||||
C_OBJS = cbm_load.o \
|
C_OBJS = cbm_load.o \
|
||||||
cbm_save.o \
|
cbm_save.o
|
||||||
cbm_write.o
|
|
||||||
|
|
||||||
S_OBJS = c_acptr.o \
|
S_OBJS = c_acptr.o \
|
||||||
c_basin.o \
|
c_basin.o \
|
||||||
@ -38,6 +37,7 @@ S_OBJS = c_acptr.o \
|
|||||||
cbm_close.o \
|
cbm_close.o \
|
||||||
cbm_open.o \
|
cbm_open.o \
|
||||||
cbm_read.o \
|
cbm_read.o \
|
||||||
|
cbm_write.o \
|
||||||
cclear.o \
|
cclear.o \
|
||||||
chline.o \
|
chline.o \
|
||||||
clock.o \
|
clock.o \
|
||||||
|
@ -1,31 +0,0 @@
|
|||||||
/*
|
|
||||||
* Marc 'BlackJack' Rintsch, 25.03.2001
|
|
||||||
*
|
|
||||||
* int cbm_write(unsigned char lfn, void* buffer, unsigned int size);
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <cbm.h>
|
|
||||||
#include <errno.h>
|
|
||||||
|
|
||||||
int cbm_write(unsigned char lfn, void* buffer, unsigned int size) {
|
|
||||||
|
|
||||||
static unsigned int byteswritten;
|
|
||||||
|
|
||||||
/* if we can't change to the outputchannel #lfn then return an error */
|
|
||||||
if (_oserror = cbm_k_ckout(lfn)) return -1;
|
|
||||||
|
|
||||||
byteswritten = 0;
|
|
||||||
|
|
||||||
while (byteswritten<size && !cbm_k_readst()) {
|
|
||||||
cbm_k_bsout(((unsigned char*)buffer)[byteswritten++]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cbm_k_readst()) {
|
|
||||||
_oserror = 5; /* device not present */
|
|
||||||
byteswritten = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
cbm_k_clrch();
|
|
||||||
|
|
||||||
return byteswritten;
|
|
||||||
}
|
|
92
libsrc/cbm/cbm_write.s
Normal file
92
libsrc/cbm/cbm_write.s
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
;
|
||||||
|
; Ullrich von Bassewitz, 15.11.2002
|
||||||
|
;
|
||||||
|
; Original C code by Marc 'BlackJack' Rintsch, 25.03.2001
|
||||||
|
;
|
||||||
|
; int cbm_write(unsigned char lfn, void* buffer, unsigned int size) {
|
||||||
|
;
|
||||||
|
; static unsigned int byteswritten;
|
||||||
|
;
|
||||||
|
; /* if we can't change to the outputchannel #lfn then return an error */
|
||||||
|
; if (_oserror = cbm_k_ckout(lfn)) return -1;
|
||||||
|
;
|
||||||
|
; byteswritten = 0;
|
||||||
|
;
|
||||||
|
; while (byteswritten<size && !cbm_k_readst()) {
|
||||||
|
; cbm_k_bsout(((unsigned char*)buffer)[byteswritten++]);
|
||||||
|
; }
|
||||||
|
;
|
||||||
|
; if (cbm_k_readst()) {
|
||||||
|
; _oserror = 5; /* device not present */
|
||||||
|
; byteswritten = -1;
|
||||||
|
; }
|
||||||
|
;
|
||||||
|
; cbm_k_clrch();
|
||||||
|
;
|
||||||
|
; return byteswritten;
|
||||||
|
; }
|
||||||
|
;
|
||||||
|
|
||||||
|
.include "cbm.inc"
|
||||||
|
|
||||||
|
.export _cbm_write
|
||||||
|
.importzp ptr1, ptr2, ptr3
|
||||||
|
.import popax, popa
|
||||||
|
.import __oserror
|
||||||
|
|
||||||
|
_cbm_write:
|
||||||
|
sta ptr3
|
||||||
|
stx ptr3+1 ; Save size
|
||||||
|
eor #$FF
|
||||||
|
sta ptr1
|
||||||
|
txa
|
||||||
|
eor #$FF
|
||||||
|
sta ptr1+1 ; Save -size-1
|
||||||
|
|
||||||
|
jsr popax
|
||||||
|
sta ptr2
|
||||||
|
stx ptr2+1 ; Save buffer
|
||||||
|
|
||||||
|
jsr popa
|
||||||
|
tax
|
||||||
|
jsr CKOUT
|
||||||
|
bcs @E2 ; Branch on error
|
||||||
|
bcc @L3 ; Branch always
|
||||||
|
|
||||||
|
; Loop
|
||||||
|
|
||||||
|
@L1: jsr READST
|
||||||
|
cmp #0 ; Status ok?
|
||||||
|
bne @E1
|
||||||
|
|
||||||
|
ldy #0
|
||||||
|
lda (ptr2),y ;
|
||||||
|
inc ptr2
|
||||||
|
bne @L2
|
||||||
|
inc ptr2+1 ; A = *buffer++;
|
||||||
|
|
||||||
|
@L2: jsr BSOUT ; cbm_k_bsout (A);
|
||||||
|
|
||||||
|
@L3: inc ptr1 ; --size;
|
||||||
|
bne @L1
|
||||||
|
inc ptr1+1
|
||||||
|
bne @L1
|
||||||
|
|
||||||
|
jsr CLRCH
|
||||||
|
|
||||||
|
lda ptr3
|
||||||
|
ldx ptr3+1 ; return size;
|
||||||
|
|
||||||
|
rts
|
||||||
|
|
||||||
|
; Error entry, called when READST fails
|
||||||
|
|
||||||
|
@E1: lda #5
|
||||||
|
|
||||||
|
; Error entry, error code is in A
|
||||||
|
|
||||||
|
@E2: sta __oserror
|
||||||
|
lda #$FF
|
||||||
|
tax
|
||||||
|
rts ; return -1
|
||||||
|
|
Loading…
Reference in New Issue
Block a user