| 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
 |