case on mcopy ansi.mac dummy start end RDMAINRAM gequ $E0C002 ; Read from main memory RDCARDRAM gequ $E0C003 ; Read from auxiliary memory WRMAINRAM gequ $E0C004 ; Write to main memory WRCARDRAM gequ $E0C005 ; Write to auxiliary memory tables privdata ; ; each line is 160 pixels. ; top/bottom margin is 4 lines (4*160 pixels) rows anop dc i2'0*8*160+4*160+$2000' dc i2'1*8*160+4*160+$2000' dc i2'2*8*160+4*160+$2000' dc i2'3*8*160+4*160+$2000' dc i2'4*8*160+4*160+$2000' dc i2'5*8*160+4*160+$2000' dc i2'6*8*160+4*160+$2000' dc i2'7*8*160+4*160+$2000' dc i2'8*8*160+4*160+$2000' dc i2'9*8*160+4*160+$2000' dc i2'10*8*160+4*160+$2000' dc i2'11*8*160+4*160+$2000' dc i2'12*8*160+4*160+$2000' dc i2'13*8*160+4*160+$2000' dc i2'14*8*160+4*160+$2000' dc i2'15*8*160+4*160+$2000' dc i2'16*8*160+4*160+$2000' dc i2'17*8*160+4*160+$2000' dc i2'18*8*160+4*160+$2000' dc i2'19*8*160+4*160+$2000' dc i2'20*8*160+4*160+$2000' dc i2'21*8*160+4*160+$2000' dc i2'22*8*160+4*160+$2000' dc i2'23*8*160+4*160+$2000' dc i2'24*8*160+4*160+$2000' ; ; columns are simply x * 2 ; end cursor_data privdata cursor_offset dc i2'0' cursor_bits dc i2'0' end ; ;ReverseScrollRegion(line1, line2) ; ReverseScrollRegion START line2 equ 9 line1 equ 7 _rtlb equ 3 _d equ 1 using tables ; brk $ea phb phd tsc tcd lda rows,x clc ; dec a ldx rows,x pha ; ; mvn: ; do { src[y++] = dest[x++]; } while (--c != 0xffff) ; ; mvp: ; do { src[y--] = dest[x--]; } while (--c != 0xffff) ; y = dest address = $2000 + 640 + (line2 + 1) * 8 * 160 -1 ; x = src address = dest - 160*8 ldx rows,x dec a tay sec sbc #160*8 tax pla ; length mvp $e10000,$e10000 ; ; now empty first line ; ldx rows,x clc ; dec a ldx rows,x pha ; src address = $2000 + line1 ; ldx #$e12000+1920 ; src address ; ldy #$e12000+640 ; dest address ; dest = $2000 + 640 + line1 * 8 * 160 ; src = dest + 1280 ldx rows,x tay clc adc #8*160 tax pla ; length mvn $e10000,$e10000 ; ; now empty last line ; ldx line2 dex dex jsr _ClearLine exit anop lda <_rtlb sta 23*8*160 ldx #$e12000+1920 ; src address ldy #$e12000+640 ; dest address ; ldx #$2000+1280 ; ldy #$2000 mvn $e10000,$e10000 ; ; now empty outline #24 ; ldx #23 jsr _ClearLine plb rtl END ; clear line in X (which has been pre-multiplied) _ClearLine PRIVATE using tables lda >rows,x tax lda #0 sta >$e10000,x ; stick a 0 in there txy ; destination address (src + 2) iny iny lda #8*160-3 ; length -1 mvn $e10000,$e10000 rts END ; ; ClearLine(int line_no); clears the line ; ClearLine START line equ 7 _rtlb equ 3 _d equ 1 ; brk $ea phb phd tsc tcd lda rows,x clc ldx rows,x dec a dec a pha ; save length ldx rows,x tax tay iny iny lda #0 sta >$e10000,x pla ; restore length mvn $e10000,$e10000 exit anop lda <_rtlb+2 sta rows,x clc adc start tax loop anop stz |0,x stz |160,x stz |320,x stz |480,x stz |640,x stz |800,x stz |960,x stz |1120,x inx inx dey bne loop exit anop lda <_rtlb+2 sta rows,x clc adc xx tay ; ; $e12000 + pos = location to start drawing the character ; ; ; each char takes up 16 bytes :. the offset is (char - $20) * 16 ; ldx char lda >CHAR_SPACE,x eor CHAR_SPACE+2,x eor CHAR_SPACE+4,x eor CHAR_SPACE+6,x eor CHAR_SPACE+8,x eor CHAR_SPACE+10,x eor CHAR_SPACE+12,x eor CHAR_SPACE+14,x eor $e10000,x stz cursor_offset exit rtl end ShowCursor start using cursor_data using tables yy equ 9 xx equ 7 _rtlb equ 3 _d equ 1 phb phd tsc tcd ldx cursor_offset beq off * hide old cursor. lda cursor_bits sta >$e10000,x stz cursor_offset off anop lda $e10000,x sta cursor_bits lda #-1 sta >$e10000,x exit anop lda _rtlb+2 sta yy lda _rtlb sta xx pld pla pla plb rtl end ;Cursor START ;StartCursor ENTRY ; pha ;; ~ReadBParam #$2f ; pla ; sta blinkRate ; stz savedX ; stz savedY ;; ~SetHeartBeat #CursorHB ; rtl ;StopCursor ENTRY ;; ~DelHeartBeat #CursorHB ; rtl ;notSafe ENTRY ; ds 2 ;blinkRate ds 2 ;savedX ds 2 ;savedY ds 2 ;CursorHB anop ; dc i4'0' ;count dc i2'30' ; dc h'5AA5' ; longa off ; phb ; phk ; plb ; php ;; long ai ; lda notSafe ; bne exit ; lda Xpos ; cmp savedX ; bne moved ; lda Ypos ; cmp savedY ; bne moved ; bra exit ;moved jsr drawCursor ;exit anop ; plp ; plb ; clc ; rtl ;drawCursor anop ; rts ; END