soft80_hi_charset = $d400
soft80_vram = $d800 ; ram under i/o
soft80_colram = $d800 ; color ram (used for temp. storage)
-soft80_spriteblock = $dc00
+soft80_spriteblock = $dc00 ; 64 bytes reserved for pointer sprite data
+
+; tables for kplot
+soft80_bitmapxlo = $dc40 ; (80 bytes)
+soft80_bitmapxhi = $dc40 + 80 ; (80 bytes)
+soft80_vramlo = $dc40 + 160 ; (25 bytes)
+; align to next page for speed
+soft80_vramhi = $dd00 ; (25 bytes)
+soft80_bitmapylo = $dd00 + 25 ; (25 bytes)
+soft80_bitmapyhi = $dd00 + 50 ; (25 bytes)
+
soft80_bitmap = $e000
charsperline = 80
.include "soft80.inc"
soft80_init:
+ lda soft80_first_init
+ bne @skp
+ jsr firstinit
+@skp:
+ ; the "color voodoo" in other parts of the code relies on the vram and
+ ; colorram being set up as expected, which is why we cant use the
+ ; _bgcolor and _textcolor functions here.
+
+ lda 646 ; use current textcolor
+ and #$0f
+ sta soft80_internal_textcolor
+
+ lda VIC_BG_COLOR0 ; use current bgcolor
+ and #$0f
+ sta soft80_internal_bgcolor
+ asl a
+ asl a
+ asl a
+ asl a
+ ora soft80_internal_textcolor
+ sta CHARCOLOR
+
lda #$3b
sta VIC_CTRL1
lda #$00
lda #$c8
sta VIC_CTRL2
+ jmp soft80_kclrscr
+
+soft80_shutdown:
+ lda #$1b
+ sta VIC_CTRL1
+ lda #$03
+ sta CIA2_PRA
+ lda #$15
+ sta VIC_VIDEO_ADR
+ rts
+
+ .segment "INIT"
+firstinit:
; copy charset to RAM under I/O
- ; FIXME: move charset and this constructor into init segment
sei
lda $01
pha
lda #$34
sta $01
+ inc soft80_first_init
+
lda #>soft80_charset
sta ptr1+1
lda #<soft80_charset
dex
bne @l2
+ ; copy the kplot tables to ram under I/O
+ ;ldx #0 ; is 0
+@l3:
+ lda soft80_tables_data_start,x
+ sta soft80_bitmapxlo,x
+ lda soft80_tables_data_start + (soft80_tables_data_end - soft80_tables_data_start - $100) ,x
+ sta soft80_bitmapxlo + (soft80_tables_data_end - soft80_tables_data_start - $100),x
+ inx
+ bne @l3
+
pla
sta $01
cli
-
- ; the "color voodoo" in other parts of the code relies on the vram and
- ; colorram being set up as expected, which is why we cant use the
- ; _bgcolor and _textcolor functions here.
-
- lda 646 ; use current textcolor
- and #$0f
- sta soft80_internal_textcolor
-
- lda VIC_BG_COLOR0 ; use current bgcolor
- and #$0f
- sta soft80_internal_bgcolor
- asl a
- asl a
- asl a
- asl a
- ora soft80_internal_textcolor
- sta CHARCOLOR
-
- jmp soft80_kclrscr
-
-soft80_shutdown:
- lda #$1b
- sta VIC_CTRL1
- lda #$03
- sta CIA2_PRA
- lda #$15
- sta VIC_VIDEO_ADR
rts
+; the following tables take up 267 bytes, used by kplot
+soft80_tables_data_start:
+
+soft80_bitmapxlo_data:
+ .repeat 80,col
+ .byte <((col/2)*8)
+ .endrepeat
+soft80_bitmapxhi_data:
+ .repeat 80,col
+ .byte >((col/2)*8)
+ .endrepeat
+soft80_vramlo_data:
+ .repeat 25,row
+ .byte <(soft80_vram+(row*40))
+ .endrepeat
+ .byte 0,0,0,0,0,0,0 ; padding to next page
+soft80_vramhi_data:
+ .repeat 25,row
+ .byte >(soft80_vram+(row*40))
+ .endrepeat
+soft80_bitmapylo_data:
+ .repeat 25,row
+ .byte <(soft80_bitmap+(row*40*8))
+ .endrepeat
+soft80_bitmapyhi_data:
+ .repeat 25,row
+ .byte >(soft80_bitmap+(row*40*8))
+ .endrepeat
+
+soft80_tables_data_end:
+
;-------------------------------------------------------------------------------
; FIXME: when the code is fixed to use the "init" segment, these variables must
; be moved into a section other than .bss so they survive after the init
; code has been run.
- .bss
+ .data ; FIXME
soft80_internal_textcolor:
.res 1
soft80_internal_bgcolor:
soft80_internal_cursorxlsb:
.res 1
+ .data
+soft80_first_init:
+ .byte 0 ; flag to check first init, this really must be in .data
stx CURS_Y
sty CURS_X
+ sei
+ lda $01
+ pha
+ lda #$34 ; enable RAM under I/O
+ sta $01
+
; calc pointer to bitmap
lda soft80_bitmapylo,x
clc
adc soft80_vramhi,x
sta CRAM_PTR+1
+ pla
+ sta $01
+ cli
+
@getpos:
ldx CURS_Y
ldy CURS_X
rts
- ; FIXME: the following tables take up 260 bytes, perhaps move them
- ; to 0xdc00... area in ram under i/o
-
- .rodata
-soft80_bitmapxlo:
- .repeat 80,col
- .byte <((col/2)*8)
- .endrepeat
-soft80_bitmapxhi:
- .repeat 80,col
- .byte >((col/2)*8)
- .endrepeat
-soft80_vramlo:
- .repeat 25,row
- .byte <(soft80_vram+(row*40))
- .endrepeat
-soft80_vramhi:
- .repeat 25,row
- .byte >(soft80_vram+(row*40))
- .endrepeat
-soft80_bitmapylo:
- .repeat 25,row
- .byte <(soft80_bitmap+(row*40*8))
- .endrepeat
-soft80_bitmapyhi:
- .repeat 25,row
- .byte >(soft80_bitmap+(row*40*8))
- .endrepeat
-
;-------------------------------------------------------------------------------
; force the init constructor to be imported