mirror of
https://github.com/cc65/cc65.git
synced 2024-12-24 11:31:31 +00:00
Check whether double buffering ('bounce buffering') is needed and only do
it if needed.
This commit is contained in:
parent
8bc4b4c636
commit
387f6e9b21
@ -5,6 +5,7 @@
|
|||||||
;
|
;
|
||||||
|
|
||||||
DEBUG = 1
|
DEBUG = 1
|
||||||
|
CHKBUF = 1 ; check if bounce buffering is needed (bounce buffering is always done if set to 0)
|
||||||
|
|
||||||
.if .defined(__ATARIXL__)
|
.if .defined(__ATARIXL__)
|
||||||
|
|
||||||
@ -176,6 +177,10 @@ my_RESET_han:
|
|||||||
; one filename, terminated by "invalid character", located at ICBAL/ICBAH
|
; one filename, terminated by "invalid character", located at ICBAL/ICBAH
|
||||||
|
|
||||||
CIO_filename:
|
CIO_filename:
|
||||||
|
.if CHKBUF
|
||||||
|
jsr chk_CIO_buf_fn
|
||||||
|
bcc CIO_call_a
|
||||||
|
.endif
|
||||||
jsr setup_zpptr1_y0
|
jsr setup_zpptr1_y0
|
||||||
jsr copy_filename
|
jsr copy_filename
|
||||||
CIO_fn_cont:
|
CIO_fn_cont:
|
||||||
@ -193,6 +198,10 @@ CIO_fn_cont:
|
|||||||
; two filenames, terminated and separated by "invalid character", located at ICBAL/ICBAH
|
; two filenames, terminated and separated by "invalid character", located at ICBAL/ICBAH
|
||||||
|
|
||||||
CIO_filename2:
|
CIO_filename2:
|
||||||
|
.if CHKBUF
|
||||||
|
jsr chk_CIO_buf_fn2
|
||||||
|
bcc CIO_call_a
|
||||||
|
.endif
|
||||||
jsr setup_zpptr1_y0
|
jsr setup_zpptr1_y0
|
||||||
jsr copy_filename
|
jsr copy_filename
|
||||||
iny
|
iny
|
||||||
@ -271,7 +280,10 @@ CIO_read:
|
|||||||
ora ICBLH,x
|
ora ICBLH,x
|
||||||
beq CIO_call_a ; special I/O through A register in case buffer length is 0
|
beq CIO_call_a ; special I/O through A register in case buffer length is 0
|
||||||
|
|
||||||
; @@@ TODO: check if bounce buffer is really needed because buffer is in ROM area
|
.if CHKBUF
|
||||||
|
jsr chk_CIO_buf
|
||||||
|
bcc CIO_call_a
|
||||||
|
.endif
|
||||||
|
|
||||||
; If the data length is larger than our bounce buffer, we have to split the request into smaller ones.
|
; If the data length is larger than our bounce buffer, we have to split the request into smaller ones.
|
||||||
; Otherwise we can get away with one call and a copy to the final destination afterwards.
|
; Otherwise we can get away with one call and a copy to the final destination afterwards.
|
||||||
@ -431,7 +443,10 @@ CIO_write:
|
|||||||
ora ICBLH,x
|
ora ICBLH,x
|
||||||
beq CIO_call_a_jmp ; special I/O through A register in case buffer length is 0
|
beq CIO_call_a_jmp ; special I/O through A register in case buffer length is 0
|
||||||
|
|
||||||
; @@@ TODO: check if bounce buffer is really needed because buffer is in ROM area
|
.if CHKBUF
|
||||||
|
jsr chk_CIO_buf
|
||||||
|
bcc CIO_call_a_jmp
|
||||||
|
.endif
|
||||||
|
|
||||||
; If the data length is larger than our bounce buffer, we have to split the request into smaller ones.
|
; If the data length is larger than our bounce buffer, we have to split the request into smaller ones.
|
||||||
; Otherwise we can get away with a copy to the bounce buffer and the call.
|
; Otherwise we can get away with a copy to the bounce buffer and the call.
|
||||||
@ -691,6 +706,125 @@ setup_zpptr1:
|
|||||||
sta zpptr1+1
|
sta zpptr1+1
|
||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
.if CHKBUF
|
||||||
|
|
||||||
|
; get length of file name pointed to by 'zpptr1'
|
||||||
|
; input: Y - index into file name
|
||||||
|
; output: Y - length
|
||||||
|
; A - destroyed
|
||||||
|
get_fn_len:
|
||||||
|
lda (zpptr1),y
|
||||||
|
beq @done
|
||||||
|
iny
|
||||||
|
cmp #ATEOL
|
||||||
|
bne get_fn_len
|
||||||
|
dey
|
||||||
|
@done:
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
chk_CIO_buf_fn2:
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
lda ICBLL,x
|
||||||
|
pha
|
||||||
|
lda ICBLH,x
|
||||||
|
pha
|
||||||
|
jsr setup_zpptr1_y0
|
||||||
|
jsr get_fn_len
|
||||||
|
iny ; include terminating zero
|
||||||
|
bne fn_cont
|
||||||
|
|
||||||
|
chk_CIO_buf_fn:
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
lda ICBLL,x
|
||||||
|
pha
|
||||||
|
lda ICBLH,x
|
||||||
|
pha
|
||||||
|
jsr setup_zpptr1_y0
|
||||||
|
fn_cont:jsr get_fn_len
|
||||||
|
iny ; include terminating zero
|
||||||
|
tya
|
||||||
|
sta ICBLL,x
|
||||||
|
lda #0
|
||||||
|
sta ICBLH,x
|
||||||
|
jsr chk_CIO_buf
|
||||||
|
pla
|
||||||
|
sta ICBLH,x
|
||||||
|
pla
|
||||||
|
sta ICBLL,x
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
; check if a CIO input/output buffer overlaps with ROM area (>= $C000)
|
||||||
|
; input: X - IOCB index
|
||||||
|
; ICBAL/ICBAH/ICBLL/ICBLH - buffer address and length
|
||||||
|
; output: CF - 1/0 for overlap/no overlap
|
||||||
|
; A - destroyed
|
||||||
|
|
||||||
|
chk_CIO_buf:
|
||||||
|
lda ICBAH,x
|
||||||
|
cmp #$c0
|
||||||
|
bcc @cont
|
||||||
|
@ret:
|
||||||
|
.ifdef DEBUG
|
||||||
|
jsr CIO_buf_noti
|
||||||
|
.endif
|
||||||
|
rts
|
||||||
|
|
||||||
|
@cont: lda ICBAL,x
|
||||||
|
clc
|
||||||
|
adc ICBLL,x
|
||||||
|
lda ICBAH,x
|
||||||
|
adc ICBLH,x
|
||||||
|
bcs @ret ; ??? wraparound
|
||||||
|
cmp #$c0
|
||||||
|
.ifdef DEBUG
|
||||||
|
jsr CIO_buf_noti
|
||||||
|
.endif
|
||||||
|
rts
|
||||||
|
|
||||||
|
.ifdef DEBUG
|
||||||
|
; write to screen memory on 2nd line:
|
||||||
|
; pos 0: # of accesses without buffering
|
||||||
|
; pos 1: # of accesses with buffering
|
||||||
|
CIO_buf_noti:
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
bcc @nobuf
|
||||||
|
|
||||||
|
inc CIObnval_dobuf
|
||||||
|
jmp @cont
|
||||||
|
|
||||||
|
@nobuf: inc CIObnval_nobuf
|
||||||
|
|
||||||
|
@cont: ldy #40
|
||||||
|
lda CIObnval_nobuf
|
||||||
|
sta (SAVMSC),y
|
||||||
|
ldy #41
|
||||||
|
lda CIObnval_dobuf
|
||||||
|
sta (SAVMSC),y
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
CIObnval_dobuf:
|
||||||
|
.byte 0
|
||||||
|
CIObnval_nobuf:
|
||||||
|
.byte 0
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.endif ; .if CHKBUF
|
||||||
|
|
||||||
;---------------------------------------------------------
|
;---------------------------------------------------------
|
||||||
|
|
||||||
; SIO handler
|
; SIO handler
|
||||||
@ -737,7 +871,10 @@ SIO_call:
|
|||||||
|
|
||||||
SIO_read:
|
SIO_read:
|
||||||
|
|
||||||
; @@@ TODO: check if bounce buffer is really needed because buffer is in ROM area
|
.if CHKBUF
|
||||||
|
jsr chk_SIO_buf
|
||||||
|
bcc SIO_call
|
||||||
|
.endif
|
||||||
|
|
||||||
; we only support transfers <= bounce buffer size
|
; we only support transfers <= bounce buffer size
|
||||||
jsr cmp_sio_len_bnc_bufsz
|
jsr cmp_sio_len_bnc_bufsz
|
||||||
@ -786,7 +923,10 @@ sio_read_ret:
|
|||||||
|
|
||||||
SIO_write:
|
SIO_write:
|
||||||
|
|
||||||
; @@@ TODO: check if bounce buffer is really needed because buffer is in ROM area
|
.if CHKBUF
|
||||||
|
jsr chk_SIO_buf
|
||||||
|
bcc SIO_call
|
||||||
|
.endif
|
||||||
|
|
||||||
; we only support transfers <= bounce buffer size
|
; we only support transfers <= bounce buffer size
|
||||||
jsr cmp_sio_len_bnc_bufsz
|
jsr cmp_sio_len_bnc_bufsz
|
||||||
@ -857,6 +997,72 @@ orgbuf_to_dbuf:
|
|||||||
rts
|
rts
|
||||||
|
|
||||||
|
|
||||||
|
.if CHKBUF
|
||||||
|
|
||||||
|
; check if a SIO input/output buffer overlaps with ROM area (>= $C000)
|
||||||
|
; input: DBUFLO/DBUFHI/DBYTLO/DBYTHI - buffer address and length
|
||||||
|
; output: CF - 1/0 for overlap/no overlap
|
||||||
|
; A - destroyed
|
||||||
|
|
||||||
|
chk_SIO_buf:
|
||||||
|
lda DBUFHI
|
||||||
|
cmp #$c0
|
||||||
|
bcc @cont
|
||||||
|
@ret:
|
||||||
|
.ifdef DEBUG
|
||||||
|
jsr SIO_buf_noti
|
||||||
|
.endif
|
||||||
|
rts
|
||||||
|
|
||||||
|
@cont: lda DBUFLO
|
||||||
|
clc
|
||||||
|
adc DBYTLO
|
||||||
|
lda DBUFHI
|
||||||
|
adc DBYTHI
|
||||||
|
bcs @ret ; ??? wraparound
|
||||||
|
cmp #$c0
|
||||||
|
.ifdef DEBUG
|
||||||
|
jsr SIO_buf_noti
|
||||||
|
.endif
|
||||||
|
rts
|
||||||
|
|
||||||
|
.ifdef DEBUG
|
||||||
|
; write to screen memory on 2nd line:
|
||||||
|
; pos 38: # of accesses without buffering
|
||||||
|
; pos 39: # of accesses with buffering
|
||||||
|
SIO_buf_noti:
|
||||||
|
php
|
||||||
|
pha
|
||||||
|
tya
|
||||||
|
pha
|
||||||
|
bcc @nobuf
|
||||||
|
|
||||||
|
inc SIObnval_dobuf
|
||||||
|
jmp @cont
|
||||||
|
|
||||||
|
@nobuf: inc SIObnval_nobuf
|
||||||
|
|
||||||
|
@cont: ldy #78
|
||||||
|
lda SIObnval_nobuf
|
||||||
|
sta (SAVMSC),y
|
||||||
|
ldy #79
|
||||||
|
lda SIObnval_dobuf
|
||||||
|
sta (SAVMSC),y
|
||||||
|
|
||||||
|
pla
|
||||||
|
tay
|
||||||
|
pla
|
||||||
|
plp
|
||||||
|
rts
|
||||||
|
|
||||||
|
SIObnval_dobuf:
|
||||||
|
.byte 0
|
||||||
|
SIObnval_nobuf:
|
||||||
|
.byte 0
|
||||||
|
.endif
|
||||||
|
|
||||||
|
.endif ; .if CHKBUF
|
||||||
|
|
||||||
;---------------------------------------------------------
|
;---------------------------------------------------------
|
||||||
|
|
||||||
KEYBDV_handler:
|
KEYBDV_handler:
|
||||||
|
Loading…
Reference in New Issue
Block a user