; ; Ullrich von Bassewitz, 15.11.2002 ; ; Original C code by Marc 'BlackJack' Rintsch, 25.03.2001 ; ; int __fastcall__ 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 .import CKOUT, READST, BSOUT, CLRCH .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