Added assembler code files that were left out of the code import
This commit is contained in:
parent
710b372a2d
commit
3552d70176
16
platform/c64/apps/vnc-draw-asm.S
Normal file
16
platform/c64/apps/vnc-draw-asm.S
Normal file
@ -0,0 +1,16 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.importzp ptr1, ptr2, ptr3, ptr4, sreg
|
||||
.importzp sp
|
||||
|
||||
.import _vnc_draw_datalen
|
||||
.import _vnc_draw_dataptr
|
||||
.import _vnc_draw_bitmapptr
|
||||
.import _vnc_draw_x
|
||||
.import _vnc_draw_y
|
||||
;---------------------------------------------------------------------
|
||||
.bss
|
||||
;---------------------------------------------------------------------
|
||||
.data
|
||||
;---------------------------------------------------------------------
|
||||
.code
|
986
platform/c64/ctk/ctk-80col-asm.S
Normal file
986
platform/c64/ctk/ctk-80col-asm.S
Normal file
@ -0,0 +1,986 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.importzp ptr1, ptr2, ptr3, ptr4, sreg
|
||||
.importzp sp
|
||||
|
||||
.import pushax
|
||||
.import incsp2
|
||||
|
||||
.import _ctk_80col_screencolors
|
||||
.import _ctk_80col_screenpattern
|
||||
|
||||
.import _ctk_80col_lefttab
|
||||
.import _ctk_80col_righttab
|
||||
|
||||
.import _ctk_80col_cursx
|
||||
.import _ctk_80col_cursy
|
||||
.import _ctk_80col_color
|
||||
.import _ctk_80col_underline
|
||||
.import _ctk_80col_reversed
|
||||
|
||||
.import _ctk_80col_yscreenaddr
|
||||
.import _ctk_80col_yhiresaddr
|
||||
|
||||
.import _ctk_80col_windowparams
|
||||
|
||||
.import _ctk_80col_bitmapptr
|
||||
|
||||
.import _ctk_80col_versionstring
|
||||
.import _ctk_80col_versionstring_len
|
||||
|
||||
.import _ctk_80col_theme
|
||||
|
||||
.export _ctk_80col_cclear
|
||||
.export _ctk_80col_chline
|
||||
.export _ctk_80col_cputc
|
||||
.export _ctk_80col_cputsn
|
||||
|
||||
.export _ctk_80col_clear_line
|
||||
.export _ctk_80col_draw_bitmapline
|
||||
|
||||
.export _ctk_80col_draw_windowborders
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
ptr5 = sreg
|
||||
|
||||
;; Offsets in the theme struct
|
||||
|
||||
ulcornerpattern = 8
|
||||
titlebarpattern = ulcornerpattern+8
|
||||
urcornerpattern = titlebarpattern+8
|
||||
rborderpattern = urcornerpattern+8
|
||||
lrcornerpattern = rborderpattern+8
|
||||
lowerborderpattern = lrcornerpattern+8
|
||||
llcornerpattern = lowerborderpattern+8
|
||||
lborderpattern = llcornerpattern+8
|
||||
|
||||
|
||||
buttonleftpattern = lborderpattern+8
|
||||
buttonrightpattern = buttonleftpattern+8
|
||||
|
||||
|
||||
.bss
|
||||
tmp01: .res 1
|
||||
tmpl: .res 1
|
||||
tmpf: .res 1
|
||||
tmpc: .res 1
|
||||
tmpw: .res 1
|
||||
tmpptr: .res 2
|
||||
|
||||
tmpy: .res 1
|
||||
tmph: .res 1
|
||||
|
||||
;; Window border parameters
|
||||
w: .res 1
|
||||
wpw = 0
|
||||
h: .res 1
|
||||
wph = 1
|
||||
clipy1: .res 1
|
||||
wpclipy1 = 2
|
||||
clipy2: .res 1
|
||||
wpclipy2 = 3
|
||||
color1: .res 1
|
||||
wpcolor1 = 4
|
||||
color2: .res 1
|
||||
wpcolor2 = 5
|
||||
titlecolor: .res 1
|
||||
wptitlecolor = 6
|
||||
titlelen: .res 1
|
||||
wptitlelen = 7
|
||||
title: .res 2
|
||||
wptitle = 8
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.data
|
||||
;---------------------------------------------------------------------
|
||||
.code
|
||||
setupptrs:
|
||||
;; Find hires address.
|
||||
lda _ctk_80col_cursy
|
||||
asl
|
||||
tax
|
||||
lda _ctk_80col_yhiresaddr,x
|
||||
sta ptr2
|
||||
lda _ctk_80col_yhiresaddr+1,x
|
||||
sta ptr2+1
|
||||
|
||||
;; Add X coordinate to the hires address.
|
||||
lda #0
|
||||
sta ptr1+1
|
||||
lda _ctk_80col_cursx
|
||||
asl
|
||||
rol ptr1+1
|
||||
; asl
|
||||
; rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
clc
|
||||
adc ptr2
|
||||
and #$f8
|
||||
sta ptr2
|
||||
lda ptr2+1
|
||||
adc ptr1+1
|
||||
sta ptr2+1
|
||||
|
||||
;; Find screen address.
|
||||
lda _ctk_80col_cursy
|
||||
asl
|
||||
tax
|
||||
lda _ctk_80col_cursx
|
||||
lsr
|
||||
clc
|
||||
adc _ctk_80col_yscreenaddr,x
|
||||
sta ptr1
|
||||
lda _ctk_80col_yscreenaddr+1,x
|
||||
adc #0
|
||||
sta ptr1+1
|
||||
|
||||
;; Turn off interrupts, prepare $01 to store color data in RAM
|
||||
;; under I/O area.
|
||||
sei
|
||||
lda $01
|
||||
sta tmp01
|
||||
and #$f8
|
||||
sta $01
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
restore01:
|
||||
lda tmp01
|
||||
sta $01
|
||||
cli
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_cclear:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne @norts
|
||||
rts
|
||||
@norts:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
ldy tmpl
|
||||
lda _ctk_80col_color
|
||||
:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
;; Store either $00 or $ff in hires memory, depending on the
|
||||
;; reversed flag
|
||||
|
||||
ldx tmpl
|
||||
lda _ctk_80col_reversed
|
||||
beq @noff
|
||||
lda #$ff
|
||||
@noff:
|
||||
sta tmpf
|
||||
|
||||
|
||||
@loop1:
|
||||
ldy #7
|
||||
lda tmpf
|
||||
@loop2:
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @loop2
|
||||
|
||||
lda ptr2
|
||||
clc
|
||||
adc #8
|
||||
sta ptr2
|
||||
bcc @noinc
|
||||
inc ptr2+1
|
||||
@noinc:
|
||||
|
||||
inc _ctk_80col_cursx
|
||||
|
||||
dex
|
||||
bpl @loop1
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_chline:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne @norts
|
||||
rts
|
||||
@norts:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
;; Store horizontal line pattern in hires memory
|
||||
ldx tmpl
|
||||
@loop1:
|
||||
ldy #0
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$ff
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$ff
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
|
||||
|
||||
lda ptr2
|
||||
clc
|
||||
adc #8
|
||||
sta ptr2
|
||||
bcc @noinc
|
||||
inc ptr2+1
|
||||
@noinc:
|
||||
|
||||
inc _ctk_80col_cursx
|
||||
|
||||
dex
|
||||
bne @loop1
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_cputc:
|
||||
sta tmpc
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
;; Turn on font ROM
|
||||
lda tmp01
|
||||
and #$f8
|
||||
ora #$01
|
||||
sta $01
|
||||
|
||||
lda #0
|
||||
sta ptr1+1
|
||||
|
||||
;; Convert from PETSCII to screen encoding
|
||||
lda tmpc
|
||||
eor #$e0
|
||||
clc
|
||||
adc #$20
|
||||
bpl @cont
|
||||
adc #$40
|
||||
bpl @cont
|
||||
eor #$a0
|
||||
@cont:
|
||||
ldx _ctk_80col_reversed
|
||||
beq :+
|
||||
eor #$80
|
||||
:
|
||||
|
||||
;; Convert to address in character ROM
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
sta ptr1
|
||||
lda #$d8
|
||||
adc ptr1+1
|
||||
sta ptr1+1
|
||||
|
||||
lda _ctk_80col_cursx
|
||||
and #1
|
||||
beq @left
|
||||
|
||||
;; Print on hires screen, bottom-up. If we should underline,
|
||||
;; we do this by eor:ing the bottom line with #$ff
|
||||
ldy #7
|
||||
lda (ptr1),y
|
||||
ldx _ctk_80col_underline
|
||||
beq @rightnounderline
|
||||
eor #$ff
|
||||
@rightnounderline:
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$f0
|
||||
ora _ctk_80col_righttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
@rightloop:
|
||||
lda (ptr1),y
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$f0
|
||||
ora _ctk_80col_righttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @rightloop
|
||||
|
||||
inc _ctk_80col_cursx
|
||||
|
||||
jmp restore01
|
||||
|
||||
@left:
|
||||
;; Print on hires screen, bottom-up. If we should underline,
|
||||
;; we do this by eor:ing the bottom line with #$ff
|
||||
ldy #7
|
||||
lda (ptr1),y
|
||||
ldx _ctk_80col_underline
|
||||
beq @nounderline
|
||||
eor #$ff
|
||||
@nounderline:
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$0f
|
||||
ora _ctk_80col_lefttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
@loop:
|
||||
lda (ptr1),y
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$0f
|
||||
ora _ctk_80col_lefttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @loop
|
||||
|
||||
|
||||
|
||||
inc _ctk_80col_cursx
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_cputsn:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne :+
|
||||
jmp incsp2
|
||||
:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
;; Turn on font ROM
|
||||
lda tmp01
|
||||
and #$f8
|
||||
ora #$01
|
||||
sta $01
|
||||
|
||||
;; Output each character from the string
|
||||
lda #0
|
||||
sta tmpc
|
||||
ldy #0
|
||||
lda (sp),y
|
||||
sta ptr3
|
||||
iny
|
||||
lda (sp),y
|
||||
sta ptr3+1
|
||||
|
||||
@loop1:
|
||||
|
||||
|
||||
lda #0
|
||||
sta ptr1+1
|
||||
|
||||
ldy tmpc
|
||||
lda (ptr3),y
|
||||
bne :+
|
||||
jmp @end
|
||||
:
|
||||
|
||||
;; Convert from PETSCII to screen encoding
|
||||
eor #$e0
|
||||
clc
|
||||
adc #$20
|
||||
bpl @cont
|
||||
adc #$40
|
||||
bpl @cont
|
||||
eor #$a0
|
||||
@cont:
|
||||
ldx _ctk_80col_reversed
|
||||
beq :+
|
||||
eor #$80
|
||||
:
|
||||
|
||||
;; Convert to address in character ROM
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
sta ptr1
|
||||
lda #$d8
|
||||
adc ptr1+1
|
||||
sta ptr1+1
|
||||
|
||||
lda _ctk_80col_cursx
|
||||
and #1
|
||||
beq @left
|
||||
|
||||
;; Print on hires screen, bottom-up. If we should underline,
|
||||
;; we do this by eor:ing the bottom line with #$ff
|
||||
ldy #7
|
||||
lda (ptr1),y
|
||||
ldx _ctk_80col_underline
|
||||
beq @rightnounderline
|
||||
eor #$ff
|
||||
@rightnounderline:
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$f0
|
||||
ora _ctk_80col_righttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
@rightloop:
|
||||
lda (ptr1),y
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$f0
|
||||
ora _ctk_80col_righttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @rightloop
|
||||
|
||||
|
||||
lda ptr2
|
||||
clc
|
||||
adc #8
|
||||
sta ptr2
|
||||
bcc :+
|
||||
inc ptr2+1
|
||||
:
|
||||
|
||||
inc _ctk_80col_cursx
|
||||
|
||||
jmp @loopend
|
||||
|
||||
@left:
|
||||
;; Print on hires screen, bottom-up. If we should underline,
|
||||
;; we do this by eor:ing the bottom line with #$ff
|
||||
ldy #7
|
||||
lda (ptr1),y
|
||||
ldx _ctk_80col_underline
|
||||
beq @nounderline
|
||||
eor #$ff
|
||||
@nounderline:
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$0f
|
||||
ora _ctk_80col_lefttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
@loop:
|
||||
lda (ptr1),y
|
||||
tax
|
||||
lda (ptr2),y
|
||||
and #$0f
|
||||
ora _ctk_80col_lefttab,x
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @loop
|
||||
|
||||
inc _ctk_80col_cursx
|
||||
@loopend:
|
||||
inc tmpc
|
||||
lda tmpc
|
||||
cmp tmpl
|
||||
beq :+
|
||||
jmp @loop1
|
||||
:
|
||||
|
||||
@end:
|
||||
jsr restore01
|
||||
|
||||
jmp incsp2
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_clear_line:
|
||||
sta tmpl
|
||||
asl
|
||||
tax
|
||||
lda _ctk_80col_yscreenaddr,x
|
||||
sta ptr1
|
||||
lda _ctk_80col_yscreenaddr+1,x
|
||||
sta ptr1+1
|
||||
lda _ctk_80col_yhiresaddr,x
|
||||
sta ptr2
|
||||
lda _ctk_80col_yhiresaddr+1,x
|
||||
sta ptr2+1
|
||||
|
||||
sei
|
||||
lda $01
|
||||
sta tmp01
|
||||
and #$f8
|
||||
sta $01
|
||||
|
||||
ldy #39
|
||||
ldx tmpl
|
||||
lda _ctk_80col_screencolors,x
|
||||
:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda tmpl
|
||||
asl
|
||||
asl
|
||||
asl
|
||||
tax
|
||||
ldy #0
|
||||
:
|
||||
lda _ctk_80col_screenpattern,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+1,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+2,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+3,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+4,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+5,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+6,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+7,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
bne :-
|
||||
|
||||
inc ptr2+1
|
||||
|
||||
:
|
||||
lda _ctk_80col_screenpattern,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+1,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+2,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+3,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+4,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+5,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+6,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda _ctk_80col_screenpattern+7,x
|
||||
sta (ptr2),y
|
||||
iny
|
||||
cpy #$40
|
||||
bne :-
|
||||
|
||||
lda tmpl
|
||||
cmp #24
|
||||
bne :+
|
||||
|
||||
sta _ctk_80col_cursy
|
||||
lda #2
|
||||
sta _ctk_80col_cursx
|
||||
|
||||
jsr restore01
|
||||
|
||||
lda #<_ctk_80col_versionstring
|
||||
ldx #>_ctk_80col_versionstring
|
||||
jsr pushax
|
||||
lda _ctk_80col_versionstring_len
|
||||
jmp _ctk_80col_cputsn
|
||||
:
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_draw_bitmapline:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne :+
|
||||
rts
|
||||
:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
ldy #0
|
||||
lda _ctk_80col_color
|
||||
:
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy tmpl
|
||||
bne :-
|
||||
|
||||
lda _ctk_80col_bitmapptr
|
||||
sta ptr1
|
||||
lda _ctk_80col_bitmapptr+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy #0
|
||||
ldx #0
|
||||
:
|
||||
lda (ptr1),y
|
||||
sta (ptr2),y
|
||||
iny
|
||||
inx
|
||||
cpx #8
|
||||
bne :-
|
||||
|
||||
ldx #0
|
||||
|
||||
dec tmpl
|
||||
bne :-
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_80col_draw_windowborders:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
lda _ctk_80col_windowparams + wpclipy1
|
||||
beq :+
|
||||
jmp @nofirstline
|
||||
:
|
||||
|
||||
;; Draw first line of the border, including the window title
|
||||
|
||||
;; Start with filling color memory
|
||||
lda _ctk_80col_windowparams + wpw
|
||||
sta tmpw
|
||||
|
||||
|
||||
ldy #0
|
||||
lda _ctk_80col_windowparams + wptitlecolor
|
||||
:
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy tmpw
|
||||
bcc :-
|
||||
|
||||
dec tmpw
|
||||
|
||||
;; Set color for upper right corner
|
||||
sta (ptr1),y
|
||||
iny
|
||||
sta (ptr1),y
|
||||
|
||||
|
||||
;; Turn on font ROM for drawing the title
|
||||
lda tmp01
|
||||
and #$f8
|
||||
ora #$01
|
||||
sta $01
|
||||
|
||||
;; Use a temporary pointer (ptr3) rather than ptr2 so we can
|
||||
;; reuse it later.
|
||||
lda ptr2
|
||||
sta ptr3
|
||||
lda ptr2+1
|
||||
sta ptr3+1
|
||||
|
||||
;; Draw upper left corner
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+ulcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$8
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
|
||||
|
||||
;; Draw window title bar pattern
|
||||
@titlebarloop:
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+titlebarpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$8
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
;; Loop until we are three characters away from right border
|
||||
;; to avoid flickering since we would be overwriting the close
|
||||
;; button.
|
||||
dec tmpw
|
||||
bpl @titlebarloop
|
||||
|
||||
;; Draw upper right corner piece
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+urcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
|
||||
@nofirstline:
|
||||
|
||||
|
||||
ldx _ctk_80col_windowparams + wph
|
||||
inx
|
||||
stx tmph
|
||||
|
||||
;; Draw left and right borders
|
||||
|
||||
;; Fill color memory (pointer in ptr1, setup by setupptrs)
|
||||
|
||||
;; First check how much we actually should draw by inspecting
|
||||
;; the clipy1 and clipy2 fields in the _ctk_80col_windowparams
|
||||
;; structure
|
||||
|
||||
lda #1
|
||||
sta tmpy
|
||||
|
||||
ldx _ctk_80col_windowparams + wpclipy1
|
||||
@clipy1loop:
|
||||
cpx #0
|
||||
beq @clipy1loopend
|
||||
lda ptr1
|
||||
clc
|
||||
adc #$28
|
||||
sta ptr1
|
||||
bcc :+
|
||||
inc ptr1+1
|
||||
:
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #1
|
||||
sta ptr3+1
|
||||
|
||||
inc tmpy
|
||||
|
||||
dex
|
||||
jmp @clipy1loop
|
||||
@clipy1loopend:
|
||||
|
||||
lda ptr1
|
||||
clc
|
||||
adc #$28
|
||||
sta ptr1
|
||||
bcc :+
|
||||
inc ptr1+1
|
||||
:
|
||||
|
||||
ldx tmpy
|
||||
ldy _ctk_80col_windowparams + wpw
|
||||
iny
|
||||
sty tmpw
|
||||
@bordercloop:
|
||||
cpx _ctk_80col_windowparams + wpclipy2
|
||||
beq @bordercloopend
|
||||
|
||||
ldy tmpw
|
||||
lda _ctk_80col_windowparams + wpcolor2
|
||||
sta (ptr1),y
|
||||
ldy #0
|
||||
lda _ctk_80col_windowparams + wpcolor1
|
||||
sta (ptr1),y
|
||||
|
||||
lda ptr1
|
||||
clc
|
||||
adc #$28
|
||||
sta ptr1
|
||||
bcc :+
|
||||
inc ptr1+1
|
||||
:
|
||||
|
||||
inx
|
||||
cpx tmph
|
||||
bcc @bordercloop
|
||||
beq @bordercloop
|
||||
@bordercloopend:
|
||||
|
||||
|
||||
;; Fill color memory for lower border, if clipy2 allows
|
||||
cpx _ctk_80col_windowparams + wpclipy2
|
||||
beq @noclowerborder
|
||||
|
||||
lda ptr1
|
||||
sec
|
||||
sbc #$28
|
||||
sta ptr1
|
||||
bcs :+
|
||||
dec ptr1+1
|
||||
:
|
||||
|
||||
ldy _ctk_80col_windowparams + wpw
|
||||
lda _ctk_80col_windowparams + wpcolor2
|
||||
@lbordercloop:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bne @lbordercloop
|
||||
|
||||
@noclowerborder:
|
||||
|
||||
;; Draw right border
|
||||
ldx tmpy
|
||||
@rborderloop:
|
||||
cpx _ctk_80col_windowparams + wpclipy2
|
||||
beq @rborderloopend
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #1
|
||||
sta ptr3+1
|
||||
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+rborderpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
inx
|
||||
cpx tmph
|
||||
bne @rborderloop
|
||||
@rborderloopend:
|
||||
|
||||
cpx _ctk_80col_windowparams + wpclipy2
|
||||
beq @norbordercorner
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #1
|
||||
sta ptr3+1
|
||||
|
||||
;; Draw lower right corner, if clipy2 allows it
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+lrcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
@norbordercorner:
|
||||
|
||||
stx tmpy
|
||||
|
||||
;; Draw lower border
|
||||
ldx _ctk_80col_windowparams + wpw
|
||||
|
||||
@lowerborderloop:
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$8
|
||||
sta ptr3
|
||||
bcs :+
|
||||
dec ptr3+1
|
||||
:
|
||||
|
||||
lda tmpy
|
||||
cmp _ctk_80col_windowparams + wpclipy2
|
||||
beq @nolowerborder
|
||||
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+lowerborderpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
@nolowerborder:
|
||||
|
||||
dex
|
||||
bne @lowerborderloop
|
||||
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$8
|
||||
sta ptr3
|
||||
bcs :+
|
||||
dec ptr3+1
|
||||
:
|
||||
|
||||
|
||||
ldx tmpy
|
||||
cpx tmph
|
||||
bne @nolbordercorner
|
||||
|
||||
;; Draw lower left corner, if clipy2 allows it
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+llcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
sbc #1
|
||||
sta ptr3+1
|
||||
|
||||
@nolbordercorner:
|
||||
|
||||
;; Draw left border
|
||||
|
||||
|
||||
|
||||
@lborderloop:
|
||||
cpx #1
|
||||
beq @lborderloopend
|
||||
cpx _ctk_80col_windowparams + wpclipy1
|
||||
bcc @lborderloopend
|
||||
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_80col_theme+lborderpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
sbc #1
|
||||
sta ptr3+1
|
||||
|
||||
dex
|
||||
jmp @lborderloop
|
||||
|
||||
@lborderloopend:
|
||||
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
|
934
platform/c64/ctk/ctk-hires-asm.S
Normal file
934
platform/c64/ctk/ctk-hires-asm.S
Normal file
@ -0,0 +1,934 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.importzp ptr1, ptr2, ptr3, ptr4, sreg
|
||||
.importzp sp
|
||||
|
||||
.import incsp2
|
||||
|
||||
|
||||
.import _ctk_hires_cursx
|
||||
.import _ctk_hires_cursy
|
||||
.import _ctk_hires_color
|
||||
.import _ctk_hires_underline
|
||||
.import _ctk_hires_reversed
|
||||
|
||||
.import _ctk_hires_yscreenaddr
|
||||
.import _ctk_hires_yhiresaddr
|
||||
|
||||
.import _ctk_hires_windowparams
|
||||
|
||||
.import _ctk_hires_bitmapptr
|
||||
|
||||
.import _ctk_hires_theme
|
||||
|
||||
.export _ctk_hires_cclear
|
||||
.export _ctk_hires_chline
|
||||
.export _ctk_hires_cputc
|
||||
.export _ctk_hires_cputsn
|
||||
|
||||
.export _ctk_hires_draw_buttonleft
|
||||
.export _ctk_hires_draw_buttonright
|
||||
|
||||
.export _ctk_hires_draw_windowborders
|
||||
|
||||
.export _ctk_hires_draw_bitmapline
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
ptr5 = sreg
|
||||
|
||||
;; Offsets in the theme struct
|
||||
|
||||
ulcornerpattern = 8
|
||||
titlebarpattern = ulcornerpattern+8
|
||||
urcornerpattern = titlebarpattern+8
|
||||
rborderpattern = urcornerpattern+8
|
||||
lrcornerpattern = rborderpattern+8
|
||||
lowerborderpattern = lrcornerpattern+8
|
||||
llcornerpattern = lowerborderpattern+8
|
||||
lborderpattern = llcornerpattern+8
|
||||
|
||||
|
||||
buttonleftpattern = lborderpattern+8
|
||||
buttonrightpattern = buttonleftpattern+8
|
||||
|
||||
|
||||
.bss
|
||||
tmp01: .res 1
|
||||
tmpl: .res 1
|
||||
tmpf: .res 1
|
||||
tmpc: .res 1
|
||||
tmpw: .res 1
|
||||
tmpptr: .res 2
|
||||
|
||||
tmpy: .res 1
|
||||
tmph: .res 1
|
||||
|
||||
;; Window border parameters
|
||||
w: .res 1
|
||||
wpw = 0
|
||||
h: .res 1
|
||||
wph = 1
|
||||
clipy1: .res 1
|
||||
wpclipy1 = 2
|
||||
clipy2: .res 1
|
||||
wpclipy2 = 3
|
||||
color1: .res 1
|
||||
wpcolor1 = 4
|
||||
color2: .res 1
|
||||
wpcolor2 = 5
|
||||
titlelen: .res 1
|
||||
wptitlelen = 6
|
||||
title: .res 2
|
||||
wptitle = 7
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.data
|
||||
;---------------------------------------------------------------------
|
||||
.code
|
||||
setupptrs:
|
||||
;; Find hires address.
|
||||
lda _ctk_hires_cursy
|
||||
asl
|
||||
tax
|
||||
lda _ctk_hires_yhiresaddr,x
|
||||
sta ptr2
|
||||
lda _ctk_hires_yhiresaddr+1,x
|
||||
sta ptr2+1
|
||||
|
||||
;; Add X coordinate to the hires address.
|
||||
lda #0
|
||||
sta ptr1+1
|
||||
lda _ctk_hires_cursx
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
clc
|
||||
adc ptr2
|
||||
sta ptr2
|
||||
lda ptr2+1
|
||||
adc ptr1+1
|
||||
sta ptr2+1
|
||||
|
||||
|
||||
;; Find screen address.
|
||||
lda _ctk_hires_cursy
|
||||
asl
|
||||
tax
|
||||
lda _ctk_hires_yscreenaddr,x
|
||||
clc
|
||||
adc _ctk_hires_cursx
|
||||
sta ptr1
|
||||
lda _ctk_hires_yscreenaddr+1,x
|
||||
adc #0
|
||||
sta ptr1+1
|
||||
|
||||
;; Turn off interrupts, prepare $01 to store color data in RAM
|
||||
;; under I/O area.
|
||||
sei
|
||||
lda $01
|
||||
sta tmp01
|
||||
and #$f8
|
||||
sta $01
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
restore01:
|
||||
lda tmp01
|
||||
sta $01
|
||||
cli
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_cclear:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne @norts
|
||||
rts
|
||||
@norts:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
;; Store color value in color memory
|
||||
|
||||
ldy tmpl
|
||||
dey
|
||||
lda _ctk_hires_color
|
||||
@loop0:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bpl @loop0
|
||||
|
||||
;; Store either $00 or $ff in hires memory, depending on the
|
||||
;; reversed flag
|
||||
|
||||
ldx tmpl
|
||||
lda _ctk_hires_reversed
|
||||
beq @noff
|
||||
lda #$ff
|
||||
@noff:
|
||||
sta tmpf
|
||||
@loop1:
|
||||
ldy #7
|
||||
lda tmpf
|
||||
@loop2:
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @loop2
|
||||
|
||||
lda ptr2
|
||||
clc
|
||||
adc #8
|
||||
sta ptr2
|
||||
bcc @noinc
|
||||
inc ptr2+1
|
||||
@noinc:
|
||||
|
||||
inc _ctk_hires_cursx
|
||||
|
||||
dex
|
||||
bne @loop1
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_chline:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne @norts
|
||||
rts
|
||||
@norts:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
;; Store color value in color memory
|
||||
|
||||
ldy tmpl
|
||||
dey
|
||||
lda _ctk_hires_color
|
||||
@loop0:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bpl @loop0
|
||||
|
||||
;; Store horizontal line pattern in hires memory
|
||||
ldx tmpl
|
||||
@loop1:
|
||||
ldy #0
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$ff
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$ff
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
iny
|
||||
lda #$00
|
||||
sta (ptr2),y
|
||||
|
||||
|
||||
lda ptr2
|
||||
clc
|
||||
adc #8
|
||||
sta ptr2
|
||||
bcc @noinc
|
||||
inc ptr2+1
|
||||
@noinc:
|
||||
|
||||
inc _ctk_hires_cursx
|
||||
|
||||
dex
|
||||
bne @loop1
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_cputc:
|
||||
sta tmpc
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
ldy #0
|
||||
lda _ctk_hires_color
|
||||
sta (ptr1),y
|
||||
|
||||
;; Turn on font ROM
|
||||
lda tmp01
|
||||
and #$f8
|
||||
ora #$01
|
||||
sta $01
|
||||
|
||||
lda #0
|
||||
sta ptr1+1
|
||||
|
||||
;; Convert from PETSCII to screen encoding
|
||||
lda tmpc
|
||||
eor #$e0
|
||||
clc
|
||||
adc #$20
|
||||
bpl @cont
|
||||
adc #$40
|
||||
bpl @cont
|
||||
eor #$a0
|
||||
@cont:
|
||||
ldx _ctk_hires_reversed
|
||||
beq :+
|
||||
eor #$80
|
||||
:
|
||||
|
||||
;; Convert to address in character ROM
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
sta ptr1
|
||||
lda #$d8
|
||||
adc ptr1+1
|
||||
sta ptr1+1
|
||||
|
||||
;; Print on hires screen, bottom-up. If we should underline,
|
||||
;; we do this by eor:ing the bottom line with #$ff
|
||||
ldy #7
|
||||
lda (ptr1),y
|
||||
ldx _ctk_hires_underline
|
||||
beq @nounderline
|
||||
eor #$ff
|
||||
@nounderline:
|
||||
sta (ptr2),y
|
||||
dey
|
||||
@loop:
|
||||
lda (ptr1),y
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @loop
|
||||
|
||||
inc _ctk_hires_cursx
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_cputsn:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne :+
|
||||
rts
|
||||
:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
ldy tmpl
|
||||
dey
|
||||
lda _ctk_hires_color
|
||||
@loop0:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bpl @loop0
|
||||
|
||||
;; Turn on font ROM
|
||||
lda tmp01
|
||||
and #$f8
|
||||
ora #$01
|
||||
sta $01
|
||||
|
||||
|
||||
;; Output each character from the string
|
||||
lda #0
|
||||
sta tmpc
|
||||
ldy #0
|
||||
lda (sp),y
|
||||
sta ptr3
|
||||
iny
|
||||
lda (sp),y
|
||||
sta ptr3+1
|
||||
|
||||
@loop1:
|
||||
|
||||
lda #0
|
||||
sta ptr1+1
|
||||
|
||||
ldy tmpc
|
||||
lda (ptr3),y
|
||||
beq @end
|
||||
|
||||
;; Convert from PETSCII to screen encoding
|
||||
eor #$e0
|
||||
clc
|
||||
adc #$20
|
||||
bpl @cont
|
||||
adc #$40
|
||||
bpl @cont
|
||||
eor #$a0
|
||||
@cont:
|
||||
ldx _ctk_hires_reversed
|
||||
beq :+
|
||||
eor #$80
|
||||
:
|
||||
|
||||
;; Convert to address in character ROM
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
asl
|
||||
rol ptr1+1
|
||||
sta ptr1
|
||||
lda #$d8
|
||||
adc ptr1+1
|
||||
sta ptr1+1
|
||||
|
||||
;; Print on hires screen, bottom-up. If we should underline,
|
||||
;; we do this by eor:ing the bottom line with #$ff
|
||||
ldy #7
|
||||
lda (ptr1),y
|
||||
ldx _ctk_hires_underline
|
||||
beq @nounderline
|
||||
eor #$ff
|
||||
@nounderline:
|
||||
sta (ptr2),y
|
||||
dey
|
||||
@loop:
|
||||
lda (ptr1),y
|
||||
sta (ptr2),y
|
||||
dey
|
||||
bpl @loop
|
||||
|
||||
inc _ctk_hires_cursx
|
||||
|
||||
lda ptr2
|
||||
clc
|
||||
adc #8
|
||||
sta ptr2
|
||||
bcc :+
|
||||
inc ptr2+1
|
||||
:
|
||||
inc tmpc
|
||||
lda tmpc
|
||||
cmp tmpl
|
||||
bne @loop1
|
||||
|
||||
@end:
|
||||
jsr restore01
|
||||
|
||||
jmp incsp2
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_draw_windowborders:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
lda _ctk_hires_windowparams + wpclipy1
|
||||
beq :+
|
||||
jmp @nofirstline
|
||||
:
|
||||
|
||||
;; Draw first line of the border, including the window title
|
||||
|
||||
;; Start with filling color memory
|
||||
ldy _ctk_hires_windowparams + wpw
|
||||
iny
|
||||
lda _ctk_hires_windowparams + wpcolor1
|
||||
sta (ptr1),y
|
||||
dey
|
||||
dey
|
||||
dey
|
||||
sty tmpw
|
||||
|
||||
ldy _ctk_hires_windowparams + wptitlelen
|
||||
iny
|
||||
iny
|
||||
iny
|
||||
:
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy tmpw
|
||||
bcc :-
|
||||
|
||||
inc tmpw
|
||||
|
||||
;; Set color for upper left corner
|
||||
ldy #0
|
||||
lda _ctk_hires_windowparams + wpcolor1
|
||||
sta (ptr1),y
|
||||
|
||||
|
||||
;; Turn on font ROM for drawing the title
|
||||
lda tmp01
|
||||
and #$f8
|
||||
ora #$01
|
||||
sta $01
|
||||
|
||||
;; Use a temporary pointer (ptr3) rather than ptr2 so we can
|
||||
;; reuse it later.
|
||||
lda ptr2
|
||||
sta ptr3
|
||||
lda ptr2+1
|
||||
sta ptr3+1
|
||||
|
||||
;; Draw upper left corner
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+ulcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
;; Draw first empty char left of the title
|
||||
ldy #8
|
||||
lda #0
|
||||
:
|
||||
; sta (ptr3),y
|
||||
iny
|
||||
cpy #$10
|
||||
bne :-
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$10
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
dec tmpw
|
||||
|
||||
;; Draw the title
|
||||
lda _ctk_hires_windowparams + wptitle
|
||||
sta ptr4
|
||||
lda _ctk_hires_windowparams + wptitle+1
|
||||
sta ptr4+1
|
||||
|
||||
|
||||
lda #0
|
||||
sta tmpc
|
||||
@titleloop:
|
||||
lda #0
|
||||
sta ptr5+1
|
||||
|
||||
ldy tmpc
|
||||
lda (ptr4),y
|
||||
|
||||
|
||||
;; Convert from PETSCII to screen encoding
|
||||
eor #$e0
|
||||
clc
|
||||
adc #$20
|
||||
bpl @cont
|
||||
adc #$40
|
||||
bpl @cont
|
||||
eor #$a0
|
||||
@cont:
|
||||
;; Convert to address in character ROM
|
||||
asl
|
||||
rol ptr5+1
|
||||
asl
|
||||
rol ptr5+1
|
||||
asl
|
||||
rol ptr5+1
|
||||
sta ptr5
|
||||
lda #$d8
|
||||
adc ptr5+1
|
||||
sta ptr5+1
|
||||
|
||||
;; Print on hires screen, character by character, bottom-up.
|
||||
ldy #7
|
||||
:
|
||||
lda (ptr5),y
|
||||
; sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #8
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
dec tmpw
|
||||
|
||||
inc tmpc
|
||||
lda tmpc
|
||||
cmp _ctk_hires_windowparams + wptitlelen
|
||||
bne @titleloop
|
||||
|
||||
;; Draw empty char after the title
|
||||
ldy #7
|
||||
lda #0
|
||||
:
|
||||
; sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$8
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
dec tmpw
|
||||
|
||||
;; Draw window title bar pattern
|
||||
@titlebarloop:
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+titlebarpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$8
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
;; Loop until we are three characters away from right border
|
||||
;; to avoid flickering since we would be overwriting the close
|
||||
;; button.
|
||||
dec tmpw
|
||||
lda tmpw
|
||||
cmp #3
|
||||
bcs @titlebarloop
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$18
|
||||
sta ptr3
|
||||
bcc :+
|
||||
inc ptr3+1
|
||||
:
|
||||
;; Draw upper right corner piece
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+urcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
|
||||
@nofirstline:
|
||||
|
||||
|
||||
ldx _ctk_hires_windowparams + wph
|
||||
inx
|
||||
stx tmph
|
||||
|
||||
;; Draw left and right borders
|
||||
|
||||
;; Fill color memory (pointer in ptr1, setup by setupptrs)
|
||||
|
||||
;; First check how much we actually should draw by inspecting
|
||||
;; the clipy1 and clipy2 fields in the _ctk_hires_windowparams
|
||||
;; structure
|
||||
|
||||
lda #1
|
||||
sta tmpy
|
||||
|
||||
ldx _ctk_hires_windowparams + wpclipy1
|
||||
@clipy1loop:
|
||||
cpx #0
|
||||
beq @clipy1loopend
|
||||
lda ptr1
|
||||
clc
|
||||
adc #$28
|
||||
sta ptr1
|
||||
bcc :+
|
||||
inc ptr1+1
|
||||
:
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #1
|
||||
sta ptr3+1
|
||||
|
||||
inc tmpy
|
||||
|
||||
dex
|
||||
jmp @clipy1loop
|
||||
@clipy1loopend:
|
||||
|
||||
lda ptr1
|
||||
clc
|
||||
adc #$28
|
||||
sta ptr1
|
||||
bcc :+
|
||||
inc ptr1+1
|
||||
:
|
||||
|
||||
ldx tmpy
|
||||
ldy _ctk_hires_windowparams + wpw
|
||||
iny
|
||||
sty tmpw
|
||||
@bordercloop:
|
||||
cpx _ctk_hires_windowparams + wpclipy2
|
||||
beq @bordercloopend
|
||||
|
||||
ldy tmpw
|
||||
lda _ctk_hires_windowparams + wpcolor2
|
||||
sta (ptr1),y
|
||||
ldy #0
|
||||
lda _ctk_hires_windowparams + wpcolor1
|
||||
sta (ptr1),y
|
||||
|
||||
lda ptr1
|
||||
clc
|
||||
adc #$28
|
||||
sta ptr1
|
||||
bcc :+
|
||||
inc ptr1+1
|
||||
:
|
||||
|
||||
inx
|
||||
cpx tmph
|
||||
bcc @bordercloop
|
||||
beq @bordercloop
|
||||
@bordercloopend:
|
||||
|
||||
|
||||
;; Fill color memory for lower border, if clipy2 allows
|
||||
cpx _ctk_hires_windowparams + wpclipy2
|
||||
beq @noclowerborder
|
||||
|
||||
lda ptr1
|
||||
sec
|
||||
sbc #$28
|
||||
sta ptr1
|
||||
bcs :+
|
||||
dec ptr1+1
|
||||
:
|
||||
|
||||
ldy _ctk_hires_windowparams + wpw
|
||||
lda _ctk_hires_windowparams + wpcolor2
|
||||
@lbordercloop:
|
||||
sta (ptr1),y
|
||||
dey
|
||||
bne @lbordercloop
|
||||
|
||||
@noclowerborder:
|
||||
|
||||
;; Draw right border
|
||||
ldx tmpy
|
||||
@rborderloop:
|
||||
cpx _ctk_hires_windowparams + wpclipy2
|
||||
beq @rborderloopend
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #1
|
||||
sta ptr3+1
|
||||
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+rborderpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
inx
|
||||
cpx tmph
|
||||
bne @rborderloop
|
||||
@rborderloopend:
|
||||
|
||||
cpx _ctk_hires_windowparams + wpclipy2
|
||||
beq @norbordercorner
|
||||
|
||||
lda ptr3
|
||||
clc
|
||||
adc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
adc #1
|
||||
sta ptr3+1
|
||||
|
||||
;; Draw lower right corner, if clipy2 allows it
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+lrcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
@norbordercorner:
|
||||
|
||||
stx tmpy
|
||||
|
||||
;; Draw lower border
|
||||
ldx _ctk_hires_windowparams + wpw
|
||||
|
||||
@lowerborderloop:
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$8
|
||||
sta ptr3
|
||||
bcs :+
|
||||
dec ptr3+1
|
||||
:
|
||||
|
||||
lda tmpy
|
||||
cmp _ctk_hires_windowparams + wpclipy2
|
||||
beq @nolowerborder
|
||||
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+lowerborderpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
@nolowerborder:
|
||||
|
||||
dex
|
||||
bne @lowerborderloop
|
||||
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$8
|
||||
sta ptr3
|
||||
bcs :+
|
||||
dec ptr3+1
|
||||
:
|
||||
|
||||
|
||||
ldx tmpy
|
||||
cpx tmph
|
||||
bne @nolbordercorner
|
||||
|
||||
;; Draw lower left corner, if clipy2 allows it
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+llcornerpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
sbc #1
|
||||
sta ptr3+1
|
||||
|
||||
@nolbordercorner:
|
||||
|
||||
;; Draw left border
|
||||
|
||||
|
||||
|
||||
@lborderloop:
|
||||
cpx #1
|
||||
beq @lborderloopend
|
||||
cpx _ctk_hires_windowparams + wpclipy1
|
||||
bcc @lborderloopend
|
||||
|
||||
ldy #7
|
||||
:
|
||||
lda _ctk_hires_theme+lborderpattern,y
|
||||
sta (ptr3),y
|
||||
dey
|
||||
bpl :-
|
||||
|
||||
lda ptr3
|
||||
sec
|
||||
sbc #$40
|
||||
sta ptr3
|
||||
lda ptr3+1
|
||||
sbc #1
|
||||
sta ptr3+1
|
||||
|
||||
dex
|
||||
jmp @lborderloop
|
||||
|
||||
@lborderloopend:
|
||||
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_draw_buttonleft:
|
||||
jsr setupptrs
|
||||
|
||||
ldy #0
|
||||
lda _ctk_hires_color
|
||||
sta (ptr1),y
|
||||
|
||||
:
|
||||
lda _ctk_hires_theme+buttonleftpattern,y
|
||||
sta (ptr2),y
|
||||
iny
|
||||
cpy #8
|
||||
bne :-
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_draw_buttonright:
|
||||
jsr setupptrs
|
||||
ldy #0
|
||||
lda _ctk_hires_color
|
||||
sta (ptr1),y
|
||||
|
||||
:
|
||||
lda _ctk_hires_theme+buttonrightpattern,y
|
||||
sta (ptr2),y
|
||||
iny
|
||||
cpy #8
|
||||
bne :-
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_hires_draw_bitmapline:
|
||||
sta tmpl
|
||||
cmp #0
|
||||
bne :+
|
||||
rts
|
||||
:
|
||||
|
||||
jsr setupptrs
|
||||
|
||||
ldy #0
|
||||
lda _ctk_hires_color
|
||||
:
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy tmpl
|
||||
bne :-
|
||||
|
||||
lda _ctk_hires_bitmapptr
|
||||
sta ptr1
|
||||
lda _ctk_hires_bitmapptr+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy #0
|
||||
ldx #0
|
||||
:
|
||||
lda (ptr1),y
|
||||
sta (ptr2),y
|
||||
iny
|
||||
inx
|
||||
cpx #8
|
||||
bne :-
|
||||
|
||||
ldx #0
|
||||
|
||||
dec tmpl
|
||||
bne :-
|
||||
|
||||
jmp restore01
|
||||
;---------------------------------------------------------------------
|
||||
|
149
platform/c64/ctk/ctk-mouse-1351.S
Normal file
149
platform/c64/ctk/ctk-mouse-1351.S
Normal file
@ -0,0 +1,149 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
;; The 1351 mouse code was taken from the CC65 libraries,
|
||||
;; written by Ullrich von Bassewitz
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
.macpack generic
|
||||
|
||||
.import _ctk_mouse_joyx, _ctk_mouse_joyy
|
||||
.import _ctk_mouse_firebutton
|
||||
.export _ctk_mouse_1351
|
||||
;---------------------------------------------------------------------
|
||||
.bss
|
||||
OldValue: .res 1 ; Temp for MoveCheck routine
|
||||
NewValue: .res 1 ; Temp for MoveCheck routine
|
||||
YCorr: .res 1 ; Correction for Y coordinate
|
||||
|
||||
OldPotX: .res 1 ; Old hw counter values
|
||||
OldPotY: .res 1
|
||||
|
||||
SID_ADConv1 = $D419
|
||||
SID_ADConv2 = $D41A
|
||||
CIA1_PRA = $DC00
|
||||
CIA1_PRB = $DC01
|
||||
CIA1_DDRB = $DC03
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.data
|
||||
XMin: .word 0 ; X1 value of bounding box
|
||||
YMin: .word 0 ; Y1 value of bounding box
|
||||
XMax: .word 319 ; X2 value of bounding box
|
||||
YMax: .word 199 ; Y2 value of bounding box
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.code
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
;---------------------------------------------------------------------
|
||||
;; Most of the mouse code is taken from the CC65 libraries written by
|
||||
;; Ullrich von Bassewitz
|
||||
MoveCheck:
|
||||
sty OldValue
|
||||
sta NewValue
|
||||
ldx #$00
|
||||
|
||||
sub OldValue ; a = mod64 (new - old)
|
||||
and #%01111111
|
||||
cmp #%01000000 ; if (a > 0)
|
||||
bcs @L1 ;
|
||||
lsr a ; a /= 2;
|
||||
beq @L2 ; if (a != 0)
|
||||
ldy NewValue ; y = NewValue
|
||||
rts ; return
|
||||
|
||||
@L1: ora #%11000000 ; else or in high order bits
|
||||
cmp #$FF ; if (a != -1)
|
||||
beq @L2
|
||||
sec
|
||||
ror a ; a /= 2
|
||||
dex ; high byte = -1 (X = $FF)
|
||||
ldy NewValue
|
||||
rts
|
||||
|
||||
@L2: txa ; A = $00
|
||||
rts
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_mouse_1351:
|
||||
lda SID_ADConv1 ; Get mouse X movement
|
||||
ldy OldPotX
|
||||
jsr MoveCheck ; Calculate movement vector
|
||||
sty OldPotX
|
||||
|
||||
; Calculate the new X coordinate (--> a/y)
|
||||
|
||||
add _ctk_mouse_joyx
|
||||
tay ; Remember low byte
|
||||
txa
|
||||
adc _ctk_mouse_joyx+1
|
||||
tax
|
||||
|
||||
; Limit the X coordinate to the bounding box
|
||||
|
||||
cpy XMin
|
||||
sbc XMin+1
|
||||
bpl @L1
|
||||
ldy XMin
|
||||
ldx XMin+1
|
||||
jmp @L2
|
||||
@L1: txa
|
||||
|
||||
cpy XMax
|
||||
sbc XMax+1
|
||||
bmi @L2
|
||||
ldy XMax
|
||||
ldx XMax+1
|
||||
@L2: sty _ctk_mouse_joyx
|
||||
stx _ctk_mouse_joyx+1
|
||||
; Calculate the Y movement vector
|
||||
|
||||
lda SID_ADConv2 ; Get mouse Y movement
|
||||
ldy OldPotY
|
||||
jsr MoveCheck ; Calculate movement
|
||||
sty OldPotY
|
||||
|
||||
; Calculate the new Y coordinate (--> a/y)
|
||||
|
||||
sta OldValue
|
||||
lda _ctk_mouse_joyy
|
||||
sub OldValue
|
||||
tay
|
||||
stx OldValue
|
||||
lda _ctk_mouse_joyy+1
|
||||
sbc OldValue
|
||||
tax
|
||||
|
||||
cpy YMin
|
||||
sbc YMin+1
|
||||
bpl @L3
|
||||
ldy YMin
|
||||
ldx YMin+1
|
||||
jmp @L4
|
||||
@L3: txa
|
||||
|
||||
cpy YMax
|
||||
sbc YMax+1
|
||||
bmi @L4
|
||||
ldy YMax
|
||||
ldx YMax+1
|
||||
@L4: sty _ctk_mouse_joyy
|
||||
stx _ctk_mouse_joyy+1
|
||||
|
||||
;; Get mouse button
|
||||
lda #$7F
|
||||
sta CIA1_PRA
|
||||
lda CIA1_PRB ; Read joystick #0
|
||||
ldx #0
|
||||
and #$1F
|
||||
eor #$1F
|
||||
|
||||
ora _ctk_mouse_firebutton
|
||||
sta _ctk_mouse_firebutton
|
||||
|
||||
lda #0
|
||||
sta CIA1_PRA
|
||||
sta CIA1_DDRB
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
48
platform/c64/ctk/ctk-mouse-asm.S
Normal file
48
platform/c64/ctk/ctk-mouse-asm.S
Normal file
@ -0,0 +1,48 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
;; The 1351 mouse code was taken from the CC65 libraries,
|
||||
;; written by Ullrich von Bassewitz
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
.macpack generic
|
||||
|
||||
.import _ctk_mouse_joyx, _ctk_mouse_joyy
|
||||
.import _ctk_mouse_firebutton
|
||||
.export _ctk_mouse_asm_irq
|
||||
.import _ctk_mouse_joy, _ctk_mouse_1351
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.code
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_mouse_asm_irq:
|
||||
lda #0
|
||||
sta _ctk_mouse_firebutton
|
||||
|
||||
jsr _ctk_mouse_joy
|
||||
;; jsr_ctk_mouse_1351
|
||||
|
||||
; lda _ctk_mouse_joybutton
|
||||
; ora _ctk_mouse_1351button
|
||||
; sta _ctk_mouse_firebutton
|
||||
|
||||
lda _ctk_mouse_joyy
|
||||
clc
|
||||
adc #$32
|
||||
sta $d001
|
||||
sta $d003
|
||||
|
||||
lda _ctk_mouse_joyx
|
||||
clc
|
||||
adc #$18
|
||||
sta $d000
|
||||
sta $d002
|
||||
lda #0
|
||||
adc _ctk_mouse_joyx+1
|
||||
and #1
|
||||
beq :+
|
||||
lda #3
|
||||
:
|
||||
sta $d010
|
||||
jmp $ea31
|
135
platform/c64/ctk/ctk-mouse-joy.S
Normal file
135
platform/c64/ctk/ctk-mouse-joy.S
Normal file
@ -0,0 +1,135 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
.macpack generic
|
||||
|
||||
.import _ctk_mouse_joyx, _ctk_mouse_joyy
|
||||
.import _ctk_mouse_firebutton
|
||||
.export _ctk_mouse_joy
|
||||
;---------------------------------------------------------------------
|
||||
.bss
|
||||
lastjoydy: .res 1
|
||||
lastjoydx: .res 1
|
||||
joydycnt: .res 1
|
||||
joydxcnt: .res 1
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.code
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
_ctk_mouse_joy:
|
||||
ldy $dc02
|
||||
lda #0
|
||||
sta $dc02
|
||||
lda $dc00
|
||||
sty $dc02
|
||||
ldy #0
|
||||
ldx #0
|
||||
lsr
|
||||
bcs nodey
|
||||
dey
|
||||
nodey:
|
||||
lsr
|
||||
bcs noiny
|
||||
iny
|
||||
noiny:
|
||||
lsr
|
||||
bcs nodex
|
||||
dex
|
||||
nodex:
|
||||
lsr
|
||||
bcs noinx
|
||||
inx
|
||||
noinx:
|
||||
and #1
|
||||
eor #1
|
||||
ora _ctk_mouse_firebutton
|
||||
sta _ctk_mouse_firebutton
|
||||
|
||||
cpy lastjoydy
|
||||
sty lastjoydy
|
||||
bne noydy
|
||||
tya
|
||||
pha
|
||||
inc joydycnt
|
||||
lda joydycnt
|
||||
cmp #$1f
|
||||
bmi nostajoydycnt
|
||||
lda #$20
|
||||
sta joydycnt
|
||||
nostajoydycnt:
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
tay
|
||||
pla
|
||||
asldeyloop:
|
||||
asl
|
||||
dey
|
||||
bpl asldeyloop
|
||||
tay
|
||||
jmp ydy
|
||||
noydy:
|
||||
lda #0
|
||||
sta joydycnt
|
||||
ydy:
|
||||
|
||||
tya
|
||||
clc
|
||||
adc _ctk_mouse_joyy
|
||||
|
||||
cmp #240
|
||||
bcc :+
|
||||
lda #0
|
||||
:
|
||||
|
||||
cmp #200
|
||||
bcc :+
|
||||
lda #199
|
||||
:
|
||||
sta _ctk_mouse_joyy
|
||||
|
||||
cpx lastjoydx
|
||||
stx lastjoydx
|
||||
bne noxdx
|
||||
txa
|
||||
pha
|
||||
inc joydxcnt
|
||||
lda joydxcnt
|
||||
cmp #$1f
|
||||
bmi nostajoydxcnt
|
||||
lda #$20
|
||||
sta joydxcnt
|
||||
nostajoydxcnt:
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
lsr
|
||||
tax
|
||||
pla
|
||||
asldexloop:
|
||||
asl
|
||||
dex
|
||||
bpl asldexloop
|
||||
tax
|
||||
jmp xdx
|
||||
noxdx:
|
||||
lda #0
|
||||
sta joydxcnt
|
||||
xdx:
|
||||
|
||||
txa
|
||||
clc
|
||||
adc _ctk_mouse_joyx
|
||||
sta _ctk_mouse_joyx
|
||||
php
|
||||
lda #$ff
|
||||
cpx #0
|
||||
bmi nolda02
|
||||
lda #0
|
||||
nolda02:
|
||||
plp
|
||||
adc _ctk_mouse_joyx+1
|
||||
sta _ctk_mouse_joyx+1
|
||||
rts
|
245
platform/c64/lib/mtarch-asm.S
Normal file
245
platform/c64/lib/mtarch-asm.S
Normal file
@ -0,0 +1,245 @@
|
||||
;---------------------------------------------------------------------
|
||||
.importzp ptr1
|
||||
.importzp sp
|
||||
.import __ZP_START__
|
||||
|
||||
|
||||
.import _mtarch_asm_threadstack
|
||||
.import _mtarch_asm_threadsp
|
||||
.import _mtarch_asm_threadspreg
|
||||
.import _mtarch_asm_threadzp
|
||||
|
||||
.export _mtarch_asm_exec
|
||||
.export _mtarch_yield
|
||||
.export _mtarch_asm_start
|
||||
.export _mtarch_pstart, _mtarch_pstop
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.bss
|
||||
kernelsp: .res 2
|
||||
kernelspreg: .res 1
|
||||
|
||||
oldirq: .res 2
|
||||
|
||||
zpsize = 32
|
||||
.code
|
||||
;---------------------------------------------------------------------
|
||||
;; Switch to thread defined by threadsp, threadstack and threadspreg.
|
||||
;; The kernel stack is swapped onto the threadstack, and the
|
||||
;; sp and spreg are saved to the local variables "kernelsp" and
|
||||
;; "kernelspreg". Also, the zeropage variables are saved.
|
||||
|
||||
_mtarch_asm_exec:
|
||||
sei
|
||||
;; Save current stack pointer
|
||||
lda sp
|
||||
sta kernelsp
|
||||
lda sp+1
|
||||
sta kernelsp+1
|
||||
|
||||
tsx
|
||||
stx kernelspreg
|
||||
|
||||
lda _mtarch_asm_threadzp
|
||||
sta ptr1
|
||||
lda _mtarch_asm_threadzp+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy #0
|
||||
:
|
||||
lda <__ZP_START__,y
|
||||
tax
|
||||
lda (ptr1),y
|
||||
sta <__ZP_START__,y
|
||||
txa
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy #zpsize
|
||||
bne :-
|
||||
|
||||
lda _mtarch_asm_threadstack
|
||||
sta ptr1
|
||||
lda _mtarch_asm_threadstack+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy kernelspreg ; determine the smallest of the two stack pointers,
|
||||
cpy _mtarch_asm_threadspreg ; as we only need to swap the used part of the stack
|
||||
bcc :+
|
||||
ldy _mtarch_asm_threadspreg
|
||||
|
||||
:
|
||||
lda $0100,y
|
||||
tax
|
||||
lda (ptr1),y
|
||||
sta $0100,y
|
||||
txa
|
||||
sta (ptr1),y
|
||||
iny
|
||||
bne :-
|
||||
|
||||
lda _mtarch_asm_threadsp
|
||||
sta sp
|
||||
lda _mtarch_asm_threadsp+1
|
||||
sta sp+1
|
||||
|
||||
ldx _mtarch_asm_threadspreg
|
||||
txs
|
||||
|
||||
; jsr _mtarch_pstart
|
||||
|
||||
lda $0314
|
||||
sta oldirq
|
||||
lda $0315
|
||||
sta oldirq+1
|
||||
|
||||
lda #<irq
|
||||
sta $0314
|
||||
lda #>irq
|
||||
sta $0315
|
||||
|
||||
|
||||
pla
|
||||
tay
|
||||
pla
|
||||
tax
|
||||
pla
|
||||
|
||||
rti
|
||||
|
||||
;; Switch from thread defined by threadsp, threadstack and threadspreg.
|
||||
;; The kernel stack is swapped back from the threadstack, and the
|
||||
;; sp and spreg are restored from the local variables "kernelsp" and
|
||||
;; "kernelspreg".
|
||||
yield:
|
||||
sei
|
||||
lda sp
|
||||
sta _mtarch_asm_threadsp
|
||||
lda sp+1
|
||||
sta _mtarch_asm_threadsp+1
|
||||
|
||||
tsx
|
||||
stx _mtarch_asm_threadspreg
|
||||
|
||||
lda _mtarch_asm_threadzp
|
||||
sta ptr1
|
||||
lda _mtarch_asm_threadzp+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy kernelspreg ; determine the smallest of the two stack pointers,
|
||||
cpy _mtarch_asm_threadspreg ; as we only need to swap the used part of the stack
|
||||
bcc :+
|
||||
ldy _mtarch_asm_threadspreg
|
||||
|
||||
:
|
||||
lda <__ZP_START__,y
|
||||
tax
|
||||
lda (ptr1),y
|
||||
sta <__ZP_START__,y
|
||||
txa
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy #zpsize
|
||||
bne :-
|
||||
|
||||
lda _mtarch_asm_threadstack
|
||||
sta ptr1
|
||||
lda _mtarch_asm_threadstack+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy #0
|
||||
:
|
||||
lda $0100,y
|
||||
tax
|
||||
lda (ptr1),y
|
||||
sta $0100,y
|
||||
txa
|
||||
sta (ptr1),y
|
||||
iny
|
||||
bne :-
|
||||
|
||||
lda kernelsp
|
||||
sta sp
|
||||
lda kernelsp+1
|
||||
sta sp+1
|
||||
|
||||
ldx kernelspreg
|
||||
txs
|
||||
|
||||
cli
|
||||
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
;; Simulate an IRQ by pushing CPU status and CPu registers
|
||||
;; onto the stack. Then call the yield function to yield the
|
||||
;; process.
|
||||
_mtarch_yield:
|
||||
php
|
||||
pha
|
||||
txa
|
||||
pha
|
||||
tya
|
||||
pha
|
||||
|
||||
tsx
|
||||
|
||||
; the rts adds 1 to the PC
|
||||
; saved on the stack. We want
|
||||
lda $0105,x ; the stack to look like is would
|
||||
clc ; do inside of an interrupt.
|
||||
adc #1 ; (this is what the 'rts' does,
|
||||
sta $0105,x ; but not the 'rti')
|
||||
lda $0106,x
|
||||
adc #0
|
||||
sta $0106,x
|
||||
|
||||
|
||||
jmp yield
|
||||
;---------------------------------------------------------------------
|
||||
_mtarch_asm_start:
|
||||
lda _mtarch_asm_threadzp
|
||||
sta ptr1
|
||||
lda _mtarch_asm_threadzp+1
|
||||
sta ptr1+1
|
||||
|
||||
ldy #0
|
||||
:
|
||||
lda <__ZP_START__,y
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy #zpsize
|
||||
bne :-
|
||||
rts
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
irq:
|
||||
lda oldirq
|
||||
sta $0314
|
||||
lda oldirq+1
|
||||
sta $0315
|
||||
jmp yield
|
||||
;---------------------------------------------------------------------
|
||||
;; Setup preemption IRQ
|
||||
_mtarch_pstart:
|
||||
sei
|
||||
lda $0314
|
||||
sta oldirq
|
||||
lda $0315
|
||||
sta oldirq+1
|
||||
|
||||
lda #<irq
|
||||
sta $0314
|
||||
lda #>irq
|
||||
sta $0315
|
||||
cli
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
_mtarch_pstop:
|
||||
sei
|
||||
lda oldirq
|
||||
sta $0314
|
||||
lda oldirq+1
|
||||
sta $0315
|
||||
cli
|
||||
rts
|
||||
;---------------------------------------------------------------------
|
||||
|
7
platform/c64/lib/save-driveunit.S
Normal file
7
platform/c64/lib/save-driveunit.S
Normal file
@ -0,0 +1,7 @@
|
||||
.import __curunit
|
||||
.constructor saveunit, 32
|
||||
.code
|
||||
saveunit:
|
||||
lda $ba
|
||||
sta __curunit
|
||||
rts
|
505
platform/c64/loader/c64-dio-asm.S
Normal file
505
platform/c64/loader/c64-dio-asm.S
Normal file
@ -0,0 +1,505 @@
|
||||
|
||||
|
||||
.export _c64_dio_asm_init
|
||||
.export _c64_dio_asm_read_block
|
||||
.export _c64_dio_asm_write_block
|
||||
|
||||
.export _c64_dio_asm_track, _c64_dio_asm_sector
|
||||
|
||||
.export _c64_dio_asm_ptr
|
||||
|
||||
.importzp ptr1, ptr2
|
||||
|
||||
;; job code $80 read, $90 write
|
||||
|
||||
|
||||
ciout = $ffa8
|
||||
listen = $ffb1
|
||||
second = $ff93
|
||||
unlsn = $ffae
|
||||
|
||||
nbytes = 34
|
||||
esc = $42
|
||||
|
||||
blockread = 1
|
||||
blockwrite = 2
|
||||
|
||||
errok = 0
|
||||
errerr = 1
|
||||
|
||||
.data
|
||||
_c64_dio_asm_track: .byte 0
|
||||
_c64_dio_asm_sector: .byte 0
|
||||
_c64_dio_asm_ptr: .byte 0,0
|
||||
|
||||
.code
|
||||
;---------------------------------------
|
||||
_c64_dio_asm_read_block:
|
||||
|
||||
lda #blockread
|
||||
jsr send
|
||||
|
||||
lda _c64_dio_asm_track
|
||||
jsr send
|
||||
lda _c64_dio_asm_sector
|
||||
jsr send
|
||||
|
||||
|
||||
jsr recv
|
||||
cmp #errok
|
||||
bne readerr
|
||||
|
||||
lda _c64_dio_asm_ptr
|
||||
sta ptr1
|
||||
lda _c64_dio_asm_ptr+1
|
||||
sta ptr1+1
|
||||
ldy #0
|
||||
readl:
|
||||
jsr recv
|
||||
sta (ptr1),y
|
||||
iny
|
||||
bne readl
|
||||
clc
|
||||
lda #0
|
||||
tax
|
||||
rts
|
||||
readerr:
|
||||
; sta $07c0
|
||||
jsr recv
|
||||
; sta $07c1
|
||||
ldx #0
|
||||
rts
|
||||
;---------------------------------------
|
||||
_c64_dio_asm_write_block:
|
||||
|
||||
lda #blockwrite
|
||||
jsr send
|
||||
|
||||
lda _c64_dio_asm_track
|
||||
jsr send
|
||||
lda _c64_dio_asm_sector
|
||||
jsr send
|
||||
|
||||
|
||||
lda _c64_dio_asm_ptr
|
||||
sta ptr1
|
||||
lda _c64_dio_asm_ptr+1
|
||||
sta ptr1+1
|
||||
ldy #0
|
||||
writel:
|
||||
lda (ptr1),y
|
||||
jsr send
|
||||
iny
|
||||
bne writel
|
||||
|
||||
jsr recv
|
||||
cmp #errok
|
||||
bne writeerr
|
||||
lda #0
|
||||
tax
|
||||
rts
|
||||
|
||||
writeerr:
|
||||
; sta $07c0
|
||||
jsr recv
|
||||
; sta $07c1
|
||||
ldx #0
|
||||
rts
|
||||
;---------------------------------------
|
||||
_c64_dio_asm_init:
|
||||
sta devnr
|
||||
lda #$00
|
||||
sta drvmem
|
||||
lda #$05
|
||||
sta drvmem+1
|
||||
|
||||
lda #<drive
|
||||
sta ptr1
|
||||
lda #>drive
|
||||
sta ptr1+1
|
||||
|
||||
; lda devnr
|
||||
; ldx #<icmd
|
||||
; ldy #>icmd
|
||||
; jsr drvcmd
|
||||
; jsr unlsn
|
||||
|
||||
mwl:
|
||||
lda devnr
|
||||
ldx #<mwcmd
|
||||
ldy #>mwcmd
|
||||
jsr drvcmd
|
||||
|
||||
ldy #0
|
||||
lda (ptr1),y
|
||||
jsr ciout
|
||||
iny
|
||||
cpy #nbytes
|
||||
bne *-8
|
||||
|
||||
jsr unlsn
|
||||
|
||||
lda drvmem
|
||||
clc
|
||||
adc #nbytes
|
||||
sta drvmem
|
||||
lda drvmem+1
|
||||
adc #0
|
||||
sta drvmem+1
|
||||
|
||||
lda ptr1
|
||||
clc
|
||||
adc #nbytes
|
||||
sta ptr1
|
||||
tax
|
||||
lda ptr1+1
|
||||
adc #0
|
||||
sta ptr1+1
|
||||
cpx #<driveend
|
||||
sbc #>driveend
|
||||
bcc mwl
|
||||
|
||||
lda devnr
|
||||
ldx #<mecmd
|
||||
ldy #>mecmd
|
||||
jsr drvcmd
|
||||
jsr unlsn
|
||||
|
||||
rts
|
||||
;---------------------------------------
|
||||
drvcmd:
|
||||
stx ptr2
|
||||
sty ptr2+1
|
||||
jsr listen
|
||||
lda #$6f
|
||||
jsr second
|
||||
|
||||
ldy #0
|
||||
lda (ptr2),y
|
||||
sta drvcmdcmp+1
|
||||
inc ptr2
|
||||
bne *+4
|
||||
inc ptr2+1
|
||||
|
||||
ldy #0
|
||||
lda (ptr2),y
|
||||
jsr ciout
|
||||
iny
|
||||
drvcmdcmp: cpy #0
|
||||
bne *-8
|
||||
rts
|
||||
;---------------------------------------
|
||||
devnr: .byte 8
|
||||
mwcmd: .byte 6
|
||||
.byte $4d, $2d, $57
|
||||
drvmem: .word $0500
|
||||
.byte nbytes
|
||||
.byte 0
|
||||
mecmd: .byte 2
|
||||
.byte $55, $33
|
||||
.byte 0
|
||||
;---------------------------------------
|
||||
send:
|
||||
|
||||
sta ptr2
|
||||
ldx #7
|
||||
sendl:
|
||||
lsr ptr2
|
||||
|
||||
|
||||
lda $dd00
|
||||
and #$df
|
||||
ora #$10
|
||||
bcc *+4
|
||||
eor #$30
|
||||
sta $dd00
|
||||
|
||||
lda #$c0
|
||||
bit $dd00
|
||||
bne *-3
|
||||
|
||||
lda $dd00
|
||||
and #$cf
|
||||
sta $dd00
|
||||
|
||||
lda $dd00
|
||||
and #$c0
|
||||
eor #$c0
|
||||
bne *-7
|
||||
|
||||
dex
|
||||
bpl sendl
|
||||
|
||||
ldx $d020
|
||||
lda #1
|
||||
sta $d020
|
||||
stx $d020
|
||||
|
||||
rts
|
||||
;---------------------------------------
|
||||
recv:
|
||||
ldx $d020
|
||||
lda #0
|
||||
sta $d020
|
||||
stx $d020
|
||||
|
||||
ldx #7
|
||||
recvl:
|
||||
lda $dd00
|
||||
and #$c0
|
||||
eor #$c0
|
||||
beq *-7
|
||||
asl a
|
||||
|
||||
lda $dd00
|
||||
and #$df
|
||||
ora #$10
|
||||
bcs *+4
|
||||
eor #$30
|
||||
sta $dd00
|
||||
ror ptr2
|
||||
|
||||
lda #$c0
|
||||
bit $dd00
|
||||
beq *-3
|
||||
|
||||
lda $dd00
|
||||
and #$cf
|
||||
sta $dd00
|
||||
|
||||
dex
|
||||
bpl recvl
|
||||
lda ptr2
|
||||
rts
|
||||
;---------------------------------------
|
||||
|
||||
;---------------------------------------
|
||||
;the code residing in the drive:
|
||||
;---------------------------------------
|
||||
dtmp = $46
|
||||
dtmp2 = $97
|
||||
dbuf = $0300
|
||||
dbufcmd = $00
|
||||
dbuftrack = $06
|
||||
dbufsect = $07
|
||||
|
||||
retries = 4
|
||||
bretries = 2
|
||||
;---------------------------------------
|
||||
drive :
|
||||
.org $0500
|
||||
|
||||
|
||||
|
||||
cld
|
||||
tsx
|
||||
stx dstack
|
||||
sei
|
||||
jsr ledoff
|
||||
|
||||
drivel:
|
||||
jsr dload
|
||||
jsr ledoff
|
||||
cli
|
||||
jmp drivel
|
||||
;---------------------------------------
|
||||
ledon:
|
||||
lda $1c00
|
||||
ora #$08
|
||||
sta $1c00
|
||||
rts
|
||||
ledoff:
|
||||
lda $1c00
|
||||
and #$f7
|
||||
sta $1c00
|
||||
rts
|
||||
;---------------------------------------
|
||||
drecv:
|
||||
ldx #7
|
||||
drecvl:
|
||||
lda $1800
|
||||
bmi atn
|
||||
and #5
|
||||
beq *-7
|
||||
lsr a
|
||||
lda #2
|
||||
bcc *+4
|
||||
lda #8
|
||||
sta $1800
|
||||
ror dtmp
|
||||
lda $1800
|
||||
bmi atn
|
||||
and #5
|
||||
eor #5
|
||||
beq *-9
|
||||
lda #0
|
||||
sta $1800
|
||||
dex
|
||||
bpl drecvl
|
||||
lda dtmp
|
||||
rts
|
||||
;---------------------------------------
|
||||
atn:
|
||||
ldx dstack
|
||||
txs
|
||||
cli
|
||||
rts
|
||||
;---------------------------------------
|
||||
dsend:
|
||||
sta dtmp
|
||||
ldx #7
|
||||
dsendl:
|
||||
lsr dtmp
|
||||
lda #2
|
||||
bcs *+4
|
||||
lda #8
|
||||
sta $1800
|
||||
|
||||
lda $1800
|
||||
bmi atn
|
||||
and #5
|
||||
eor #5
|
||||
bne *-9
|
||||
|
||||
sta $1800
|
||||
|
||||
lda #5
|
||||
bit $1800
|
||||
bne *-3
|
||||
dex
|
||||
bpl dsendl
|
||||
rts
|
||||
;---------------------------------------
|
||||
dload:
|
||||
ldy #0
|
||||
|
||||
jsr drecv
|
||||
sta dcmd
|
||||
|
||||
jsr ledon
|
||||
|
||||
jsr drecv
|
||||
sta dbuftrack
|
||||
|
||||
jsr drecv
|
||||
sta dbufsect
|
||||
|
||||
lda dcmd
|
||||
cmp #blockwrite
|
||||
bne dblockread
|
||||
dblockwrite:
|
||||
ldy #0
|
||||
drecvpl:
|
||||
jsr drecv
|
||||
sta dbuf,y
|
||||
iny
|
||||
bne drecvpl
|
||||
|
||||
jmp dputsect
|
||||
|
||||
dblockread:
|
||||
jsr dgetsect
|
||||
|
||||
dsendpage:
|
||||
ldy #0
|
||||
dsendpl:
|
||||
lda dbuf,y
|
||||
jsr dsend
|
||||
iny
|
||||
bne dsendpl
|
||||
rts
|
||||
;---------------------------------------
|
||||
dgetsect:
|
||||
; stx dbuftrack
|
||||
; sty dbufsect
|
||||
ldx #retries
|
||||
dgetsectl:
|
||||
lda #$80
|
||||
sta dbufcmd
|
||||
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
sei
|
||||
cmp #1
|
||||
beq dgsnoerr
|
||||
|
||||
cpx #0
|
||||
beq dgsserr
|
||||
dex
|
||||
cpx #bretries
|
||||
bcs dgetsectl
|
||||
pha
|
||||
lda #$c0
|
||||
sta dbufcmd
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
pla
|
||||
cpx #0
|
||||
bne dgetsectl
|
||||
|
||||
dgsserr:
|
||||
pha
|
||||
lda #errerr
|
||||
jsr dsend
|
||||
pla
|
||||
jsr dsend
|
||||
rts
|
||||
dgsnoerr:
|
||||
lda #errok
|
||||
jsr dsend
|
||||
rts
|
||||
;---------------------------------------
|
||||
dputsect:
|
||||
; stx dbuftrack
|
||||
; sty dbufsect
|
||||
ldx #retries
|
||||
dputsectl:
|
||||
lda #$90
|
||||
sta dbufcmd
|
||||
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
sei
|
||||
cmp #1
|
||||
beq dpsnoerr
|
||||
|
||||
cpx #0
|
||||
beq dpsserr
|
||||
dex
|
||||
cpx #bretries
|
||||
bcs dputsectl
|
||||
pha
|
||||
lda #$c0
|
||||
sta dbufcmd
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
pla
|
||||
cpx #0
|
||||
bne dputsectl
|
||||
|
||||
dpsserr:
|
||||
pha
|
||||
lda #errerr
|
||||
jsr dsend
|
||||
pla
|
||||
jsr dsend
|
||||
rts
|
||||
dpsnoerr:
|
||||
lda #errok
|
||||
jsr dsend
|
||||
rts
|
||||
;---------------------------------------
|
||||
led: .byte 0,0
|
||||
dstack: .byte 0
|
||||
dcmd: .byte 0
|
||||
.RELOC
|
||||
driveend:
|
||||
|
571
platform/c64/loader/cfs-1541-asm.S
Normal file
571
platform/c64/loader/cfs-1541-asm.S
Normal file
@ -0,0 +1,571 @@
|
||||
;;
|
||||
;;
|
||||
;; 1541 CFS implementation
|
||||
;;
|
||||
;; Architecture:
|
||||
;;
|
||||
;; Functionality split between C64 and 1541: 1541 performs
|
||||
;; directory lookup and finding files. 1541 communicates track/sector
|
||||
;; address of file, C64 requests data to be read from track/sector.
|
||||
;;
|
||||
;; Example: reading directory
|
||||
;;
|
||||
;; C64: DIR
|
||||
;; 1541: directory entries in CFS format
|
||||
;;
|
||||
;; Example: opening file
|
||||
;;
|
||||
;; C64: FILE filename
|
||||
;; 1541: track/sector
|
||||
;;
|
||||
;; Example: reading file
|
||||
;;
|
||||
;; C64: track/sector, length
|
||||
;; 1541: length, data, track/sector
|
||||
|
||||
|
||||
.export _c64_dio_asm_init
|
||||
.export _c64_dio_asm_read_block
|
||||
.export _c64_dio_asm_write_block
|
||||
|
||||
.export _c64_dio_asm_track, _c64_dio_asm_sector
|
||||
|
||||
.export _c64_dio_asm_ptr
|
||||
|
||||
.importzp ptr1, ptr2
|
||||
|
||||
;; job code $80 read, $90 write
|
||||
|
||||
|
||||
ciout = $ffa8
|
||||
listen = $ffb1
|
||||
second = $ff93
|
||||
unlsn = $ffae
|
||||
|
||||
nbytes = 34
|
||||
esc = $42
|
||||
|
||||
blockread = 1
|
||||
blockwrite = 2
|
||||
|
||||
errok = 0
|
||||
errerr = 1
|
||||
|
||||
.data
|
||||
_c64_dio_asm_track: .byte 0
|
||||
_c64_dio_asm_sector: .byte 0
|
||||
_c64_dio_asm_ptr: .byte 0,0
|
||||
|
||||
.code
|
||||
;---------------------------------------
|
||||
_cfs_1541_read:
|
||||
;; First send READ command to drive
|
||||
|
||||
lda #READ_CMD
|
||||
jsr send
|
||||
|
||||
;; If drive do not respond we must download drive code
|
||||
cmp #ERR_NOT_RESPONDING
|
||||
bne notload
|
||||
|
||||
jsr download
|
||||
lda #read
|
||||
jsr send
|
||||
notload:
|
||||
;; Send file descriptor and number of bytes to read
|
||||
lda _cfs_1541_fd
|
||||
jsr send
|
||||
lda _cfs_1541_bytes
|
||||
jsr send
|
||||
|
||||
lda _cfs_1541_ptr
|
||||
sta ptr1
|
||||
lda _cfs_1541_ptr + 1
|
||||
sta ptr1 + 1
|
||||
|
||||
;; Read bytes from drive
|
||||
|
||||
ldy #0
|
||||
:
|
||||
jsr recv
|
||||
sta (ptr1),y
|
||||
iny
|
||||
cpy _cfs_1541_bytes
|
||||
bne -
|
||||
|
||||
;; Read the number of bytes that were actually read from the file
|
||||
jsr recv
|
||||
|
||||
;; Return the number of bytes read
|
||||
|
||||
rts
|
||||
;---------------------------------------
|
||||
_c64_dio_asm_read_block:
|
||||
|
||||
lda #BLOCKREAD_CMD
|
||||
jsr send
|
||||
|
||||
lda _c64_dio_asm_track
|
||||
jsr send
|
||||
lda _c64_dio_asm_sector
|
||||
jsr send
|
||||
|
||||
|
||||
jsr recv
|
||||
cmp #errok
|
||||
bne readerr
|
||||
|
||||
lda _c64_dio_asm_ptr
|
||||
sta ptr1
|
||||
lda _c64_dio_asm_ptr+1
|
||||
sta ptr1+1
|
||||
ldy #0
|
||||
readl:
|
||||
jsr recv
|
||||
sta (ptr1),y
|
||||
iny
|
||||
bne readl
|
||||
clc
|
||||
lda #0
|
||||
tax
|
||||
rts
|
||||
readerr:
|
||||
; sta $07c0
|
||||
jsr recv
|
||||
; sta $07c1
|
||||
ldx #0
|
||||
rts
|
||||
;---------------------------------------
|
||||
_c64_dio_asm_write_block:
|
||||
|
||||
lda #blockwrite
|
||||
jsr send
|
||||
|
||||
lda _c64_dio_asm_track
|
||||
jsr send
|
||||
lda _c64_dio_asm_sector
|
||||
jsr send
|
||||
|
||||
|
||||
lda _c64_dio_asm_ptr
|
||||
sta ptr1
|
||||
lda _c64_dio_asm_ptr+1
|
||||
sta ptr1+1
|
||||
ldy #0
|
||||
writel:
|
||||
lda (ptr1),y
|
||||
jsr send
|
||||
iny
|
||||
bne writel
|
||||
|
||||
jsr recv
|
||||
cmp #errok
|
||||
bne writeerr
|
||||
lda #0
|
||||
tax
|
||||
rts
|
||||
|
||||
writeerr:
|
||||
; sta $07c0
|
||||
jsr recv
|
||||
; sta $07c1
|
||||
ldx #0
|
||||
rts
|
||||
;---------------------------------------
|
||||
_c64_dio_asm_init:
|
||||
sta devnr
|
||||
lda #$00
|
||||
sta drvmem
|
||||
lda #$05
|
||||
sta drvmem+1
|
||||
|
||||
lda #<drive
|
||||
sta ptr1
|
||||
lda #>drive
|
||||
sta ptr1+1
|
||||
|
||||
; lda devnr
|
||||
; ldx #<icmd
|
||||
; ldy #>icmd
|
||||
; jsr drvcmd
|
||||
; jsr unlsn
|
||||
|
||||
mwl:
|
||||
lda devnr
|
||||
ldx #<mwcmd
|
||||
ldy #>mwcmd
|
||||
jsr drvcmd
|
||||
|
||||
ldy #0
|
||||
lda (ptr1),y
|
||||
jsr ciout
|
||||
iny
|
||||
cpy #nbytes
|
||||
bne *-8
|
||||
|
||||
jsr unlsn
|
||||
|
||||
lda drvmem
|
||||
clc
|
||||
adc #nbytes
|
||||
sta drvmem
|
||||
lda drvmem+1
|
||||
adc #0
|
||||
sta drvmem+1
|
||||
|
||||
lda ptr1
|
||||
clc
|
||||
adc #nbytes
|
||||
sta ptr1
|
||||
tax
|
||||
lda ptr1+1
|
||||
adc #0
|
||||
sta ptr1+1
|
||||
cpx #<driveend
|
||||
sbc #>driveend
|
||||
bcc mwl
|
||||
|
||||
lda devnr
|
||||
ldx #<mecmd
|
||||
ldy #>mecmd
|
||||
jsr drvcmd
|
||||
jsr unlsn
|
||||
|
||||
rts
|
||||
;---------------------------------------
|
||||
drvcmd:
|
||||
stx ptr2
|
||||
sty ptr2+1
|
||||
jsr listen
|
||||
lda #$6f
|
||||
jsr second
|
||||
|
||||
ldy #0
|
||||
lda (ptr2),y
|
||||
sta drvcmdcmp+1
|
||||
inc ptr2
|
||||
bne *+4
|
||||
inc ptr2+1
|
||||
|
||||
ldy #0
|
||||
lda (ptr2),y
|
||||
jsr ciout
|
||||
iny
|
||||
drvcmdcmp: cpy #0
|
||||
bne *-8
|
||||
rts
|
||||
;---------------------------------------
|
||||
devnr: .byte 8
|
||||
mwcmd: .byte 6
|
||||
.byte $4d, $2d, $57
|
||||
drvmem: .word $0500
|
||||
.byte nbytes
|
||||
.byte 0
|
||||
mecmd: .byte 2
|
||||
.byte $55, $33
|
||||
.byte 0
|
||||
;---------------------------------------
|
||||
send:
|
||||
|
||||
sta ptr2
|
||||
ldx #7
|
||||
sendl:
|
||||
lsr ptr2
|
||||
|
||||
|
||||
lda $dd00
|
||||
and #$df
|
||||
ora #$10
|
||||
bcc *+4
|
||||
eor #$30
|
||||
sta $dd00
|
||||
|
||||
lda #$c0
|
||||
bit $dd00
|
||||
bne *-3
|
||||
|
||||
lda $dd00
|
||||
and #$cf
|
||||
sta $dd00
|
||||
|
||||
lda $dd00
|
||||
and #$c0
|
||||
eor #$c0
|
||||
bne *-7
|
||||
|
||||
dex
|
||||
bpl sendl
|
||||
|
||||
ldx $d020
|
||||
lda #1
|
||||
sta $d020
|
||||
stx $d020
|
||||
|
||||
rts
|
||||
;---------------------------------------
|
||||
recv:
|
||||
ldx $d020
|
||||
lda #0
|
||||
sta $d020
|
||||
stx $d020
|
||||
|
||||
ldx #7
|
||||
recvl:
|
||||
lda $dd00
|
||||
and #$c0
|
||||
eor #$c0
|
||||
beq *-7
|
||||
asl a
|
||||
|
||||
lda $dd00
|
||||
and #$df
|
||||
ora #$10
|
||||
bcs *+4
|
||||
eor #$30
|
||||
sta $dd00
|
||||
ror ptr2
|
||||
|
||||
lda #$c0
|
||||
bit $dd00
|
||||
beq *-3
|
||||
|
||||
lda $dd00
|
||||
and #$cf
|
||||
sta $dd00
|
||||
|
||||
dex
|
||||
bpl recvl
|
||||
lda ptr2
|
||||
rts
|
||||
;---------------------------------------
|
||||
|
||||
;---------------------------------------
|
||||
;the code residing in the drive:
|
||||
;---------------------------------------
|
||||
dtmp = $46
|
||||
dtmp2 = $97
|
||||
dbuf = $0300
|
||||
dbufcmd = $00
|
||||
dbuftrack = $06
|
||||
dbufsect = $07
|
||||
|
||||
retries = 10
|
||||
bretries = 2
|
||||
;---------------------------------------
|
||||
drive :
|
||||
.org $0500
|
||||
|
||||
|
||||
|
||||
cld
|
||||
tsx
|
||||
stx dstack
|
||||
sei
|
||||
jsr ledoff
|
||||
|
||||
drivel:
|
||||
jsr dload
|
||||
jsr ledoff
|
||||
cli
|
||||
jmp drivel
|
||||
;---------------------------------------
|
||||
ledon:
|
||||
lda $1c00
|
||||
ora #$08
|
||||
sta $1c00
|
||||
rts
|
||||
ledoff:
|
||||
lda $1c00
|
||||
and #$f7
|
||||
sta $1c00
|
||||
rts
|
||||
;---------------------------------------
|
||||
drecv:
|
||||
ldx #7
|
||||
drecvl:
|
||||
lda $1800
|
||||
bmi atn
|
||||
and #5
|
||||
beq *-7
|
||||
lsr a
|
||||
lda #2
|
||||
bcc *+4
|
||||
lda #8
|
||||
sta $1800
|
||||
ror dtmp
|
||||
lda $1800
|
||||
bmi atn
|
||||
and #5
|
||||
eor #5
|
||||
beq *-9
|
||||
lda #0
|
||||
sta $1800
|
||||
dex
|
||||
bpl drecvl
|
||||
lda dtmp
|
||||
rts
|
||||
;---------------------------------------
|
||||
atn:
|
||||
ldx dstack
|
||||
txs
|
||||
cli
|
||||
rts
|
||||
;---------------------------------------
|
||||
dsend:
|
||||
sta dtmp
|
||||
ldx #7
|
||||
dsendl:
|
||||
lsr dtmp
|
||||
lda #2
|
||||
bcs *+4
|
||||
lda #8
|
||||
sta $1800
|
||||
|
||||
lda $1800
|
||||
bmi atn
|
||||
and #5
|
||||
eor #5
|
||||
bne *-9
|
||||
|
||||
sta $1800
|
||||
|
||||
lda #5
|
||||
bit $1800
|
||||
bne *-3
|
||||
dex
|
||||
bpl dsendl
|
||||
rts
|
||||
;---------------------------------------
|
||||
dload:
|
||||
ldy #0
|
||||
|
||||
jsr drecv
|
||||
sta dcmd
|
||||
|
||||
jsr ledon
|
||||
|
||||
jsr drecv
|
||||
sta dbuftrack
|
||||
|
||||
jsr drecv
|
||||
sta dbufsect
|
||||
|
||||
lda dcmd
|
||||
cmp #blockwrite
|
||||
bne dblockread
|
||||
dblockwrite:
|
||||
ldy #0
|
||||
drecvpl:
|
||||
jsr drecv
|
||||
sta dbuf,y
|
||||
iny
|
||||
bne drecvpl
|
||||
|
||||
jmp dputsect
|
||||
|
||||
dblockread:
|
||||
jsr dgetsect
|
||||
|
||||
dsendpage:
|
||||
ldy #0
|
||||
dsendpl:
|
||||
lda dbuf,y
|
||||
jsr dsend
|
||||
iny
|
||||
bne dsendpl
|
||||
rts
|
||||
;---------------------------------------
|
||||
dgetsect:
|
||||
; stx dbuftrack
|
||||
; sty dbufsect
|
||||
ldx #retries
|
||||
dgetsectl:
|
||||
lda #$80
|
||||
sta dbufcmd
|
||||
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
sei
|
||||
cmp #1
|
||||
beq dgsnoerr
|
||||
|
||||
cpx #0
|
||||
beq dgsserr
|
||||
dex
|
||||
cpx #bretries
|
||||
bcs dgetsectl
|
||||
pha
|
||||
lda #$c0
|
||||
sta dbufcmd
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
pla
|
||||
cpx #0
|
||||
bne dgetsectl
|
||||
|
||||
dgsserr:
|
||||
pha
|
||||
lda #errerr
|
||||
jsr dsend
|
||||
pla
|
||||
jsr dsend
|
||||
rts
|
||||
dgsnoerr:
|
||||
lda #errok
|
||||
jsr dsend
|
||||
rts
|
||||
;---------------------------------------
|
||||
dputsect:
|
||||
; stx dbuftrack
|
||||
; sty dbufsect
|
||||
ldx #retries
|
||||
dputsectl:
|
||||
lda #$90
|
||||
sta dbufcmd
|
||||
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
sei
|
||||
cmp #1
|
||||
beq dpsnoerr
|
||||
|
||||
cpx #0
|
||||
beq dpsserr
|
||||
dex
|
||||
cpx #bretries
|
||||
bcs dputsectl
|
||||
pha
|
||||
lda #$c0
|
||||
sta dbufcmd
|
||||
cli
|
||||
:
|
||||
lda dbufcmd
|
||||
bmi :-
|
||||
pla
|
||||
cpx #0
|
||||
bne dputsectl
|
||||
|
||||
dpsserr:
|
||||
pha
|
||||
lda #errerr
|
||||
jsr dsend
|
||||
pla
|
||||
jsr dsend
|
||||
rts
|
||||
dpsnoerr:
|
||||
lda #errok
|
||||
jsr dsend
|
||||
rts
|
||||
;---------------------------------------
|
||||
led: .byte 0,0
|
||||
dstack: .byte 0
|
||||
dcmd: .byte 0
|
||||
.RELOC
|
||||
driveend:
|
||||
|
17
platform/c64/net/rrnet-drv-asm.S
Normal file
17
platform/c64/net/rrnet-drv-asm.S
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.export _cs8900a_rxtxreg
|
||||
.export _cs8900a_txcmd
|
||||
.export _cs8900a_txlen
|
||||
.export _cs8900a_packetpp
|
||||
.export _cs8900a_ppdata
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
_cs8900a_rxtxreg = $de08
|
||||
_cs8900a_txcmd = $de0c
|
||||
_cs8900a_txlen = $de0e
|
||||
_cs8900a_packetpp = $de02
|
||||
_cs8900a_ppdata = $de04
|
||||
|
329
platform/c64/net/rs232silversurfer.S
Normal file
329
platform/c64/net/rs232silversurfer.S
Normal file
@ -0,0 +1,329 @@
|
||||
;; The following code is written and is copyrighted by
|
||||
;; Groepaz/Hitmen
|
||||
|
||||
;; Small changes by Adam Dunkels (renamed ss232 -> rs232)
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
; silver surfer polling mode driver for cc65
|
||||
; - work from here to create a full featured driver with interupts.
|
||||
; gpz fixed 20020828: fatal bug fixed in _rs232_params
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
rs16550base = $de08
|
||||
|
||||
fifo_rxd = rs16550base+$00 ;8 (r)
|
||||
fifo_txd = rs16550base+$00 ;8 (w)
|
||||
|
||||
fifo_dll = rs16550base+$00 ;8 (r/w)
|
||||
fifo_dlm = rs16550base+$01 ;9 (r/w)
|
||||
|
||||
fifo_ier = rs16550base+$01 ;9
|
||||
|
||||
fifo_fcr = rs16550base+$02 ;a (w)
|
||||
fifo_iir = rs16550base+$02 ;a (r)
|
||||
fifo_lcr = rs16550base+$03 ;b
|
||||
fifo_mcr = rs16550base+$04 ;c
|
||||
fifo_lsr = rs16550base+$05 ;d
|
||||
fifo_msr = rs16550base+$06 ;e (r)
|
||||
fifo_scratch = rs16550base+$07 ;f (r/w)
|
||||
|
||||
|
||||
|
||||
.export _rs232_init
|
||||
.export _rs232_done
|
||||
.export _rs232_params
|
||||
.export _rs232_put
|
||||
.export _rs232_get
|
||||
|
||||
.importzp ptr1, ptr2
|
||||
.import popa, popax
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
; Error codes. Beware: The codes must match the codes in the C header file
|
||||
|
||||
ErrNotInitialized = $01
|
||||
ErrBaudTooFast = $02
|
||||
ErrBaudNotAvail = $03
|
||||
ErrNoData = $04
|
||||
ErrOverflow = $05
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_init (char hacked);
|
||||
;/* Initialize the serial port, install the interrupt handler. The parameter
|
||||
; * has no effect for now and should be set to 0.
|
||||
; */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
.code
|
||||
|
||||
_rs232_init:
|
||||
; enable ssurfer-port
|
||||
lda $de01
|
||||
ora #$01
|
||||
sta $de01
|
||||
|
||||
; disable nmi's from ssurfer
|
||||
lda #%00000000
|
||||
sta fifo_ier
|
||||
|
||||
; activate dtr
|
||||
lda #%00000001
|
||||
sta fifo_mcr
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_done (void);
|
||||
;/* Close the port, deinstall the interrupt hander. You MUST call this function
|
||||
; * before terminating the program, otherwise the machine may crash later. If
|
||||
; * in doubt, install an exit handler using atexit(). The function will do
|
||||
; * nothing, if it was already called.
|
||||
; */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
_rs232_done:
|
||||
; disable nmi's from ssurfer
|
||||
lda #%00000000
|
||||
sta fifo_ier
|
||||
|
||||
; deactivate dtr
|
||||
sta fifo_mcr
|
||||
|
||||
; disable ssurfer-port
|
||||
lda $de01
|
||||
and #$fe
|
||||
sta $de01
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_params (unsigned char params, unsigned char parity);
|
||||
;/* Set the port parameters. Use a combination of the #defined values above. */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
.data
|
||||
|
||||
_rs232_baudrates:
|
||||
|
||||
.word (7372800 / ( 50 * 16))
|
||||
.word (7372800 / ( 110 * 16))
|
||||
.word (7372800 / ( 269 * 8))
|
||||
.word (7372800 / ( 300 * 16))
|
||||
.word (7372800 / ( 600 * 16))
|
||||
.word (7372800 / ( 1200 * 16))
|
||||
.word (7372800 / ( 2400 * 16))
|
||||
.word (7372800 / ( 4800 * 16))
|
||||
.word (7372800 / ( 9600 * 16))
|
||||
.word (7372800 / ( 19200 * 16))
|
||||
.word (7372800 / ( 38400 * 16))
|
||||
.word (7372800 / ( 57600 * 16))
|
||||
.word (7372800 / ( 115200 * 16))
|
||||
.word (7372800 / ( 230400 * 16))
|
||||
|
||||
.bss
|
||||
|
||||
_rs232_tmp1:
|
||||
.res 1
|
||||
|
||||
.code
|
||||
|
||||
_rs232_params:
|
||||
|
||||
sta _rs232_tmp1 ; save parity
|
||||
|
||||
; reset fifo
|
||||
lda #%10000111
|
||||
sta fifo_fcr
|
||||
|
||||
; that delay thing really needed ?!
|
||||
; (original datasheet mentions a delay here)
|
||||
; ldy #$00
|
||||
; dey
|
||||
; bny *-1
|
||||
|
||||
; set dlab
|
||||
lda #%10000011 ; we assmume 8n1
|
||||
sta fifo_lcr
|
||||
|
||||
jsr popa
|
||||
tay ; save param
|
||||
|
||||
; set baudrate
|
||||
clc
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
lsr a
|
||||
asl a
|
||||
tax
|
||||
lda _rs232_baudrates,x
|
||||
sta fifo_dll
|
||||
lda _rs232_baudrates+1,x
|
||||
sta fifo_dlm
|
||||
|
||||
tya ; param
|
||||
and #$0f
|
||||
ora _rs232_tmp1 ; parity
|
||||
|
||||
; reset dlab
|
||||
sta fifo_lcr
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
; check if byte available, returns AKKU=0 if none
|
||||
|
||||
ss_getlsr:
|
||||
lda fifo_lsr
|
||||
and #$01
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_get (char* b);
|
||||
;/* Get a character from the serial port. If no characters are available, the
|
||||
; * function will return RS_ERR_NO_DATA, so this is not a fatal error.
|
||||
; */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
; get byte (non blocking, returns byte in A or CARRY=1 - error)
|
||||
|
||||
_rs232_get:
|
||||
sta ptr1
|
||||
stx ptr1+1
|
||||
|
||||
jsr ss_getlsr ; check if byte available
|
||||
; bne sk32 ; yes
|
||||
bne sk33 ; yes
|
||||
|
||||
; activate rts
|
||||
lda #%00000011
|
||||
sta fifo_mcr
|
||||
sk32:
|
||||
|
||||
; deactivate rts
|
||||
; lda #%00000001
|
||||
; sta fifo_mcr
|
||||
|
||||
jsr ss_getlsr ; check if byte available
|
||||
bne sk33 ; yes
|
||||
|
||||
; deactivate rts
|
||||
lda #%00000001
|
||||
sta fifo_mcr
|
||||
|
||||
lda #ErrNoData ; no data
|
||||
ldx #0
|
||||
rts
|
||||
sk33:
|
||||
; deactivate rts
|
||||
lda #%00000001
|
||||
sta fifo_mcr
|
||||
|
||||
; get byte
|
||||
ldy #$00
|
||||
lda fifo_rxd
|
||||
sta (ptr1),y
|
||||
|
||||
lda #0 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_put (char b);
|
||||
;/* Send a character via the serial port. There is a transmit buffer, but
|
||||
; * transmitting is not done via interrupt. The function returns
|
||||
; * RS_ERR_OVERFLOW if there is no space left in the transmit buffer.
|
||||
; */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
_rs232_put:
|
||||
tax
|
||||
; transmit buf ready?
|
||||
lda fifo_lsr
|
||||
and #%00100000
|
||||
bne @sk1
|
||||
@sk2:
|
||||
lda #ErrOverflow ; overflow
|
||||
ldx #$00
|
||||
rts
|
||||
@sk1:
|
||||
; reciever ready?
|
||||
lda fifo_msr
|
||||
and #%00010000
|
||||
beq @sk2
|
||||
|
||||
stx fifo_txd
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_pause (void);
|
||||
;/* Assert flow control and disable interrupts. */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
_rs232_pause:
|
||||
; activate rts
|
||||
lda #%00000011
|
||||
sta fifo_mcr
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_unpause (void);
|
||||
;/* Re-enable interrupts and release flow control */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
_rs232_unpause:
|
||||
; deactivate rts
|
||||
lda #%00000001
|
||||
sta fifo_mcr
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
||||
|
||||
;----------------------------------------------------------------------------------------------
|
||||
;unsigned char __fastcall__ rs232_status (unsigned char* status,
|
||||
; unsigned char* errors);
|
||||
;/* Return the serial port status. */
|
||||
;----------------------------------------------------------------------------------------------
|
||||
|
||||
_rs232_status:
|
||||
sta ptr2
|
||||
stx ptr2+1
|
||||
jsr popax
|
||||
sta ptr1
|
||||
stx ptr1+1
|
||||
|
||||
ldy #$00
|
||||
|
||||
; Get status
|
||||
lda fifo_iir
|
||||
and #%00000001
|
||||
sta _rs232_tmp1
|
||||
lda fifo_msr
|
||||
lsr a
|
||||
and #%01010000
|
||||
ora _rs232_tmp1
|
||||
sta _rs232_tmp1
|
||||
lda fifo_lsr
|
||||
and #%00101110
|
||||
ora _rs232_tmp1
|
||||
sta (ptr1),y
|
||||
|
||||
; Get errors
|
||||
lda #$00 ; ok
|
||||
sta (ptr2),y
|
||||
|
||||
lda #$00 ; ok
|
||||
tax
|
||||
rts
|
17
platform/c64/net/tfe-drv-asm.S
Normal file
17
platform/c64/net/tfe-drv-asm.S
Normal file
@ -0,0 +1,17 @@
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
.export _cs8900a_rxtxreg
|
||||
.export _cs8900a_txcmd
|
||||
.export _cs8900a_txlen
|
||||
.export _cs8900a_packetpp
|
||||
.export _cs8900a_ppdata
|
||||
|
||||
|
||||
;---------------------------------------------------------------------
|
||||
|
||||
_cs8900a_rxtxreg = $de00
|
||||
_cs8900a_txcmd = $de04
|
||||
_cs8900a_txlen = $de06
|
||||
_cs8900a_packetpp = $de0a
|
||||
_cs8900a_ppdata = $de0c
|
||||
|
Loading…
Reference in New Issue
Block a user