008
07.09.2022, 20:57 Uhr
Hojoe
|
Ich habe etwas herumprobiert. Wie schon geschrieben wird es mit reinen Bordmitteln schwierig. Ich bin jetzt bei folgendem C Programm gelandet:
Quellcode: | #include <string.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <graphics.h>
char START[] = { 0x7f, 0x7f, 'T', 'E', 'S', 'T', 0x01, 0xcd, 0x00, 0x10 };
// Prototypes void gosub200(uint8_t x, uint8_t vFarbe); void gosub300(uint8_t x, uint8_t hFarbe); void gosub400(); void gosub460(uint8_t spalte, uint8_t f); void gosub600(); uint16_t berechneFarbAdr(uint8_t spalte, uint8_t y) __naked __z88dk_callee; void plotPixel(uint16_t x, uint8_t y, uint16_t farbe);
// Konstanten im RAM / IRM __at (0xb7d3) uint16_t HOR; __at (0xb7d5) uint8_t VERT; __at (0xb7d6) uint8_t FARB;
int main() { textcolor(WHITE); textbackground(WHITE); clrscr(); gotoxy(2, 5); cputs("### Die Farbpalette des KC 85/4 ###"); gosub200(80, 8); gosub200(128, 0); gosub300(176, 0); gosub400(); gosub600(); gotoxy(0,29); cputs("beenden mit ENTER"); while(getch() != 10); return 0; }
// Vordergrundfarben void gosub200(uint8_t x, uint8_t vFarbe) { for( int y = 144; y >= 88; y = y - 8 ) { for( int l = y; l <= y + 3; l++ ) { for( int i = x; i < x + 40; i++ ) { plotPixel(i, l, (vFarbe<<3) | 0x100); } } vFarbe++; } }
// Hintergrundfarben void gosub300(uint8_t x, uint8_t hFarbe) { for( int y = 144; y >= 88; y = y - 8 ) { for( int l = y; l <= y + 3; l++ ) { for( int i = x; i < x + 40; i++ ) { plotPixel(i, l, hFarbe); } } hFarbe++; } }
void gosub400() { gosub460(7, 8); gosub460(27, 0); gotoxy(9,10); cputs("Vordergrund- Hintergrund-"); gotoxy(14,11); cputs("farben farben"); gotoxy(13,23); cputs("Farbnummern"); }
void gosub460(uint8_t spalte, uint8_t f) { for(int l=13; l <= 20; l++) { gotoxy(spalte,l); printf("%2d", f); f++; } }
void gosub600() { draw(216,168, 175,168); draw(175,168, 175,163); draw(175,163, 216,163); draw(216,163, 216,168);
draw(77,255-152, 77,255-148); draw(79,255-154, 77,255-152); draw(168,255-154,79,255-154); draw(170,255-152,168,255-154); draw(170,255-148,170,255-152);
draw(174,255-152, 174,255-148); draw(176,255-154, 174,255-152); draw(216,255-154, 176,255-154); draw(218,255-152, 216,255-154); draw(218,255-148, 218,255-152);
draw(52,255-84, 52,255-92); draw(54,255-82, 52,255-84); draw(120,255-82, 54,255-82); draw(122,255-84, 120,255-82); draw(122,255-89, 122,255-84);
draw(126,255-84, 126,255-89); draw(128,255-82, 126,255-84); draw(232,255-82, 128,255-82); draw(234,255-84, 232,255-82); draw(234,255-92, 234,255-84); }
void plotPixel(uint16_t x, uint8_t y, uint16_t farbe) { if((farbe & 0xff00) > 0) { HOR = x; VERT = y; FARB = farbe & 0xf8; #asm LD A,0x28 out (0x84),a LD (0x1f1),A call 0xf003 db 0x30 ; PUSE Punkt setzen #endasm } else { uint8_t *farbAdr = berechneFarbAdr(x>>3, 255-y); outp(0x84, 0x2a); *farbAdr = farbe; outp(0x84, 0x28); } }
uint16_t berechneFarbAdr(uint8_t spalte, uint8_t y) { #asm POP BC ; Rücksprungadresse POP DE ; y POP HL ; spalte PUSH BC ; Rücksprung Adresse wieder auf den Stack LD H,E call 0xf003 db 0x34 LD A,D CMP 0 ; beim KC85/4 bleibt Register D auf 0 und HL enthält die Adr im Farbspeicher JR Z,end ; beim KC85/3 ist in DE die Adresse im Farbspeicher LD HL,DE end: RET ; in HL befindet sich der Rückgabewert #endasm }
|
Das ganze habe ich mit "zcc +kc -g --list -o Test2.bin -create-app Test2.c" kompiliert. Das läuft auf dem 85/3 und 85/4 im JKCEmu
Holger |