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 |