1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-11-26 12:49:21 +00:00

- kbhit() test is working and returns a character.

- fine tuned the veralayers.c demonstration program.
- fine tuned clearline(), which will clear the current line of conio_cursor_y and reposition x at the start of the line.
This commit is contained in:
FlightControl 2021-01-10 21:30:46 +01:00
parent 9fd668bba5
commit cdf564574a
3 changed files with 255 additions and 48 deletions

View File

@ -2191,3 +2191,127 @@ sta {c1}
tya tya
and {c1} and {c1}
sta {c1} sta {c1}
//FRAGMENT vbuz1=_bnot_vbuz2
lda {z2}
eor #$ff
sta {z1}
//FRAGMENT vbuz1=_bnot_vbuaa
eor #$ff
sta {z1}
//FRAGMENT vbuz1=_bnot_vbuxx
txa
eor #$ff
sta {z1}
//FRAGMENT vbuz1=_bnot_vbuyy
tya
eor #$ff
sta {z1}
//FRAGMENT vbuaa=_bnot_vbuz1
lda {z1}
eor #$ff
//FRAGMENT vbuaa=_bnot_vbuaa
eor #$ff
//FRAGMENT vbuaa=_bnot_vbuxx
txa
eor #$ff
//FRAGMENT vbuaa=_bnot_vbuyy
tya
eor #$ff
//FRAGMENT vbuxx=_bnot_vbuz1
lda {z1}
eor #$ff
tax
//FRAGMENT vbuxx=_bnot_vbuaa
eor #$ff
tax
//FRAGMENT vbuxx=_bnot_vbuxx
txa
eor #$ff
tax
//FRAGMENT vbuxx=_bnot_vbuyy
tya
eor #$ff
tax
//FRAGMENT vbuyy=_bnot_vbuz1
lda {z1}
eor #$ff
tay
//FRAGMENT vbuyy=_bnot_vbuaa
eor #$ff
tay
//FRAGMENT vbuyy=_bnot_vbuxx
txa
eor #$ff
tay
//FRAGMENT vbuyy=_bnot_vbuyy
tya
eor #$ff
tay
//FRAGMENT vbuc1_lt_vbuz1_then_la1
lda #{c1}
cmp {z1}
bcc {la1}
//FRAGMENT vbuz1=pbuz2_derefidx_vbuz3
ldy {z3}
lda ({z2}),y
sta {z1}
//FRAGMENT vbuaa=pbuz1_derefidx_vbuz2
ldy {z2}
lda ({z1}),y
//FRAGMENT vbuxx=pbuz1_derefidx_vbuz2
ldy {z2}
lda ({z1}),y
tax
//FRAGMENT vbuyy=pbuz1_derefidx_vbuz2
ldy {z2}
lda ({z1}),y
tay
//FRAGMENT vbuz1=pbuz2_derefidx_vbuaa
tay
lda ({z2}),y
sta {z1}
//FRAGMENT vbuaa=pbuz1_derefidx_vbuaa
tay
lda ({z1}),y
//FRAGMENT vbuxx=pbuz1_derefidx_vbuaa
tay
lda ({z1}),y
tax
//FRAGMENT vbuyy=pbuz1_derefidx_vbuaa
tay
lda ({z1}),y
tay
//FRAGMENT vbuz1=pbuz2_derefidx_vbuxx
txa
tay
lda ({z2}),y
sta {z1}
//FRAGMENT vbuaa=pbuz1_derefidx_vbuxx
txa
tay
lda ({z1}),y
//FRAGMENT vbuxx=pbuz1_derefidx_vbuxx
txa
tay
lda ({z1}),y
tax
//FRAGMENT vbuyy=pbuz1_derefidx_vbuxx
txa
tay
lda ({z1}),y
tay
//FRAGMENT vbuz1=pbuz2_derefidx_vbuyy
lda ({z2}),y
sta {z1}
//FRAGMENT vbuaa=pbuz1_derefidx_vbuyy
lda ({z1}),y
//FRAGMENT vbuxx=pbuz1_derefidx_vbuyy
lda ({z1}),y
tax
//FRAGMENT vbuyy=pbuz1_derefidx_vbuyy
lda ({z1}),y
tay
//FRAGMENT vwuz1=_word_vbuaa
sta {z1}
lda #0
sta {z1}+1

View File

