title SOL Routinen name ('SOLCPM') include solvdm.lib ; Routinen fuer Spiele des Computers SOL auf dem JOYCE ; Die ESCape-Funktionen sind denen des JOYCE angepasst ; Werner Cirsovius, Maerz 2002 entry SOLon,SOLoff,SOLOS entry CONout,CONsta,CONdat,CONin entry curoff,curon,vidoff,vidon,clrscr,clreol,gotoxy entry $memry,VDM,VDMadr,iniVDM,VDMclr,CHRnew,CHRold ; ; Initialisierung der Routinen ; SOLon: call curoff ; Cursor ausschalten call CHRnew ; Neue Zeichenmatrix call iniVDM ; Vektoren setzen call VDMadr ; Videoadresse ermitteln call VDMclr ; Bildschirm loeschen ret ; ; De-Initialisierung der Routinen ; SOLoff: call clrscr ; Bildschirm loeschen call curon ; Cursor einschalten call CHRold ; Alte Zeichenmatrix ret ; ; Bildschirm-Routinen ; curoff: ld a,'f' jr ..vid ; Cursor aus curon: ld a,'e' jr ..vid ; Cursor ein vidoff: ld a,'q' jr ..vid ; Attribut aus vidon: ld a,'p' jr ..vid ; Attribut ein clreol: ld a,'K' jr ..vid ; Zeile loeschen clrscr: ld a,'E' call CONesc ; Bildschirm loeschen ld a,'H' ..vid: call CONesc ret ; ; Cursor positionieren ; EIN Reg D haelt Zeile, Reg E haelt Spalte ; gotoxy: ld a,'Y' call CONesc ; ESCape Sequenz ld a,d call addoffs ; Zeile setzen ld a,e ; .. und Spalte addoffs: add a,32+1 ; Offset zum Wert jr CONSOLE ; ; Status der Tastatur ermitteln ; AUS Z gesetzt wenn kein Zeichen ansteht ; CONsta: ld a,_STA ; ; Zeichen oder Kontrolle auf Konsole ausgeben ; EIN Akku haelt Zeichen oder Kontrolle ; CONSOLE: push bc push de push hl ld c,.condir ; Function laden ld e,a ; .. und Unterfunktion call BDOS ; Zeichen oder Status pop hl pop de pop bc or a ; Status setzen ret ; ; Auf Tastatur warten ; AUS Akku haelt Zeichen - Z zeigt ^C an ; CONin: call CONsta ; .. einfache Warteschleife jr z,CONin ; Zeichen lesen ; ; Zeichen von Tastatur holen ; AUS Akku haelt Zeichen - Z zeigt ^C an ; CONdat: ld a,_CI call CONSOLE ; Zeichen lesen call toupper ; .. als Grossbuchstabe cp 'C'-'@' ; Vielleicht Abbruch ret nz ; .. nein ; ; De-Initialisierung der Routinen und CP/M Warmstart ; SOLOS: call SOLoff ; SOL ausschalten jp OS ; .. Ende ; ; Zeichenausgaberoutine ; EIN Akku haelt Zeichen ; ; Zeichen im Bereich: ; 0x00..0x1F: spezielle SOL-Zeichen, im JOYCE mit ESCape vorweg ; 0x20..0x7E: Standard ASCII ; 0x7F : --- ; 0x80..0xFE: Wie 0x00..0x7E mit Videoattribut an ; 0xFF : CR und LF (Beue Zeile) ; CONout: cp nl ; Test neue Zeile jr z,cr.lf or a ; Test Videoattribut push af push af call m,vidon ; ... setzen pop af rla ; Attribut ausschalten rrca call CONcot ; .. Zeichen ausgeben pop af call m,vidoff ; Videoattribut ruecksetzen ret cr.lf: ld a,lf push af ld a,cr jr ..ESCput ; ; Zeichen ausgeben mit moeglichem ESCape vorab ; (Der JOYCE benoetigt fuer druckbare Zeichen ; im Bereich 0x00..0x1F ein ESCape Zeichen) ; EIN Akku haelt Zeichen ; CONcot: cp ' ' ; Test spezielles Zeichen jr nc,CONSOLE ; ; Zeichen ausgeben mit ESCape vorab ; EIN Akku haelt Zeichen ; CONesc: push af ld a,esc ..ESCput: call CONSOLE ; ESCape ausgeben pop af call CONSOLE ; .. und Zeichen ret ; ; Zeichen im Akku in Grossbuchstaben wandeln ; toupper: cp 'a' ; Testen a .. z ret c cp 'z'+1 ccf ret c and upper ; Wandeln ret ; ; Diese Routinen sind speziell fuer die Ein/Ausgabe ; in den Videospeicher des SOL gedacht ; ----------------------------------------------------- ; Videopaket initiieren ; iniVDM: ld a,_JP ld (RSTadr),a ; RST-Vektoren vorbereiten ld (RSTadr+RSTlen),a ld (RSTadr+2*RSTlen),a ld (RSTadr+3*RSTlen),a ld (RSTadr+4*RSTlen),a ld hl,RST08@ ld (RSTadr+1),hl ld hl,RST10@ ld (RSTadr+1+RSTlen),hl ld hl,RST18@ ld (RSTadr+1+2*RSTlen),hl ld hl,RST20@ ld (RSTadr+1+3*RSTlen),hl ld hl,RST28@ ld (RSTadr+1+4*RSTlen),hl ret ; ; Ermitteln der Videoadresse. ; SOL schreibt direkt in den Videospeicher. ; Die Adresse wird - mit Pagegrenze - unter VDM abgelegt ; AUS Reg HL haelt Adresse hinter Videospeicheradresse ; VDMadr: ld hl,($memry) ; Hoechste Speicheradresse ld a,l ; Test ob bereits Grenze or a jr z,pagbound ; .. ja inc h ; Naechste Page ld l,0 ; .. Pagegrenze pagbound: ld (VDM),hl ; .. ablegen ld de,vidspc add hl,de ; Naechste Adresse ret ; ; Spielfeld und Bildschirm loeschen ; VDMclr: push af push bc push de push hl call clrscr ; Bildschirm loeschen ld hl,(VDM) ld d,h ld e,l inc de ld bc,vidspc-1 ld (hl),' ' ldir ; Spielfeld loeschen pop hl pop de pop bc pop af ret ; ; ================== RST Vektorroutinen ================== ; ; Alle Routinen erwarten Adressen in den Registerpaaren ; im SOL Videobereich, also 0CC00H - 0CFFFH ; ; -------------------------------------------------------- ; ; Vektor 1 (0008H) : LD A,(HL) ; RST08@: push hl call getVADR ; Adresse ermitteln ld a,(hl) ; .. Byte laden pop hl ret ; ; Vektor 2 (0010H) : LD A,(DE) ; RST10@: ex de,hl call RST08@ ; Byte holen ex de,hl ret ; ; Vektor 3 (0018H) : LD (HL),A ; RST18@: push de push hl push af call getxy ; Koordinaten ermitteln call gotoxy ; Cursor setzen pop af pop hl push hl push af call CONout ; Zeichen auf Bildschirm call getVADR ; Adresse ermitteln pop af ld (hl),a ; Zeichen speichern pop hl pop de ret ; ; Vektor 4 (0020H) : LD (HL),BYTE ; RST20@: pop ix ; Aufrufer Adresse push af ; Akku retten ld a,(ix) ; Byte holen inc ix call RST18@ ; Byte speichern pop af jp (ix) ; Zum Aufrufer ; ; Vektor 5 (0028H) : LD (DE),A ; RST28@: ex de,hl call RST18@ ; Byte speichern ex de,hl ret ; ; -------------------------------------------------------- ; ; Wandlung der SOL Videoadresse in JOYCE Videoadresse ; getVADR: ld a,(VDM+1) ; JOYCE Page add a,h sub high SOLvid ; SOL Page ld h,a ret ; ; Aus Adresse in HL Bildschirmkoordinaten ermitteln ; Reg D haelt Reihe, Reg E haelt Spalte ; Der Bildschirm ist 64 Zeichen breit: ; X/64 -> 4*X/256 ; getxy: push hl add hl,hl ; *2 add hl,hl ; *4 ld a,h ; /256 and maxrow-1 ; Maskieren ld d,a ; .. fuer Reihe pop hl ld a,l and maxcol-1 ; Modulo ld e,a ; .. fuer Spalte ret dseg VDM: ds 2 $memry: ds 2 cseg ; Spezielle Routinen fuer SOL Zeichen auf dem JOYCE ; Die Maschine SOL benutzt spezielle Zeichen im Bereich ; 0x00..0x1F. Am JOYCE ist es relativ einfach, Zeichen ; neu zu definieren, deshalb diese Routinen. ; CHRnew speichert die aktuelle Zeichenmatrix und laedt ; dann die SOL Zeichen ; CHRold laedt die alten JOYCE-Zeichen zurueck dseg ; ; Die Zeichentabelle ; chntab: db _msl ; Geschoss db 00000000b db 00000000b db 11111100b db 01111111b db 01111111b db 11111100b db 00000000b db 00000000b chmtx equ $-chntab ; db _rup ; Rakete hoch db 00011000b db 00100100b db 01000010b db 01000010b db 01000010b db 01111110b db 00000000b db 01011010b ; db _rdw ; Rakete runter db 01011010b db 00000000b db 01111110b db 01000010b db 01000010b db 01000010b db 00100100b db 00011000b ; db _fls ; Speziell db 01100000b db 00011000b db 00000110b db 01111110b db 01100000b db 00011000b db 00000110b db 00000000b ; db _bcr ; Kasten mit Kreuz db 11111111b db 10000001b db 10100101b db 10011001b db 10011001b db 10100101b db 10000001b db 11111111b ; db _bel ; Klingel db 00011000b db 01100110b db 11000011b db 11000011b db 11111111b db 00100100b db 11100111b db 00000000b ; db _arr ; Pfeil rechts db 00000000b db 00000100b db 00000110b db 01111111b db 01111111b db 00000110b db 00000100b db 00000000b ; db _ard ; Pfeil runter db 00011000b db 00011000b db 00011000b db 00011000b db 01111110b db 00111100b db 00011000b db 00011000b ; db _dwn ; Speziell db 00011000b db 00011000b db 01011010b db 00111100b db 10011001b db 01011010b db 00111100b db 00000000b ; db _arl ; Pfeil links db 00000000b db 00100000b db 01100000b db 11111110b db 11111110b db 01100000b db 00100000b db 00000000b ; db _ccr ; Kreis mit Kreuz db 01111100b db 10000010b db 10101010b db 10010010b db 10101010b db 10000010b db 01111100b db 00000000b ; db _cid ; Kreis mit Punkt db 01111100b db 10000010b db 10000010b db 10010010b db 10000010b db 10000010b db 01111100b db 00000000b ; db _sls ; Schraegstrich db 00000001b db 00000010b db 00000100b db 00001000b db 00010000b db 00100000b db 01000000b db 10000000b ; db _bsl ; Schraegstrich, revers db 10000000b db 01000000b db 00100000b db 00010000b db 00001000b db 00000100b db 00000010b db 00000001b ; db _lfb ; Eckige Klammer links db 11110000b db 10000000b db 10000000b db 10000000b db 10000000b db 10000000b db 10000000b db 11110000b ; db _lfr ; Eckige Klammer rechts db 00001111b db 00000001b db 00000001b db 00000001b db 00000001b db 00000001b db 00000001b db 00001111b ; db _aru ; Pfeil hoch db 00011000b db 00111100b db 01111110b db 00011000b db 00011000b db 00011000b db 00011000b db 00000000b ; db _bal ; Ball db 00000000b db 00111000b db 01111100b db 11111110b db 11111110b db 01111100b db 00111000b db 00000000b ; db _hpi ; Spieler db 01001000b db 10010010b db 00100100b db 01001000b db 10010010b db 00100100b db 01001000b db 10010010b ; db _bae ; Grosses AE db 01100110b db 00000000b db 00011000b db 00111100b db 01100110b db 01111110b db 01100110b db 00000000b ; db _ae ; Kleines ae db 01100110b db 00000000b db 01111000b db 00001100b db 01111100b db 11001100b db 01110110b db 00000000b ; db _boe ; Grosses OE db 01100110b db 00000000b db 00111100b db 01100110b db 01100110b db 01100110b db 00111100b db 00000000b ; db _oe ; Kleines oe db 01100110b db 00000000b db 00000000b db 00111100b db 01100110b db 01100110b db 00111100b db 00000000b ; db _bue ; Grosses UE db 01100110b db 00000000b db 01100110b db 01100110b db 01100110b db 01100110b db 00111100b db 00000000b ; db _ue ; Kleines ue db 01100110b db 00000000b db 00000000b db 01100110b db 01100110b db 01100110b db 00111110b db 00000000b ; db _sz ; Deutsches sz db 00111000b db 11000110b db 11000110b db 11111000b db 11000110b db 11000110b db 11111000b db 00000000b ; chlen equ $-chntab chitm equ chlen / chmtx chotab: ds chlen ; Speicher fuer alte Matrizen cseg ; ; Einfache Definition der Zeichenmatrix ; ; Teil 1 : Zu definierende Zeichen abspeichern ; CHRnew: ld hl,cod1 ; Code in den oberen Teil ld de,XBIOS ; .. des Speichers verschieben ld bc,codl1 ldir ; ld hl,(OS+1) ld de,3*(_USERF-1) add hl,de ld (XBIOS+1),hl ; XBIOS Vektor setzen ; call rout1 ; .. Zeichen abspeichern ; ; Teil 2 : Neue Zeichen definieren ; ld hl,cod2 ld de,rout2 ld bc,codl2 ldir ; Neuen Code laden ld hl,chntab jr SOL.. ; ; Teil 3 : Alte Zeichen zurueckladen ; CHRold: ld hl,chotab SOL..: ld (rout2+1),hl ; Tabelle setzen call rout2 ; .. Zeichen zurueckladen ret ; ; =============================================== ; ====== Code im oberen Teil des Speichers ====== ; =============================================== ; ; Code 1: Zu definierende Zeichen abspeichern ; cod1: .phase COMRAM XBIOS: jp $-$ ; XBIOS Vektor buff: ds chmtx ; Aktuelle Zeichenmatrix ; rout1: ld de,chotab ; Adresse der alten Tabelle ld hl,chntab ; .. und der neuen Tabelle ld b,chitm ; Laenge setzen cod1l: push bc push hl push de ld de,buff push de ld a,(hl) ld (de),a ld bc,cc1 call XBIOS ; Alte Matrix laden dw _SCRRUN pop hl pop de ld bc,chmtx push bc ldir ; Matrix retten pop bc pop hl add hl,bc pop bc djnz cod1l ret ; cc1: ld a,(de) ; Zeichen laden inc de ld l,a ld h,0 add hl,hl ; *2 add hl,hl ; *4 add hl,hl ; *8 ld bc,CHRMTX add hl,bc ; Matrix adressieren ld bc,MTRX ldir ; Matrix retten ret .dephase codl1 equ $-cod1 ; ; Code 2: Zeichen definieren ; cod2: .phase COMRAM+3+chmtx rout2: ld hl,$-$ ; Adresse der Tabelle ld b,chitm ; Laenge setzen cod2l: push bc ld de,buff push de ld bc,chmtx ldir ; Matrix umkopieren ex (sp),hl ld bc,cc2 call XBIOS dw _SCRRUN pop hl pop bc djnz cod2l ret ; cc2: ld a,(hl) ; Zeichen laden inc hl push hl ld l,a ld h,0 add hl,hl ; *2 add hl,hl ; *4 add hl,hl ; *8 ld de,CHRMTX add hl,de ; Matrix adressieren push hl pop de pop hl ld bc,MTRX ldir ; Zeichen laden ret .dephase codl2 equ $-cod2 end