]> git.sur5r.net Git - cc65/commitdiff
added size optimized monochrom soft80 driver
authormrdudz <mrdudz@users.noreply.github.com>
Mon, 19 Oct 2015 00:49:32 +0000 (02:49 +0200)
committermrdudz <mrdudz@users.noreply.github.com>
Mon, 19 Oct 2015 00:49:32 +0000 (02:49 +0200)
libsrc/c64/extra/soft80mono.s [new file with mode: 0644]
libsrc/c64/soft80mono_cgetc.s [new file with mode: 0644]
libsrc/c64/soft80mono_color.s [new file with mode: 0644]
libsrc/c64/soft80mono_conio.s [new file with mode: 0644]
libsrc/c64/soft80mono_cputc.s [new file with mode: 0644]
libsrc/c64/soft80mono_kclrscr.s [new file with mode: 0644]
libsrc/c64/soft80mono_kplot.s [new file with mode: 0644]

diff --git a/libsrc/c64/extra/soft80mono.s b/libsrc/c64/extra/soft80mono.s
new file mode 100644 (file)
index 0000000..f91f4a7
--- /dev/null
@@ -0,0 +1,55 @@
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; import/overload stubs for the monochrome soft80 implementation
+;
+; - optimized for size, almost 1k smaller footprint than the full color version
+; - textcolor() sets one common text color for the whole screen
+;
+        .include "../soft80.inc"
+
+        ; soft80mono_cgetc.s
+        .import soft80mono_cgetc
+        .export _cgetc := soft80mono_cgetc              ; cgetc.s
+
+        ; soft80mono_color.s
+        .import soft80mono_textcolor
+        .import soft80mono_bgcolor
+        .export _textcolor := soft80mono_textcolor      ; color.s
+        .export _bgcolor := soft80mono_bgcolor          ; color.s
+
+        ; soft80mono_cputc.s
+        .import soft80mono_cputc
+        .import soft80mono_cputcxy
+        .import soft80mono_cputdirect
+        .import soft80mono_putchar
+        .import soft80mono_newline
+        .import soft80mono_plot
+        .export _cputc := soft80mono_cputc              ; cputc.s
+        .export _cputcxy := soft80mono_cputcxy          ; cputc.s
+        .export cputdirect := soft80mono_cputdirect     ; cputc.s
+        .export putchar := soft80mono_putchar           ; cputc.s
+        .export newline := soft80mono_newline           ; cputc.s
+        .export plot := soft80mono_plot                 ; cputc.s
+
+        ; soft80mono_kclrscr.s
+        .import soft80mono_kclrscr
+        .export _clrscr := soft80mono_kclrscr           ; clrscr.s
+        .export CLRSCR := soft80mono_kclrscr            ; kernal func (c64.inc)
+
+        ; soft80mono_kplot.s
+        .import soft80mono_kplot
+        .export PLOT := soft80mono_kplot                ; kplot.s
+
+        ; soft80_kscreen.s
+        .import soft80_screensize
+        .export screensize := soft80_screensize         ; _scrsize.s
+        .export SCREEN := soft80_screensize             ; kernal func (kernal.s)
+
+        ; VIC sprite data for the mouse pointer
+        .export         mcb_spritememory  := soft80_spriteblock
+        .export         mcb_spritepointer := (soft80_vram + $03F8)
+
+        ; Chars used by chline () and cvline ()
+        .exportzp       chlinechar = CH_HLINE
+        .exportzp       cvlinechar = CH_VLINE
diff --git a/libsrc/c64/soft80mono_cgetc.s b/libsrc/c64/soft80mono_cgetc.s
new file mode 100644 (file)
index 0000000..d99dc77
--- /dev/null
@@ -0,0 +1,66 @@
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; high level implementation for the monochrome soft80 implementation
+;
+; char cgetc (void);
+;
+
+        .export         soft80mono_cgetc
+        .import         soft80mono_internal_cellcolor, soft80mono_internal_cursorxlsb
+        .import         soft80mono_internal_nibble
+        .import         cursor
+        .importzp       tmp1
+
+        .include        "c64.inc"
+        .include        "soft80.inc"
+
+soft80mono_cgetc:
+        lda     KEY_COUNT       ; Get number of characters
+        bne     @L3             ; Jump if there are already chars waiting
+
+        jsr     invertcursor    ; set cursor on or off accordingly
+
+@L1:    lda     KEY_COUNT       ; wait for key
+        beq     @L1
+
+        jsr     invertcursor    ; set cursor on or off accordingly
+
+@L3:    jsr     KBDREAD         ; Read char and return in A
+        ldx     #0
+        rts
+
+; Switch the cursor on or off (invert)
+
+invertcursor:
+        lda     cursor
+        bne     @invert
+        rts
+@invert:
+
+        sei
+        lda     $01             ; enable RAM under I/O
+        pha
+        lda     #$34
+        sta     $01
+
+        ldy     #$00
+        ldx     soft80mono_internal_cursorxlsb
+@lp1:
+        lda     (SCREEN_PTR),y
+        eor     soft80mono_internal_nibble,x
+        sta     (SCREEN_PTR),y
+        iny
+        cpy     #8
+        bne     @lp1
+
+        pla
+        sta     $01             ; enable I/O
+        cli
+        rts
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import soft80mono_init
+conio_init      = soft80mono_init
diff --git a/libsrc/c64/soft80mono_color.s b/libsrc/c64/soft80mono_color.s
new file mode 100644 (file)
index 0000000..aa24957
--- /dev/null
@@ -0,0 +1,65 @@
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; high level implementation for the monochrome soft80 implementation
+;
+; unsigned char __fastcall__ textcolor (unsigned char color);
+; unsigned char __fastcall__ bgcolor (unsigned char color);
+;
+
+        .export         soft80mono_textcolor, soft80mono_bgcolor
+        .import         soft80mono_internal_cellcolor, soft80mono_internal_bgcolor
+
+        .importzp       tmp1
+
+        .include        "c64.inc"
+        .include        "soft80.inc"
+
+soft80mono_textcolor:
+        ldx     CHARCOLOR                       ; get old value
+        stx     tmp1                            ; save old value
+        sta     CHARCOLOR                       ; set new value
+
+mkcharcolor:
+        lda     soft80mono_internal_bgcolor
+        asl     a
+        asl     a
+        asl     a
+        asl     a
+        ora     CHARCOLOR
+        sta     soft80mono_internal_cellcolor   ; text/bg combo for new chars
+
+        sei
+        ldy     $01
+        lda     #$34                            ; enable RAM under I/O
+        sta     $01
+
+        lda     soft80mono_internal_cellcolor
+        ; clear loop for vram
+        ldx     #$00
+@lp1:
+        sta     soft80_vram,x
+        sta     soft80_vram+$100,x
+        sta     soft80_vram+$200,x
+        sta     soft80_vram+$2e8,x
+        inx
+        bne     @lp1
+
+        sty     $01
+        cli
+
+        lda     tmp1                            ; get old value
+        rts
+
+soft80mono_bgcolor:
+        ldx     soft80mono_internal_bgcolor     ; get old value
+        stx     tmp1                            ; save old value
+        sta     soft80mono_internal_bgcolor     ; set new value
+
+        jmp     mkcharcolor
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import soft80mono_init
+conio_init      = soft80mono_init
diff --git a/libsrc/c64/soft80mono_conio.s b/libsrc/c64/soft80mono_conio.s
new file mode 100644 (file)
index 0000000..759b280
--- /dev/null
@@ -0,0 +1,168 @@
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; Low level init code for the monochrome soft80 screen output/console input
+;
+
+        .constructor    soft80mono_init, 8
+        .destructor     soft80mono_shutdown
+
+        .import         soft80mono_kclrscr, soft80_charset
+        .export         soft80mono_internal_bgcolor, soft80mono_internal_cellcolor
+        .export         soft80mono_internal_cursorxlsb
+        .export         soft80mono_internal_nibble
+
+        .importzp       ptr1, ptr2, ptr3
+
+        .include        "c64.inc"
+        .include        "soft80.inc"
+
+soft80mono_init:
+        lda     soft80mono_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     CHARCOLOR                       ; use current textcolor
+        and     #$0f                            ; make sure the upper nibble is 0s
+        sta     CHARCOLOR
+
+        lda     VIC_BG_COLOR0                   ; use current bgcolor
+        and     #$0f
+        sta     soft80mono_internal_bgcolor
+        asl     a
+        asl     a
+        asl     a
+        asl     a
+        ora     CHARCOLOR
+        sta     soft80mono_internal_cellcolor
+
+        lda     #$3b
+        sta     VIC_CTRL1
+        lda     #$00
+        sta     CIA2_PRA
+        lda     #$68
+        sta     VIC_VIDEO_ADR
+        lda     #$c8
+        sta     VIC_CTRL2
+
+        jmp     soft80mono_kclrscr
+
+soft80mono_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
+        sei
+        lda     $01
+        pha
+        lda     #$34
+        sta     $01
+
+        inc     soft80mono_first_init
+
+        lda     #>soft80_charset
+        sta     ptr1+1
+        lda     #<soft80_charset
+        sta     ptr1
+        lda     #>soft80_lo_charset
+        sta     ptr2+1
+        lda     #<soft80_lo_charset
+        sta     ptr2
+        lda     #>soft80_hi_charset
+        sta     ptr3+1
+        lda     #<soft80_hi_charset
+        sta     ptr3
+
+        ldx     #4
+@l2:
+        ldy     #0
+@l1:
+        lda     (ptr1),y
+        sta     (ptr2),y
+        asl     a
+        asl     a
+        asl     a
+        asl     a
+        sta     (ptr3),y
+        iny
+        bne     @l1
+        inc     ptr1+1
+        inc     ptr2+1
+        inc     ptr3+1
+        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
+        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:
+
+;-------------------------------------------------------------------------------
+        .segment "INITBSS"
+soft80mono_internal_cellcolor:
+        .res 1
+soft80mono_internal_bgcolor:
+        .res 1
+soft80mono_internal_cursorxlsb:
+        .res 1
+
+        .data
+soft80mono_first_init:
+        .byte 0         ; flag to check first init, this really must be in .data
+
+        .rodata
+soft80mono_internal_nibble:
+        .byte $f0, $0f
+
diff --git a/libsrc/c64/soft80mono_cputc.s b/libsrc/c64/soft80mono_cputc.s
new file mode 100644 (file)
index 0000000..c89362c
--- /dev/null
@@ -0,0 +1,205 @@
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; high level implementation for the monochrome soft80 implementation
+;
+; void cputcxy (unsigned char x, unsigned char y, char c);
+; void cputc (char c);
+;
+
+        .export         soft80mono_cputcxy, soft80mono_cputc
+        .export         soft80mono_cputdirect, soft80mono_putchar
+        .export         soft80mono_newline, soft80mono_plot
+
+        .import         popa, _gotoxy
+
+        .import         soft80mono_kplot
+        .import         soft80mono_internal_bgcolor, soft80mono_internal_cellcolor
+        .import         soft80mono_internal_cursorxlsb, soft80mono_internal_nibble
+
+        .importzp       tmp4, tmp3, ptr2
+
+        .include        "c64.inc"
+        .include        "soft80.inc"
+
+soft80mono_cputcxy:
+        pha                     ; Save C
+        jsr     popa            ; Get Y
+        jsr     _gotoxy         ; Set cursor, drop x
+        pla                     ; Restore C
+
+; Plot a character - also used as internal function
+
+soft80mono_cputc:
+        cmp     #$0A            ; CR?
+        bne     L1
+
+        lda     #0
+        sta     CURS_X
+
+        ; Set cursor position, calculate RAM pointers
+soft80mono_plot:
+        ldx     CURS_Y
+        ldy     CURS_X
+        clc
+        jmp     soft80mono_kplot        ; Set the new cursor
+
+L1:     cmp     #$0D                    ; LF?
+        beq     soft80mono_newline      ; Recalculate pointers
+
+        ; shortcut for codes < $80 ... codes $20-$7f can be printed directly,
+        ; codes $00-$1f are control codes which are not printable and thus may
+        ; give undefined result.
+        tay
+        bpl     @L10
+
+        ; codes $80-$ff must get converted like this:
+        ; $80-$9f  ->   dont care (control codes)
+        ; $a0-$bf  ->   $00-$1f
+        ; $c0-$df  ->   $60-$7f
+        ; $e0-$ff  ->   $00-$1f
+
+        ora     #%01000000      ; $40
+        clc
+        adc     #%00100000      ; $20
+        and     #%01111111      ; $7f
+@L10:
+
+        ; entry point for direct output of a character. the value passed in
+        ; akku must match the offset in the charset.
+        ; - the following may not modify tmp1
+soft80mono_cputdirect:
+        jsr     soft80mono_putchar      ; Write the character to the screen
+
+        ; Advance cursor position
+        iny                             ; contains CURS_X
+        cpy     #charsperline
+        beq     @L3
+
+        sty     CURS_X
+        tya
+        and     #$01
+        sta     soft80mono_internal_cursorxlsb
+        bne     @L4
+
+        lda     SCREEN_PTR
+        clc
+        adc     #8
+        sta     SCREEN_PTR
+        bcc     @L4
+        inc     SCREEN_PTR+1
+@L4:
+        rts
+@L3:
+        inc     CURS_Y          ; new line
+        ldy     #0              ; + cr
+        sty     CURS_X
+        jmp     soft80mono_plot
+
+        ; - the following may not modify tmp1
+soft80mono_newline:
+
+        lda     SCREEN_PTR
+        clc
+        adc     #<(40*8)
+        sta     SCREEN_PTR
+
+        lda     SCREEN_PTR+1
+        adc     #>(40*8)
+        sta     SCREEN_PTR+1
+
+        inc     CURS_Y
+        rts
+
+;-------------------------------------------------------------------------------
+; output one character in internal encoding without advancing cursor position
+; generic entry point
+;
+; - the following may not modify tmp1
+; in:   A: charcode
+; out:  Y: CURS_X
+;
+soft80mono_putchar:
+        sta     tmp3            ; save charcode
+
+        sei
+        lda     $01
+        pha
+        lda     #$34
+        sta     $01             ; enable RAM under I/O
+
+        ldy     #$00            ; will be $00 from now on
+
+        ldx     soft80mono_internal_cursorxlsb
+        lda     chardatal,x
+        clc
+        adc     tmp3
+        sta     ptr2
+        lda     chardatah,x
+        adc     #0
+        sta     ptr2+1
+
+        lda     RVS
+        bne     draw_charinvers
+
+        lda     nibble,x
+        sta     tmp3
+
+        ;ldy     #0                      ; is still $00
+@lp1:
+        lda     (SCREEN_PTR),y
+        and     tmp3
+        ora     (ptr2),y
+        sta     (SCREEN_PTR),y
+        clc
+        lda     ptr2
+        adc     #$7f
+        sta     ptr2
+        bcc     @sk1
+        inc     ptr2+1
+@sk1:
+        iny
+        cpy     #8
+        bne     @lp1
+
+draw_back:
+        pla
+        sta     $01
+        cli
+
+        ldy     CURS_X
+        rts
+
+; output inverted character
+draw_charinvers:
+        lda     soft80mono_internal_nibble,x
+        sta     tmp3
+
+        ;ldy     #0                      ; is still $00
+@lp1:
+        lda     (SCREEN_PTR),y
+        ora     tmp3
+        eor     (ptr2),y
+        sta     (SCREEN_PTR),y
+        clc
+        lda     ptr2
+        adc     #$7f
+        sta     ptr2
+        bcc     @sk1
+        inc     ptr2+1
+@sk1:
+        iny
+        cpy     #8
+        bne     @lp1
+        jmp     draw_back
+
+        .rodata
+chardatal:
+        .byte <soft80_hi_charset
+        .byte <soft80_lo_charset
+chardatah:
+        .byte >soft80_hi_charset
+        .byte >soft80_lo_charset
+nibble:
+        .byte $0f, $f0
+
diff --git a/libsrc/c64/soft80mono_kclrscr.s b/libsrc/c64/soft80mono_kclrscr.s
new file mode 100644 (file)
index 0000000..99243c6
--- /dev/null
@@ -0,0 +1,63 @@
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; lowlevel kclrscr for the monochrome soft80 implementation
+;
+
+        .export         soft80mono_kclrscr
+        .import         soft80mono_kplot
+        .import         soft80mono_internal_bgcolor, soft80mono_internal_cellcolor
+        .importzp       ptr1
+
+        .include        "c64.inc"
+        .include        "soft80.inc"
+
+soft80mono_kclrscr:
+
+        lda     #<soft80_bitmap
+        sta     ptr1
+        lda     #>soft80_bitmap
+        sta     ptr1+1
+
+        lda     #$ff
+
+        ldx     #$1f
+@lp2:
+        ldy     #0
+@lp1:
+        sta     (ptr1),y
+        iny
+        bne     @lp1
+        inc     ptr1+1
+        dex
+        bne     @lp2
+
+        ;ldx     #$00
+@lp3:
+        sta     soft80_bitmap+$1e40,x
+        inx
+        bne     @lp3
+
+        sei
+        ldy     $01
+        lda     #$34                            ; enable RAM under I/O
+        sta     $01
+
+        lda     soft80mono_internal_cellcolor
+        ; clear loop for vram
+        ;ldx     #$00
+@lp4:
+        sta     soft80_vram,x
+        sta     soft80_vram+$100,x
+        sta     soft80_vram+$200,x
+        sta     soft80_vram+$2e8,x
+        inx
+        bne     @lp4
+
+        sty     $01
+        cli
+
+        ldx     #0
+        ldy     #0
+        clc
+        jmp     soft80mono_kplot
diff --git a/libsrc/c64/soft80mono_kplot.s b/libsrc/c64/soft80mono_kplot.s
new file mode 100644 (file)
index 0000000..b987924
--- /dev/null
@@ -0,0 +1,52 @@
+
+;
+; Groepaz/Hitmen, 19.10.2015
+;
+; lowlevel kplot function for the monochrome soft80 implementation
+;
+
+        .export         soft80mono_kplot
+        .import         soft80mono_internal_cursorxlsb
+
+        .include        "c64.inc"
+        .include        "soft80.inc"
+
+soft80mono_kplot:
+        bcs     @getpos
+
+        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_bitmapxlo,y
+        sta     SCREEN_PTR
+        lda     soft80_bitmapyhi,x
+        adc     soft80_bitmapxhi,y
+        sta     SCREEN_PTR+1
+
+        tya
+        and     #1
+        sta     soft80mono_internal_cursorxlsb
+
+        pla
+        sta     $01
+        cli
+
+@getpos:
+        ldx     CURS_Y
+        ldy     CURS_X
+        rts
+
+;-------------------------------------------------------------------------------
+; force the init constructor to be imported
+
+        .import soft80mono_init
+conio_init      = soft80mono_init