@ -45,12 +45,46 @@ void conio_x16_init() {
// Return true if there's a key waiting, return false if not // Return true if there's a key waiting, return false if not
unsigned char kbhit(void) { unsigned char kbhit(void) {
// CIA#1 Port A: keyboard matrix columns and joystick #2
char* const CIA1_PORT_A = 0xdc00; char ch = 0;
// CIA#1 Port B: keyboard matrix rows and joystick #1. char* chptr = &ch;
char* const CIA1_PORT_B = 0xdc01;
*CIA1_PORT_A = 0; char* IN_DEV = $028A; // Current input device number
return ~*CIA1_PORT_B; char* GETIN = $FFE4; // CBM GETIN API
kickasm(uses chptr, uses IN_DEV, uses GETIN) {{
jsr _kbhit
bne L3
jmp continue1
.var via1 = $9f60 //VIA#1
.var d1pra = via1+1
_kbhit:
ldy d1pra // The count of keys pressed is stored in RAM bank 0.
stz d1pra // Set d1pra to zero to access RAM bank 0.
lda $A00A // Get number of characters from this address in the ROM of the CX16 (ROM 38).
sty d1pra // Set d1pra to previous value.
rts
L3:
ldy IN_DEV // Save current input device
stz IN_DEV // Keyboard
phy
jsr GETIN // Read char, and return in .A
ply
sta chptr // Store the character read in ch
sty IN_DEV // Restore input device
ldx #>$0000
rts
continue1:
nop
}}
return ch;
} }
// Set the color for the background. The old color setting is returned. // Set the color for the background. The old color setting is returned.
@ -283,10 +317,12 @@ void cputln() {
void clearline() { void clearline() {
// Select DATA0 // Select DATA0
unsigned byte* conio_addr = CONIO_SCREEN_TEXT;
conio_addr += conio_cursor_y*256;
*VERA_CTRL &= ~VERA_ADDRSEL; *VERA_CTRL &= ~VERA_ADDRSEL;
// Set address // Set address
*VERA_ADDRX_L = <conio_line_text; *VERA_ADDRX_L = <conio_addr;
*VERA_ADDRX_M = >conio_line_text; *VERA_ADDRX_M = >conio_addr;
*VERA_ADDRX_H = VERA_INC_1; *VERA_ADDRX_H = VERA_INC_1;
char color = ( conio_backcolor << 4 ) | conio_textcolor; char color = ( conio_backcolor << 4 ) | conio_textcolor;
for( unsigned int c=0;c<CONIO_WIDTH; c++ ) { for( unsigned int c=0;c<CONIO_WIDTH; c++ ) {
@ -294,6 +330,7 @@ void clearline() {
*VERA_DATA0 = ' '; *VERA_DATA0 = ' ';
*VERA_DATA0 = color; *VERA_DATA0 = color;
} }
conio_cursor_x = 0;
} }
// Insert a new line, and scroll the lower part of the screen down. // Insert a new line, and scroll the lower part of the screen down.

View File

@ -1,53 +1,99 @@
#include <printf.h> #include <printf.h>
void main() { void main() {
textcolor(BLUE);
textcolor(WHITE);
backcolor(BLACK); backcolor(BLACK);
clrscr(); clrscr();
// This statement sets the base of the display layer 1 at VRAM address 0x0200
setscreenlayermapbase(0,0x20);
screenlayer(0);
clrscr();
screenlayer(1); screenlayer(1);
gotoxy(0,0);
gotoxy(0,16); gotoxy(0,16);
textcolor(RED);
unsigned int width = screensizex();
unsigned int height = screensizey();
printf("vera card width = %u; height = %u\n", width, height);
printf("dc video = %x\n", *VERA_DC_VIDEO);
printf("vera card layer 0 enabled = %x\n", screenlayerenabled(0));
printf("vera card mapbase layer 0 = %x\n", getscreenlayermapbase(0));
printf("l0 config = %x\n", *VERA_L0_CONFIG);
printf("l0 tilebase = %x\n", *VERA_L0_TILEBASE);
printf("l0 vscroll l = %x\n", *VERA_L0_HSCROLL_L);
printf("l0 vscroll h = %x\n", *VERA_L0_HSCROLL_H);
printf("vera card layer 1 enabled = %x\n", screenlayerenabled(1));
printf("vera card mapbase layer 1 = %x\n", getscreenlayermapbase(1));
printf("l1 config = %x\n", *VERA_L1_CONFIG);
printf("l1 tilebase = %x\n", *VERA_L1_TILEBASE);
printf("l1 vscroll l = %x\n", *VERA_L1_HSCROLL_L);
printf("l1 vscroll h = %x\n", *VERA_L1_HSCROLL_H);
textcolor(BLUE);
//disablescreenlayer1();
screenlayerenable(0);
printf("dc video = %x\n", *VERA_DC_VIDEO);
printf("vera card layer 0 enabled = %x\n", screenlayerenabled(0));
printf("vera card layer 1 enabled = %x\n", screenlayerenabled(1));
printf("vera card mapbase layer 0 = %x\n", getscreenlayermapbase(0));
printf("vera card mapbase layer 1 = %x\n", getscreenlayermapbase(1));
printf("vera card mapbase layer 1 = %x\n", getscreenlayermapbase(1));
screenlayer(0);
gotoxy(0,0);
textcolor(GREEN); textcolor(GREEN);
printf("this program demonstrates the layer functionality in text mode.\n");
// Here we use the screensizex and screensizey functions to show the width and height of the text screen.
printf("vera card width = %u; height = %u\n", screensizex(), screensizey());
// This is the content of the main controller registers of the VERA of layer 1.
// Layer 1 is the default layer that is activated in the CX16 at startup.
// It displays the characters in 1BPP 16x16 color mode!
printf("vera dc video = %x\n", *VERA_DC_VIDEO);
printf("vera layer 1 config = %x\n", *VERA_L1_CONFIG);
printf("vera layer 1 enabled = %x\n", screenlayerenabled(1));
printf("vera layer 1 mapbase = %x, tilebase = %x\n", getscreenlayermapbase(1), *VERA_L1_TILEBASE);
printf("vera layer 1 vscroll high = %x, low = %x\n", *VERA_L1_HSCROLL_H, *VERA_L1_HSCROLL_L);
// Wait for a keypress and after clear the line!
textcolor(YELLOW);
printf("press a key");
while(!kbhit());
clearline();
// Now we continue with demonstrating the layering!
// We set the mapbase of layer 0 to an address in VRAM.
// We copy the tilebase address from layer 1, so that we reference to the same tilebase.
// We print a text on layer 0, which of course, won't yet be displayed,
// because we haven't activated layer 0 on the VERA.
// But the text will be printed and awaiting to be displayer later, once we activate layer 0!
// But first, we also print the layer 0 VERA configuration.
// This statement sets the base of the display layer 1 at VRAM address 0x0200
setscreenlayermapbase(0,0x20); // Set the map base to address 0x04000
*VERA_L0_CONFIG = *VERA_L1_CONFIG; *VERA_L0_CONFIG = *VERA_L1_CONFIG;
*VERA_L0_TILEBASE = *VERA_L1_TILEBASE; *VERA_L0_TILEBASE = *VERA_L1_TILEBASE;
printf("this is printed on layer 0");
//screenlayerdisable(0); printf("vera dc video = %x\n", *VERA_DC_VIDEO);
printf("vera layer 0 config = %x\n", *VERA_L0_CONFIG);
printf("vera layer 0 enabled = %x\n", screenlayerenabled(0));
printf("vera layer 0 mapbase = %x, tilebase = %x\n", getscreenlayermapbase(0), *VERA_L0_TILEBASE);
printf("vera layer 0 vscroll high = %x, low = %x\n", *VERA_L0_HSCROLL_H, *VERA_L0_HSCROLL_L);
// Now we print the layer 0 text on the layer 0!
screenlayer(0); // We set conio to output to layer 0 instead of layer 1!
clrscr(); // We clear the screen of layer 0!
textcolor(BLUE);
backcolor(WHITE);
gotoxy(19,4);
printf(" ");
gotoxy(19,5);
printf(" this is printed on layer 0 !!! ");
gotoxy(19,6);
printf(" ");
gotoxy(0,40);
screenlayer(1); // Now we ask conio again to output to layer 1!
// Wait for a keypress and after clear the line!
textcolor(YELLOW);
backcolor(BLACK);
printf("press a key to show layer 0 and show the text!");
while(!kbhit());
clearline();
// Now we activate layer 0.
screenlayerenable(0);
// Wait for a keypress and after clear the line!
textcolor(YELLOW);
backcolor(BLACK);
printf("press a key to hide layer 0 and hide the text again");
while(!kbhit());
clearline();
screenlayerdisable(0);
clrscr();
textcolor(RED);
backcolor(WHITE);
gotoxy(19,10);
printf(" ");
gotoxy(19,11);
printf(" analyze the code and learn! ");
gotoxy(19,12);
printf(" ");
} }