title ANSI RSX installieren oder loeschen name ('ANSI') ; Dieses Programm verarbeitet die RSX zu folgendem Programm: ; ANSI.COM, basierend auf Version 0.3 ; (Beinhaltet die RSX ANSI.SYS) ; ------------------------------------------------------------ ; Originalversion: ; (c)1997 Andress Freystatzky ; ; Andress Freystatzky Andress_Freystatzky@sz.maus.de ; Pestalozzistrasse 4 Andress Freystatzky@2:241/534.46 ; 38114 Braunschweig ; ------------------------------------------------------------ ; Modifizierte Version: ; ANSI (c) 1997 Werner Cirsovius und Andress Freystatzky ; ; Werner Cirsovius Cirsovius@dkrz.de ; Hohe Weide 44 ; 20253 Hamburg ; Der Aufruf kann wie folgt aussehen: ; ; ANSI Hilfstext ausgeben und anzeigen, ; ob RSX schon installiert ; ANSI I RSX ANSI.SYS intallieren ; ANSI L RSX ANSI.SYS loeschen ; Aufrufe mit anderen Parametern als 'I' oder ; 'L' geben den Hilfstext aus OS equ 00000h ; BIOS Adresse - Warmstart BDOS equ 00005h ; BDOS Adresse FCBnam equ 0005dh ; Standard FCB .string equ 9 ; Zeichenkette ausgeben .vers equ 12 ; CP/M Version .scb equ 49 ; SCB Werte laden/setzen CPMv equ 30h ; Erwartete CP/M Version @@CO equ 4 ; BIOS Konsolausgabe @@SCB equ 3ah ; Offset zur Adresse des SCB @@COMEM equ 5dh ; Offset zur COMMON Memory Adresse _cBDOS equ 62h ; Offset zur Adresse des BDOS Starts _fBDOS equ -4 ; Offset zur Adresse des 'echten' BDOS _$NXT equ 09h ; RSX Offset: Sprung zur naechsten RSX _$REM equ 0eh ; RSX Offset: Remove Flag _$NAM equ 10h ; RSX Offset: Name der RSX _$ANSI equ 1fh ; RSX Offset: BIOS Vektor _VECLEN equ 3 ; Laenge von 'JP ad16' tab equ 09h lf equ 0ah cr equ 0dh eot equ '$' BR equ 0d0h ; Eckige Klammer links ; beim Joyce im deutschen Zeichensatz ld de,ILL$ENV sub a ; Richtige CPU testen jp pe,fin.mess ; .. nicht Z80 push de ld c,.vers call BDOS ; OS Version holen pop de cp CPMv jr c,fin.mess ; .. nicht CP/M 3.x ld sp,LokStk ; Lokalen Stack laden ld a,(FCBnam) ; Test ob Parameter vorhanden cp 'I' jp z,instRSX ; .. nein, dann RSX installieren cp 'L' ; Test ob RSX loeschen jp z,delRSX ; ; Hilfstext ausgeben und anzeigen, ob RSX schon installiert ; ld de,$HELP call String ; Hilfstext ausgeben call setOSADR ; BDOS Adressen setzen call posRSX ; RSX finden ld hl,NOT$INST jr z,..mess ; .. nicht installiert ld hl,$INST jr ..mess notFND: ld hl,$MISS ..mess: push hl ld de,RSX$MESS call String ; Meldung ausgeben pop de fin.mess: call String jp OS ; ; RSX installieren ; instRSX: call setOSADR ; BDOS Adressen setzen ld a,@@COMEM call getSCB ; COMMON Adresse laden ex de,hl ld hl,(begBDOS) ; Diese RSX Adresse holen or a sbc hl,de ; Sicherstellen, dass Adresse im COMMON ld hl,NO$COMM jr c,..mess ; .. geht nicht ld ix,(begBDOS) ; RSX Adresse holen ld (ix+_$REM),0 ; Remove Flag loeschen ld bc,_$ANSI add ix,bc ; Zum Vektor zeigen push ix ld hl,(OS+1) ; BIOS Basisadresse laden ld de,3*(@@CO-1) add hl,de ; .. zur Konsolausgabe zeigen pop de push hl ld bc,_VECLEN ldir ; Vektor Konsolausgabe umkopieren ex de,hl pop de ld bc,_VECLEN ldir ; Vektor Konsolausgabe neu setzen ld hl,NOW$INST jp ..mess ; ; RSX loeschen ; delRSX: call setOSADR ; BDOS Adressen setzen call posRSX ; RSX finden jp z,notFND ; .. nicht gefunden ld (ix+_$REM),-1 ; Remove Flag setzen ld bc,_$ANSI add ix,bc ; Zum Vektor zeigen push ix ld hl, (OS+1) ; BIOS Basisadresse laden ld de,3*(@@CO-1) add hl,de ; .. zur Konsolausgabe zeigen ex de,hl pop hl ld bc,_VECLEN ldir ; Vektor Konsolausgabe restaurieren ld hl,$REMD jp ..mess ; ; BDOS Adressen aus SCB laden ; ; Da ANSI.COM aus der RSX ANSI.SYS und diesem Programm ANSI.COM ; besteht, muss es mindestens eine RSX geben. Ausserdem muss die ; allererste RSX genau ANSI.SYS ein ; setOSADR: ld a,@@SCB call getSCB ; Adresse des SCB laden push hl pop ix ld l,(ix+_cBDOS) ; Erste Adresse zum BDOS ld h,(ix+_cBDOS+1) ld (cBDOS),hl ld l,0 ld (begBDOS),hl ld l,(ix+_fBDOS) ; .. Adresse ders 'echten' BDOS ld h,(ix+_fBDOS+1) ld (fBDOS),hl call nxtRSX ; Eigene RSX ueberspringen ld de,$FATAL jp z,fin.mess ; .. Fehler call fndRSX ; ANSI.SYS finden ret z ; . . ok ld hl,NOT$1ST jp ..mess ; ; RSX finden - Bei Ende zeigt ^IX auf RSX ; Z gesetzt heisst, dass RSX nicht vorhanden ist ; posRSX: call nxtRSX ; Naechste RSX finden ret z ; .. RSX nicht gefunden call fndRSX ; ANSI.SYS finden jr nz,posRSX ; .. noch nicht die gesuchte RSX xor a inc a ; NZ setzen ret ; ; Die RSX ANSI.SYS finden - Z gesetzt heisst, RSX gefunden ; fndRSX: push ix ld bc,_$NAM add ix,bc ; Zeiger auf Namen push ix pop de pop ix ld hl,RSX$NAM ld b,.nam fnd.loop: ld a,(de) cp (hl) ; Vergleichen ret nz ; .. nicht die gesuchte RSX inc hl inc de djnz fnd.loop ret ; ; Naechste RSX bestimmen - Z gesetzt heisst, keine naechste RSX ; nxtRSX: ld hl,(fBDOS) ; 'Echte' Adresse ld de,(cBDOS) ; .. aktuelle Adresse or a sbc hl,de ; Test ob 'echte' Adresse ret z ; .. ja, dann Fehler ld e,0 push de pop ix ld e,(ix+_$NXT+1) ; Adresse der naechsten RSX ld d,(ix+_$NXT+1+1) ld (cBDOS),de ; .. abspeichern ret ; ; Zeichenkette ^DE auf Konsole ausgeben ; String: ld c,.string call BDOS ; .. simpel ret ; ; Wort aus SCB nach ^HL holen, Offset in Accu ; getSCB: ld de,PB ld (de),a ; Offset eintragen ld c,.scb call BDOS ; Wort aus SCB laden ret ; begBDOS: ds 2 cBDOS: ds 2 fBDOS: ds 2 PB: db 0,0 ; ILL$ENV: db 'Das Programm ben|tigt Z80 CPU und CP/M 3.x',eot $MISS: db 'nicht gefunden',eot $REMD: db 'gel|scht',eot NOT$1ST: db 'ist nicht die erwartetet erste RSX',eot NOT$INST: db 'ist nicht installiert',eot $INST: db 'ist ' NOW$INST: db 'installiert',eot RSX$MESS: db 'RSX ' RSX$NAM: db 'ANSI.SYS' ; Name der RSX .nam equ $-RSX$NAM db ' ',eot $FATAL: db 'Keine RSX gefunden - mit GENCOM die RSX installieren',eot NO$COMM: db 'RSX ANSI.SYS kann nicht installiert werden, ' db 'da die Startadresse f}r die RSX' db cr,lf db 'nicht im COMMON Bereich des Speichers liegt. ' db 'Abhilfe: Vorhandene RSXen l|sehen' db eot $HELP: db 'Das Programm ANSI.COM installiert eine RSX ' db '(ANSI.SYS) zur Behandlung von ANSI' db cr,lf db 'Kontrollsequenzen (f}r Zenith Z19/Z29 wie am JOYCE).' db cr,lf db 'Aufrufe:' db cr,lf db tab,'ANSI',tab,'Hilfstext ausgeben und an' db 'zeigen, ob RSX schon installiert' db cr,lf db tab,'ANSI I',tab,'RSX ANSI.SYS intallieren' db cr,lf db tab,'ANSI L',tab,'RSX ANSI.SYS l|schen' db cr,lf db 'Zur Zeit werden folgende Sequenzen unterst}tzt:' db cr,lf db tab,'ESC ',BR,' Pn A',tab,'Cursor nach oben' db cr,lf db tab,'ESC ',BR,' Pn B',tab,'Cursor nach unten' db cr,lf db tab,'ESC ',BR,' Pn C',tab,'Cursor nach rechts' db cr,lf db tab,'ESC ',BR,' Pn D',tab,'Cursor nach links' db cr,lf db tab,'ESC ',BR,' Pl;Pc H',tab,' Oder' db cr,lf db tab,'ESC ',BR,' P1;Pc f',tab,'Cursor positionieren' db cr,lf db tab,'ESC ',BR,' 0 K',tab,'Vom Cursor bis zum Ende ' db 'der Zeile l|schen (Default)' db cr,lf db tab,'ESC ',BR,' 1 K',tab,'Vom Anfang der Zeile ' db 'bis zum Cursor l|schen' db cr,lf db tab,'ESC ',BR,' 2 K',tab,'Komplette Zeile l|schen' db cr,lf db tab,'ESC ',BR,' 0 J',tab,'Vom Cursor bis zum Ende ' db 'des Bildschirms l|schen (Default)' db cr,lf db tab,'ESC ',BR,' 1 J',tab,'Vom Anfang des Bildschirms ' db 'bis zum Cursor l|schen' db cr,lf db tab,'ESC ',BR,' 2 J',tab,'Kompletten Bildschirm l|schen' db cr,lf db tab,'ESC ',BR,' s',tab,tab,'Cursorposition sichern' db cr,lf db tab,'ESC ',BR,' u',tab,tab,'Cursorposition wiederherstellen' db cr,lf db tab,'ESC ',BR,' Pn m',tab,'Pn=0: Invers und Unterstreichung aus' db cr,lf db tab,tab,tab,' 1: Invers an' db cr,lf db tab,tab,tab,'2..9: Unterstreichung ein' db cr,lf,lf,eot ; ds 2*32 LokStk: end ab,tab,'Cursorposition sichern' db cr,lf db tab,'ESC ',BR,' u',tab,tab,'Cursorposition wiederherstellen' db cr,lf db tab,'ESC ',BR,' Pn m',tab,'Pn=0: Invers und Unterstreichung aus' db cr,lf db tab,tab,tab,' 1: Invers an' db cr,lf db tab,tab,tab,'2..9: Unterstreichung ein' db cr,lf,lf,eot ; ds 2*32 LokStk: end