acme/examples/me/cursor.a

109 lines
2.0 KiB
Plaintext
Raw Normal View History

;ACME 0.94.4
; ab hier liegt die Cursorsteuerung
; A = screenx, Y = screeny
!zone
crsrset sta .m ; buffer x
iny ; adjust height
iny
iny
sty .n ; buffer y
jsr crsroff
lda #0 ; clear Hi
sta vtemp + 1
.n = * + 1: lda #MODIFIED8 ; y
asl ; *2
asl ; *4
rol vtemp + 1
asl ; *8
rol vtemp + 1
asl ; *16
rol vtemp + 1
sta vtemp ; stash Lo
ldy vtemp + 1 ; copy Hi
sty vtemp + 2
asl ; *32
rol vtemp + 2
asl ; *64
rol vtemp + 2
adc vtemp ; + 16er-Lo
sta vtemp ; 80er-Lo in vtemp
bcc + ; page
inc vtemp + 1
clc
+
.m = * + 1: adc #MODIFIED8 ; x
sta vtemp ; store Lo
lda vtemp + 1 ; get 16er-Hi
adc vtemp + 2 ; add 64er-Hi
adc #attrhi ; add base
sta vtemp + 1 ; store Hi
!zone
crsron lda conreg ; buffert CR
sta .m
+bank15
jsr vpntcrsr ; set address
+wait_for_vdc
lda reg ; get attribute
sta tcolor ; buffer it
jsr vpntcrsr ; set address
lda clrcrsr ; get crsr
+wait_for_vdc
sta reg ; set crsr
.m = * + 1: lda #MODIFIED8 ; bank
sta conreg ; restore CR
rts
!zone
crsroff lda conreg ; buffer CR
sta .m
+bank15
jsr vpntcrsr ; set address
lda tcolor ; get attribute
+wait_for_vdc
sta reg ; set attribute
.m = * + 1: lda #MODIFIED8 ; bank
sta conreg ; restore CR
rts
; push data
!zone
crsrnew ldx crsrheap ; get stackpointer
lda vtemp ; get low
sta crsrheap, x ; push
lda vtemp + 1 ; get high
sta crsrheap + 1, x ; push
inx ; inc stackpointer
inx
stx crsrheap ; set stackpointer
jsr crsroff
!zone
crsrhide ldx #$3f ; place cursor
stx vtemp + 1 ; outside visible
ldx #$ff ; area
stx vtemp
rts
!zone
crsrold ldx crsrheap ; get stackpointer
dex ; previous entry !
dex
lda crsrheap, x ; get lo
sta vtemp ; set lo
lda crsrheap + 1, x ; get hi
sta vtemp + 1 ; set hi
stx crsrheap ; set stackpointer
jmp crsron
!zone
crsrinit ldx #1 ; init cursorstack
stx crsrheap
jmp crsrhide ; and hide cursor
crsrheap !fill 33, 33
vpntcrsr +ldax vtemp
jmp ramaccess ; set vdc