Posted By
Harry Potter on 2022-07-12 17:34:11
| Re: Harry Potter CC65 Thread
I still have a bug with my 32k cartridge format: it usually stops working while displaying some text and doesn't finish displaying the text. Following is my version of the cc65/Plus4 library's write.s code: ----------------------- .proc _write
jsr rwcommon ; Pop params, check handle bcs invalidfd ; Invalid handle
; Check if the LFN is valid and the file is open for writing
adc #LFN_OFFS ; Carry is already clear tax lda fdtab-LFN_OFFS,x; Get flags for this handle and #LFN_WRITE ; File open for writing? beq invalidfd
; Valid lfn. Make it the output file
jsr CKOUT bcc @L2 @error: jmp __mappederrno ; Store into __oserror, map to errno, return -1
; Output the next character from the buffer
@L0: ldy #0 lda (ptr1),y inc ptr1 bne @L1 inc ptr1+1 ; A = *buf++; @L1: jsr BSOUT
; Check the status
pha jsr READST lsr a ; Bit zero is write timeout bne devnotpresent2 pla bcs @L3
; Count characters written
inc ptr3 bne @L2 inc ptr3+1
; Decrement count
@L2: dec ptr2 bne @L0 dec ptr2+1 bne @L0
; Wrote all chars or disk full. Close the output channel
@L3: jsr CLRCH
; Clear _oserror and return the number of chars written
lda #0 sta __oserror lda ptr3 ldx ptr3+1 rts
; Error entry: Device not present
devnotpresent2: pla devnotpresent: lda #ENODEV .byte $2C ; Skip next opcode via BIT <abs>
; Error entry: The given file descriptor is not valid or not open
invalidfd: lda #EBADF jmp __directerrno ; Sets _errno, clears _oserror, returns -1
.endproc -----------------------
|