From 0543ecabe2624e0ec73df1e090f386c6d96a3a1e Mon Sep 17 00:00:00 2001 From: mrdudz Date: Thu, 28 Dec 2017 01:58:03 +0100 Subject: [PATCH 1/5] added peek functions for soft80 --- libsrc/c64/extra/soft80.s | 19 ++++ libsrc/c64/extra/soft80mono.s | 19 ++++ libsrc/c64/soft80_cpeekc.s | 168 +++++++++++++++++++++++++++++ libsrc/c64/soft80_cpeekcolor.s | 19 ++++ libsrc/c64/soft80_cpeekrevers.s | 10 ++ libsrc/c64/soft80_cpeeks.s | 71 ++++++++++++ libsrc/c64/soft80mono_cpeekcolor.s | 17 +++ 7 files changed, 323 insertions(+) create mode 100644 libsrc/c64/soft80_cpeekc.s create mode 100644 libsrc/c64/soft80_cpeekcolor.s create mode 100644 libsrc/c64/soft80_cpeekrevers.s create mode 100644 libsrc/c64/soft80_cpeeks.s create mode 100644 libsrc/c64/soft80mono_cpeekcolor.s diff --git a/libsrc/c64/extra/soft80.s b/libsrc/c64/extra/soft80.s index d445c85c0..0ea28cfaf 100644 --- a/libsrc/c64/extra/soft80.s +++ b/libsrc/c64/extra/soft80.s @@ -15,6 +15,22 @@ .export _textcolor := soft80_textcolor ; color.s .export _bgcolor := soft80_bgcolor ; color.s + ; soft80_cpeekc.s + .import soft80_cpeekc + .export _cpeekc := soft80_cpeekc ; cpeekc.s + + ; soft80_cpeekcolor.s + .import soft80_cpeekcolor + .export _cpeekcolor := soft80_cpeekcolor ; cpeekcolor.s + + ; soft80_cpeekrevers.s + .import soft80_cpeekrevers + .export _cpeekrevers := soft80_cpeekrevers ; cpeekrevers.s + + ; soft80_cpeeks.s + .import soft80_cpeeks + .export _cpeeks := soft80_cpeeks ; cpeeks.s + ; soft80_cputc.s .import soft80_cputc .import soft80_cputcxy @@ -50,3 +66,6 @@ ; Chars used by chline () and cvline () .exportzp chlinechar = CH_HLINE .exportzp cvlinechar = CH_VLINE + + .import return1 + .export _doesclrscrafterexit := return1 diff --git a/libsrc/c64/extra/soft80mono.s b/libsrc/c64/extra/soft80mono.s index 6fd2c687c..700cbcb6c 100644 --- a/libsrc/c64/extra/soft80mono.s +++ b/libsrc/c64/extra/soft80mono.s @@ -18,6 +18,22 @@ .export _textcolor := soft80mono_textcolor ; color.s .export _bgcolor := soft80mono_bgcolor ; color.s + ; soft80mono_cpeekc.s + .import soft80_cpeekc + .export _cpeekc := soft80_cpeekc ; cpeekc.s + + ; soft80mono_cpeekcolor.s + .import soft80mono_cpeekcolor + .export _cpeekcolor := soft80mono_cpeekcolor ; cpeekcolor.s + + ; soft80mono_cpeekrevers.s + .import soft80_cpeekrevers + .export _cpeekrevers := soft80_cpeekrevers ; cpeekrevers.s + + ; soft80mono_cpeeks.s + .import soft80_cpeeks + .export _cpeeks := soft80_cpeeks ; cpeeks.s + ; soft80mono_cputc.s .import soft80mono_cputc .import soft80mono_cputcxy @@ -53,3 +69,6 @@ ; Chars used by chline () and cvline () .exportzp chlinechar = CH_HLINE .exportzp cvlinechar = CH_VLINE + + .import return1 + .export _doesclrscrafterexit := return1 diff --git a/libsrc/c64/soft80_cpeekc.s b/libsrc/c64/soft80_cpeekc.s new file mode 100644 index 000000000..2801ade97 --- /dev/null +++ b/libsrc/c64/soft80_cpeekc.s @@ -0,0 +1,168 @@ + + .export soft80_cpeekc, soft80_cpeekchar + + .include "c64.inc" + .include "soft80.inc" + + .macpack longbranch + + .segment "CODE" + +soft80_cpeekc: + jsr soft80_cpeekchar + ldx #0 + rts + +soft80_cpeekchar: + + sei + ;;dec $01 ;; assumed = $36 + ;;dec $01 ;; assumed = $36 + lda #$34 + sta $01 + + lda CURS_X + and #$01 + + jne @l1a + + ; test non-inverted character (left side) + + ldx #0 +@l2aa: + ldy #0 + +;; stx $d020 + + .repeat 8,line +;; jsr readdirect + lda (SCREEN_PTR),y + and #$f0 +; sta $e100,y + cmp soft80_hi_charset+(line*$80),x +; cmp #0 + bne @l2b + .if (line < 7) + iny + .endif + .endrepeat + + +@backok: +;inc $d020 +; inc $01 +; inc $01 + lda #$36 + sta $01 + cli + txa ; return char in A + ; sec +; sbc #$20 + ldx #$00 ; revers flag +;inc $d020 + rts +@l2b: +;jmp * + inx + cpx #$80 + jne @l2aa + + ; test inverted character (left side) + + ldx #0 +@l2aa2: + ldy #0 + +;; stx $d020 + + .repeat 8,line +;; jsr readdirect + lda (SCREEN_PTR),y + and #$f0 + eor #$f0 + cmp soft80_hi_charset+(line*$80),x +; cmp #0 + bne @l2b2 + .if (line < 7) + iny + .endif + .endrepeat + +@backokrevers: +;inc $d020 +; inc $01 +; inc $01 + lda #$36 + sta $01 + cli + txa ; return char in A + ; sec +; sbc #$20 + ldx #$01 ; revers flag +;inc $d020 + rts + +@l2b2: + inx + cpx #$80 + jne @l2aa2 + +@backerr: +;inc $d020 + ;; inc $01 +;; inc $01 + lda #$36 + sta $01 + cli + ldx #0 + txa + + rts + + ; test non-inverted character (right side) + +@l1a: + ldx #0 +@l1aa: + ldy #0 + .repeat 8,line +;; jsr readdirect + lda (SCREEN_PTR),y + and #$0f + eor soft80_lo_charset+(line*$80),x + bne @l2bb + .if line < 7 + iny + .endif + .endrepeat + jmp @backok +@l2bb: + inx + cpx #$80 + bne @l1aa + + ; test inverted character (right side) + + ldx #0 +@l1aa2: + ldy #0 + .repeat 8,line +;; jsr readdirect + lda (SCREEN_PTR),y + and #$0f + eor #$0f + eor soft80_lo_charset+(line*$80),x + bne @l2bb2 + .if line < 7 + iny + .endif + .endrepeat + jmp @backokrevers +@l2bb2: + inx + cpx #$80 + bne @l1aa2 + + + jmp @backerr + diff --git a/libsrc/c64/soft80_cpeekcolor.s b/libsrc/c64/soft80_cpeekcolor.s new file mode 100644 index 000000000..c8f1c6e43 --- /dev/null +++ b/libsrc/c64/soft80_cpeekcolor.s @@ -0,0 +1,19 @@ +; +; 2017-12-27, Groepaz +; +; unsigned char cpeekcolor (void); +; + + .export soft80_cpeekcolor + + .include "c64.inc" + .include "soft80.inc" + + .segment "CODE" + +soft80_cpeekcolor: + ldy #0 + lda (CRAM_PTR),y + and #$0f + ldx #0 + rts diff --git a/libsrc/c64/soft80_cpeekrevers.s b/libsrc/c64/soft80_cpeekrevers.s new file mode 100644 index 000000000..6fc0c166a --- /dev/null +++ b/libsrc/c64/soft80_cpeekrevers.s @@ -0,0 +1,10 @@ + + .import soft80_cpeekchar + + .export soft80_cpeekrevers + +soft80_cpeekrevers: + jsr soft80_cpeekchar + txa + ldx #0 + rts diff --git a/libsrc/c64/soft80_cpeeks.s b/libsrc/c64/soft80_cpeeks.s new file mode 100644 index 000000000..837afef1e --- /dev/null +++ b/libsrc/c64/soft80_cpeeks.s @@ -0,0 +1,71 @@ +; +; 2017-12-27, groepaz +; +; void cpeeks (char* s, unsigned length); +; + .export soft80_cpeeks + .import soft80_cpeekc, soft80_kplot, popax + + .importzp ptr1, ptr2 + + .include "c64.inc" + .include "soft80.inc" + +soft80_cpeeks: + eor #<$FFFF ; counting a word upward is faster + sta ptr2 ; so, we use -(length + 1) + txa + eor #>$FFFF + sta ptr2+1 + + jsr popax + sta ptr1 + stx ptr1+1 + + ; save current cursor position + lda CURS_X + pha + lda CURS_Y + pha + + ; get the string +@lp: + jsr soft80_cpeekc + ldy #0 + sta (ptr1),y + + ; advance cursor position + ldy CURS_X + ldx CURS_Y + iny + cpy #charsperline + bne @sk2 + ldy #0 + inx +@sk2: + sty CURS_X + stx CURS_Y + clc + jsr soft80_kplot + + inc ptr1 + bne @sk + inc ptr1+1 +@sk: + inc ptr2 + bne @lp + inc ptr2+1 + bne @lp + + ; terminate the string + lda #0 + ldy #0 + sta (ptr1),y + + ; restore the cursor position + pla + tax ; CURS_Y + pla + tay ; CURS_X + clc + jmp soft80_kplot diff --git a/libsrc/c64/soft80mono_cpeekcolor.s b/libsrc/c64/soft80mono_cpeekcolor.s new file mode 100644 index 000000000..a03875a74 --- /dev/null +++ b/libsrc/c64/soft80mono_cpeekcolor.s @@ -0,0 +1,17 @@ +; +; 2017-12-27, Groepaz +; +; unsigned char cpeekcolor (void); +; + + .export soft80mono_cpeekcolor + + .include "c64.inc" + .include "soft80.inc" + + .segment "CODE" + +soft80mono_cpeekcolor: + lda CHARCOLOR + ldx #0 + rts From 142ba126348839e6a01bf160b61628a30ac4ba94 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Thu, 28 Dec 2017 01:58:58 +0100 Subject: [PATCH 2/5] updated testprog --- testcode/lib/cpeek-test.c | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/testcode/lib/cpeek-test.c b/testcode/lib/cpeek-test.c index 5f3bfc524..ffcdb8bf1 100644 --- a/testcode/lib/cpeek-test.c +++ b/testcode/lib/cpeek-test.c @@ -113,6 +113,17 @@ static unsigned char testCPeekC (char ch) return 1; } + /* toggle revers mode every few chars so cpeekc gets tested for both */ + revers ((ch >> 3) & 1); + + /* output additional space every now and then, that way not only even or only + odd half of the character cell will be tested */ +#if defined(__C64__) + if ((width == 80) && ((ch % 17) == 0)) { + cputc(' '); + } +#endif + /* Output the char to the screen. */ cputc (ch); @@ -141,8 +152,8 @@ static unsigned char testCPeekC (char ch) */ ch2_c = peekChWithoutTranslation (); if ((ch2_c != ch2_b) -#if defined(__C128__) - /* VDC memory is not accessable */ +#if defined(__C128__) || defined(__C64__) + /* VDC memory is not accessable, soft80 has no "videoram" */ && (width == 40) #endif ){ @@ -230,7 +241,7 @@ int main (void) int ret = 0; clrscr (); - revers (1); + revers (0); textcolor(1); bgcolor(0); screensize (&width, &i); @@ -261,7 +272,7 @@ int main (void) #if defined (__CBM610__) || defined (__PET__) cprintf("\n\rno COLOR_RAM\n\r"); -#elif defined (__C128__) +#elif defined (__C128__) || defined (__C64__) if (width == 40) { cprintf("\n\rCOLOR_RAM at $%04x\n\r", COLOR_RAM); } else { From f207a60365c7a226f907b3218f73e3163be1223d Mon Sep 17 00:00:00 2001 From: mrdudz Date: Thu, 28 Dec 2017 02:26:23 +0100 Subject: [PATCH 3/5] some cleanup --- libsrc/c64/soft80_cpeekc.s | 57 +++++++++------------------------ libsrc/c64/soft80_cpeekrevers.s | 5 +++ 2 files changed, 20 insertions(+), 42 deletions(-) diff --git a/libsrc/c64/soft80_cpeekc.s b/libsrc/c64/soft80_cpeekc.s index 2801ade97..63ad635e7 100644 --- a/libsrc/c64/soft80_cpeekc.s +++ b/libsrc/c64/soft80_cpeekc.s @@ -1,3 +1,8 @@ +; +; 2017-12-28, Groepaz +; +; char cpeekc (void); +; .export soft80_cpeekc, soft80_cpeekchar @@ -16,8 +21,6 @@ soft80_cpeekc: soft80_cpeekchar: sei - ;;dec $01 ;; assumed = $36 - ;;dec $01 ;; assumed = $36 lda #$34 sta $01 @@ -32,105 +35,77 @@ soft80_cpeekchar: @l2aa: ldy #0 -;; stx $d020 - .repeat 8,line -;; jsr readdirect lda (SCREEN_PTR),y and #$f0 -; sta $e100,y cmp soft80_hi_charset+(line*$80),x -; cmp #0 bne @l2b .if (line < 7) iny .endif .endrepeat - @backok: -;inc $d020 -; inc $01 -; inc $01 lda #$36 sta $01 cli txa ; return char in A - ; sec -; sbc #$20 ldx #$00 ; revers flag -;inc $d020 rts @l2b: -;jmp * inx cpx #$80 jne @l2aa ; test inverted character (left side) - + ldx #0 @l2aa2: ldy #0 -;; stx $d020 - .repeat 8,line -;; jsr readdirect lda (SCREEN_PTR),y and #$f0 eor #$f0 cmp soft80_hi_charset+(line*$80),x -; cmp #0 bne @l2b2 .if (line < 7) iny .endif .endrepeat - + @backokrevers: -;inc $d020 -; inc $01 -; inc $01 lda #$36 sta $01 cli txa ; return char in A - ; sec -; sbc #$20 ldx #$01 ; revers flag -;inc $d020 rts - + @l2b2: inx cpx #$80 jne @l2aa2 - + @backerr: -;inc $d020 - ;; inc $01 -;; inc $01 lda #$36 sta $01 cli ldx #0 txa - rts ; test non-inverted character (right side) - + @l1a: ldx #0 @l1aa: ldy #0 .repeat 8,line -;; jsr readdirect lda (SCREEN_PTR),y and #$0f eor soft80_lo_charset+(line*$80),x - bne @l2bb + bne @l2bb .if line < 7 iny .endif @@ -140,19 +115,18 @@ soft80_cpeekchar: inx cpx #$80 bne @l1aa - + ; test inverted character (right side) - + ldx #0 @l1aa2: ldy #0 .repeat 8,line -;; jsr readdirect lda (SCREEN_PTR),y and #$0f eor #$0f eor soft80_lo_charset+(line*$80),x - bne @l2bb2 + bne @l2bb2 .if line < 7 iny .endif @@ -162,7 +136,6 @@ soft80_cpeekchar: inx cpx #$80 bne @l1aa2 - - + jmp @backerr diff --git a/libsrc/c64/soft80_cpeekrevers.s b/libsrc/c64/soft80_cpeekrevers.s index 6fc0c166a..779636ed5 100644 --- a/libsrc/c64/soft80_cpeekrevers.s +++ b/libsrc/c64/soft80_cpeekrevers.s @@ -1,3 +1,8 @@ +; +; 2017-12-28, Groepaz +; +; unsigned char cpeekrevers (void); +; .import soft80_cpeekchar From 783408080cd89ec954b5bab65d56625e90b9294e Mon Sep 17 00:00:00 2001 From: mrdudz Date: Thu, 28 Dec 2017 17:52:27 +0100 Subject: [PATCH 4/5] convert to petscii --- libsrc/c64/soft80_cpeekc.s | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/libsrc/c64/soft80_cpeekc.s b/libsrc/c64/soft80_cpeekc.s index 63ad635e7..576d50fc1 100644 --- a/libsrc/c64/soft80_cpeekc.s +++ b/libsrc/c64/soft80_cpeekc.s @@ -15,6 +15,13 @@ soft80_cpeekc: jsr soft80_cpeekchar + ; 0-1F -> A0-BF + ; 20-7F -> 20-7F + cmp #$20 + bcs @sk + ;clc + adc #$a0 +@sk: ldx #0 rts From 4abe12c729330dda3822b0356dbdf0737829d097 Mon Sep 17 00:00:00 2001 From: mrdudz Date: Mon, 1 Jan 2018 14:01:25 +0100 Subject: [PATCH 5/5] fix spelling --- testcode/lib/cpeek-test.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/testcode/lib/cpeek-test.c b/testcode/lib/cpeek-test.c index ffcdb8bf1..aef4cb4e3 100644 --- a/testcode/lib/cpeek-test.c +++ b/testcode/lib/cpeek-test.c @@ -153,7 +153,7 @@ static unsigned char testCPeekC (char ch) ch2_c = peekChWithoutTranslation (); if ((ch2_c != ch2_b) #if defined(__C128__) || defined(__C64__) - /* VDC memory is not accessable, soft80 has no "videoram" */ + /* VDC memory is not accessible, soft80 has no "videoram" */ && (width == 40) #endif ){