SCREENS ASM ;***************************************
;
; Programm: Screens V1.2
; Window-System f}r
; grafische Bedien-
; oberfl{che
;_______________________________________
;
; Vereinbarungen
;
; 1. Systemrufe
;
CRT EQU 00H
LOOP EQU 12H
INLIN EQU 17H
OSTR EQU 23H
MODU EQU 26H
NL EQU 2CH
DABR EQU 32H
PADR EQU 34H
WININ EQU 3CH
WINAK EQU 3DH
LINE EQU 3EH
MULT EQU 41H
ZKOUT EQU 45H
PV1 EQU 0F003H
PV3 EQU 0F009H
;
; 2. Systemzellen
;
ARGN EQU 0B781H
ARG1 EQU 0B782H
ARG2 EQU 0B784H
ARG3 EQU 0B786H
ARG4 EQU 0B788H
WINNR EQU 0B79BH
WINON EQU 0B79CH
WINLG EQU 0B79EH
CURSO EQU 0B7A0H
CCTL0 EQU 0B7A6H
FARB EQU 0B7D6H
;
; 3. Konstanten
;
CUL EQU 8
CUR EQU 9
LF EQU 0AH
CLS EQU 0CH
PAGE EQU 11H
SCROLL EQU 12H
ESC EQU 1BH
BEEP EQU 707H
CRLF EQU 0A0DH
;_______________________________________
;
; Arbeitsspeicherzuweisung
; Achtung : Screens darf nicht im
; RAM 4 laufen, da dieser
; vom Programm geschaltet
; wird
;
ORG 0BA00H
;_______________________________________
;
WTAB DEFW 0 ;Fenster 0
DEFW 0 ; 1
DEFW 0 ; 2
DEFW 0 ; 3
DEFW 0 ; 4
DEFW 0 ; 5
DEFW 0 ; 6
DEFW 0 ; 7
DEFW 0 ; 8
DEFW 0 ; 9
;_______________________________________
;
; Tab: Einsprungadressen
;
JPTAB JP WIINIT ;Fensterinit
;
JP WISAVE ;Fenster retten
JP ASME ;ASC-Sp. retten
;
JP WILOAD ;Fenster holen
JP MEAS ;ASC-Sp. holen
;
JP SHIFT ;Fenst. schieben
JP INVZEI ;Invert. Zeile
JP INVWIN ;Invert. Fenster
JP PRIAT ;PRINT AT
JP INPAT ;INPUT AT
;
JP RAHM ;Rahmen setzen
JP LRAHM ;Rahmen l|schen
JP SHADOW ;Schattenrahmen
JP LSHAD ;L|sche Schatt.
;
JP ICON ;Icon-Ausgabe
;_______________________________________
;
; UP: Sprungverteiler
;
; IN: UP-Nummer nach CALL JUMP
;
JUMP EXX
EX AF
;
EX (SP),HL
LD A,M
INC HL
EX (SP),HL
;
CP 0FH
JR C,JUMP1
;
EXX
EX AF
;
LD HL,KERR
JP ERRTEX
;
JUMP1 LD E,A
ADD A
ADD E
LD E,A
LD D,0
;
LD HL,JPTAB
ADD HL,DE
PUSH HL
EXX
EX AF
RET
;_______________________________________
;
; UP : abspeichern eines Fensters
;
; IN : A --> Fensternummer
; OUT: HL --> Endadresse der Files
;
WISAVE PUSH BC
PUSH DE
PUSH HL
PUSH AF
;
CALL ASME ;ASCII-Speicher
CALL PIME ;Pixelspeicher
CALL FAME ;Farbspeicher
CALL SWI4 ;Ram4 aktiv
;
POP AF
POP HL
POP DE
POP BC
RET
;_______________________________________
;
; UP : r}cklesen eines Fenster
;
; IN : A --> Fensternummer
; OUT: HL --> Endadresse der Files
;
WILOAD PUSH BC
PUSH DE
PUSH HL
PUSH AF
;
CALL MEAS ;ASCII-Speicher
CALL MEPI ;Pixelspeicher
CALL MEFA ;Farbspeicher
CALL SWI4 ;Ram4 aktiv
;
POP AF
POP HL
POP DE
POP BC
RET
;_______________________________________
;
; UP : Verschiebe aktuelles Fenster auf
; dem Schirm
;
; IN : H --> Verschiebeweite Zeile
; L --> Verschiebeweite Spalte
;
; Bit 7,H
; 0 --> Verschiebe runter
; 1 --> Verschiebe hoch
;
; Bit 7,L
; 0 --> Verschiebe rechts
; 1 --> Verschiebe links
;
SHIFT LD A,(WINNR) ;zwischen-
CALL WISAVE ;speichern
;
LD A,(WINON)
BIT 7,L ;hoch ?
JR NZ,SH1 ;nein
;
ADD A,L ;neuer Fenster-
LD L,A ;anfang
CP 1FH ;}berlauf ?
RET NC ;ja
;
LD A,(WINLG) ;}berlauf bei
ADD L ;Fensterende ?
CP 1FH
RET NC ;ja
JR SH2
;
SH1 RES 7,L
SUB A,L
LD L,A
CP 1
RET C
;
SH2 LD A,(WINON+1)
BIT 7,H ;rechts ?
JR NZ,SH3 ;nein
;
ADD H
LD H,A
CP 27H ;}berlauf ?
RET NC ;ja
;
LD A,(WINLG+1)
ADD H ;}berlauf bei
CP 27H ;Fensterende ?
RET NC ;ja
JR SH4
;
SH3 RES 7,H
SUB H
CP 1
RET C
;
LD H,A
SH4 LD (WINON),HL
LD A,(WINNR) ;gib Fenster
CALL WILOAD ;auf neuer
;Position aus
RET
;_______________________________________
;
; UP : Invertiere Fenster
;
INVWIN LD BC,(WINLG);B=Zeilenz{hl.
LD D,0 ;1.Zeile
;
INVWI1 PUSH DE ;Zeile retten
PUSH BC ;Z{hler retten
;
CALL INVZEI ;Zeile invert.
;
POP BC ;Z{hler holen
POP DE ;Zeile holen
;
INC D ;n{chste Zeile
DJNZ INVWI1 ;alle ?
;
RET
;_______________________________________
;
; UP : Invertiere Zeile
;
; IN : D --> Zeilennummer
;
INVZEI LD BC,(WINLG);B=Spaltenz{hl
LD B,C
;
LD E,0 ;Anfangspos.
LD HL,(WINON)
ADD HL,DE
;
RL H ;Feinzeilen
RL H
RL H
;
INVZE2 PUSH HL ;Pos. retten
POP DE
;
CALL PV1 ;Adresse best.
DEFB PADR
;
PUSH BC
LD B,8
;
INVZE1 LD A,M ;Zeichen
CPL ;invertieren
LD M,A
INC HL
DJNZ INVZE1
;
POP BC
INC E ;n{ch. Spalte
EX DE,HL ;Pos. holen
DJNZ INVZE2 ;alle
;
RET
;_______________________________________
;
; UP : neuinitialisieren eines Fensters
;
; IN : A --> Fensternummer
; HL --> Fensteranfang
; DE --> Fensterl{nge
;
WIINIT PUSH DE
PUSH AF
;
CALL PV1 ;Fensterinit
DEFB WININ
JR NC,WIIN1
;
LD HL,PERR ;Param.-Fehler
JP ERRTEX
;
WIIN1 POP AF
LD IY,WTAB
LD HL,0
;
WIIN3 OR A
JR Z,WIIN2
;
LD E,(IY+0)
INC IY
LD D,(IY+0)
INC IY
ADD HL,DE
DEC A
JR WIIN3
;
WIIN2 POP DE
PUSH HL
;
LD C,E
CALL PV1 ;L{nge ASCII-RAM
DEFB MULT ;des Fensters
;
LD H,B
LD L,A
LD D,B
LD E,A
;
ADD HL,HL ;L{nge Pixelram
ADD HL,HL ;+Farbram des
ADD HL,HL ;Fensters
ADD HL,HL
ADD HL,HL
;
POP DE
PUSH HL
ADD HL,DE
JR NC,WIIN4
;
MERR1 LD HL,MERR
JP ERRTEX
;
WIIN4 POP DE
LD (IY+0),E
INC IY
LD (IY+0),D
RET
;_______________________________________
;
; UP : Icon-ausgabe
;
; IN : A --> Icon-Nummer
; HL --> Icontabelle
; DE --> Position im akt. Fenster
;
; OUT: Icon auf Position
;
ICON PUSH DE
OR A
JR Z,ICON1
;
ICON2 PUSH AF
LD C,M
INC HL
LD D,M
INC HL
;
RLC C
RLC C
RLC C
;
CALL PV1
DEFB MULT
;
LD C,A
ADD HL,BC
;
POP AF
DEC A
JR NZ,ICON2
;
ICON1 LD B,M ;Spalten
INC HL
LD C,M ;Zeilen
INC HL
;
POP DE
ICON5 PUSH DE
LD (CURSO),DE
;
PUSH BC
ICON3 LD (CCTL0),HL
;
LD A,' '
CALL PV1
DEFB CRT
;
LD DE,8
ADD HL,DE
DJNZ ICON3
;
POP BC
POP DE
;
INC D
DEC C
JR NZ,ICON5
;
LD HL,0EE00H
LD (CCTL0),HL
RET
;_______________________________________
;
; UP: Ausgabe ab ... (PRINT AT)
;
; IN: H --> Zeile
; L --> Spalte
; DE --> Anfangsadresse Text
;
PRIAT LD (CURSO),HL
EX DE,HL
LD E,ZKOUT
CALL PV3
RET
;_______________________________________
;
; UP: Eingabe auf... (INPUT AT)
;
; IN: H --> Zeile
; L --> Spalte
;
; OUT: DE --> Anfangsadresse String
;
INPAT LD (CURSO),HL
PUSH HL
CALL PV1
DEFB INLIN
POP HL
LD D,0
ADD HL,DE
EX DE,HL
RET
;_______________________________________
;
; UP: ASCII --> Speicher
;
; IN: A --> Fensternummer
; OUT: HL --> Endadresse
;
ASME PUSH AF
CALL PV1
DEFB WINAK
POP AF
;
CALL LOOKA ;hole L{nge und
;schalte m011
;
LD DE,0 ;Cursor links
;oben
LD BC,(WINLG)
;
ASME2 PUSH DE
ASME1 PUSH HL
;
PUSH BC
CALL PV1 ;ASCII-Adresse
DEFB DABR
POP BC
LD A,M ;hole ASCII-Code
;
POP HL ;Code->Speicher
;
CALL SECOF ;Sector-overflow
;
LD M,A
INC HL
INC E ;n{chste Spalte
DEC C
JR NZ,ASME1
;
LD A,(WINLG);Spaltenz{hler
LD C,A ;neu setzen
;
POP DE ;n{chste Zeile
INC D
DJNZ ASME2
RET
;_______________________________________
;
; UP: Farbe --> Speicher
;
; IN: HL --> Aadr. des Farbfiles
; WINON Fensteranfang
; WINLG Fensterl{nge
; OUT: HL --> Eadr. des Farbfiles
;
FAME CALL FARB1 ;zugriff auf
;Farbram ein
CALL PIME ;}bertrage
CALL FARB1 ;zugriff auf
;Farbram aus
RET
;_______________________________________
;
; UP: Pixel/Farbbytes --> Speicher
;
; IN: HL --> Aadr.
; WINON Fensteranfang
; WINLG Fensterl{nge
; OUT: HL --> Eadr.
;
PIME EX DE,HL
LD HL,(WINON)
LD BC,(WINLG)
;
RLC B ;Spaltenz{hler
RLC B ;*8 (Feinzeilen)
RLC B
;
RLC H
RLC H
RLC H
;
PIME2 PUSH HL ;Pixeladresse
CALL PV1
DEFB PADR
;
PUSH BC
PIME1 LD A,M ;Byte->Speicher
;
EX DE,HL
CALL SECOF ;Sectoroverflow
EX DE,HL
;
LD (DE),A
INC DE
INC HL
DJNZ PIME1
;
POP BC
POP HL
INC L ;n{chste Spalte
DEC C
JR NZ,PIME2
;
EX DE,HL
RET
;_______________________________________
;
; UP: Speicher --> ASCII
;
; IN: A --> Fensternummer
;
; OUT: HL --> Eadr.
;
MEAS PUSH AF
CALL PV1
DEFB WINAK
POP AF
;
CALL LOOKA ;hole L{nge und
;schalte M011
CALL HOME
LD A,PAGE
CALL PV1
DEFB CRT
;
LD DE,(WINON)
LD BC,(WINLG)
;
MEAS1 LD A,M ;hole ASCII-Code
OR A ;Dummy ?
JR NZ,MEAS2;nein
;
LD A,CUR
MEAS2 CALL PV1
DEFB CRT
;
INC HL ;N{chstes Zeich.
CALL SECOF ;Sectoroverflow
DEC C
JR NZ,MEAS1
;
LD A,(WINLG)
LD C,A
DJNZ MEAS1
;
LD A,SCROLL
CALL PV1
DEFB CRT
RET
;_______________________________________
;
; UP: Speicher --> Farbe
;
; IN: HL --> Aadr.
; OUT: HL --> Eadr.
;
MEFA CALL FARB1 ;Zugriff auf
;Farbram ein
CALL MEPI ;}bertrage
CALL FARB1 ;Zugriff auf
;Farbram aus
RET
;_______________________________________
;
; UP: Speicher --> Pixel/Farbe
;
; IN: HL --> Aadr.
; OUT: HL --> Eadr.
;
MEPI EX DE,HL
LD BC,(WINLG)
LD HL,(WINON)
;
RLC B ;stelle Z{hler
RLC B ;auf Feinzeilen
RLC B ;ein
;
RLC H
RLC H
RLC H
;
MEPI2 PUSH BC
PUSH HL
;
CALL PV1 ;Pixeladresse
DEFB PADR
;
MEPI1 LD A,(DE) ;}bertrage
LD M,A
INC HL
INC DE
EX DE,HL
CALL SECOF ;Sectoroverflow
EX DE,HL
DJNZ MEPI1
;
POP HL ;n{chste Zeile
POP BC
INC L
DEC C
JR NZ,MEPI2
EX DE,HL
RET
;_______________________________________
;
; UP: Rahmen setzen/l|schen
;
; IN: WINON Fensteranfang
; WINLG Fensterl{nge
;
RAHM LD A,0 ;Einsprung f}r
JR RAHM1 ;setzen
;
LRAHM LD A,2 ;Einsprung f}r
;l|schen
;
RAHM1 LD (FARB),A
CALL X1
LD (ARG1),HL ;obere Linie
CALL Y1
LD (ARG2),HL
LD (ARG4),HL
CALL X2
LD (ARG3),HL
CALL PLOT
;
CALL X2
LD (ARG1),HL ;rechte Linie
LD (ARG3),HL
CALL Y1
LD (ARG2),HL
CALL Y2
LD (ARG4),HL
CALL PLOT
;
CALL X1
LD (ARG1),HL ;untere Linie
CALL Y2
LD (ARG2),HL
LD (ARG4),HL
CALL X2
LD (ARG3),HL
CALL PLOT
;
CALL X1
LD (ARG1),HL ;linke Linie
LD (ARG3),HL
CALL Y1
LD (ARG2),HL
CALL Y2
LD (ARG4),HL
CALL PLOT
RET
;_______________________________________
;
; UP: Schattenrahmen setzen/l|schen
;
; IN: WINON Fensteranfang
; WINLG Fensterl{nge
;
SHADOW XOR A
JR SHAD1
;
LSHAD LD A,2
;
SHAD1 LD (FARB),A
CALL X2
INC HL
LD (ARG1),HL
LD (ARG3),HL
CALL Y1
DEC HL
DEC HL
DEC HL
LD (ARG2),HL
CALL Y2
DEC HL
DEC HL
DEC HL
LD (ARG4),HL
;
LD B,5
SHA1 PUSH BC
CALL PLOT
LD HL,(ARG1)
INC HL
LD (ARG1),HL
LD (ARG3),HL
POP BC
DJNZ SHA1
;
CALL X1
INC HL
INC HL
INC HL
LD (ARG1),HL
LD HL,(ARG3)
DEC HL
LD (ARG3),HL
CALL Y2
DEC HL
LD (ARG4),HL
LD (ARG2),HL
;
LD B,5
SHA2 PUSH BC
CALL PLOT
LD HL,(ARG2)
DEC HL
LD (ARG2),HL
LD (ARG4),HL
POP BC
DJNZ SHA2
RET
;_______________________________________
;
; UP: Unterprogramme Pixelkoordinaten
;
X1 LD HL,(WINON) ;X1=SA*8-1
CALL MUL8
DEC HL
RET
;
X2 LD HL,(WINON) ;X2=(SE+1)*8
LD A,(WINLG)
ADD L
LD L,A
CALL MUL8
RET
;
Y1 LD HL,(WINON+1)
CALL MUL8 ;Y1=256-ZA*8
XOR A
SUB L
LD L,A
RET
;
Y2 LD HL,(WINON+1)
LD A,(WINLG+1);Y2=254-ZE*8
ADD L
LD L,A
CALL MUL8
LD A,0FFH
SUB L
LD L,A
RET
;_______________________________________
;
; UP: suche Modul M011 64k-RAM
;
; OUT: B --> Steckplatzadresse
; Cy=0 nicht gefunden
;
LOOKM PUSH AF
LD BC,880H
;
LOOKM1 IN A,(C)
CP 0F6H
JR Z,LOOKM2
INC B
LD A,20H ;h|chstm|glicher
CP B ;Modulschacht
JR NZ,LOOKM1
LD HL,MOERR
JP ERRTEX
;
LOOKM2 POP AF
RET
;_______________________________________
;
; UP: hole Adresse aus WTAB und
; schalte M011 entsprechend
;
; IN: A --> Fensternummer
; OUT: HL --> Speicheradresse
;
LOOKA PUSH DE
PUSH BC
PUSH AF
LD HL,0
LD IY,WTAB
;
LOOKA2 OR A ;richtiger
JR Z,LOOKA1;Tabellenplatz ?
;
LD C,(IY+0);hole L{nge
INC IY
LD B,(IY+0)
INC IY
ADD HL,BC ;addiere L{ngen
DEC A ;n{chster Platz
JR LOOKA2
;
LOOKA1 PUSH HL
LD B,6
LOOKA3 SRL H
DJNZ LOOKA3
;
LD B,6
LD A,H
LOOK4 SLA A ;berechne
DJNZ LOOK4 ;Steuerbyte
ADD 3
;
LD C,A
LD A,H
POP HL
LD DE,4000H
LOOKA6 OR A
JR Z,LOOKA5
;
SCF
CCF
SBC HL,DE
DEC A
JR LOOKA6
;
LOOKA5 LD A,C
ADD HL,DE
PUSH HL
CALL LOOKM ;suche M011
LD L,B
LD D,A ;schalte entspr.
LD A,2 ;Adresse
CALL PV1
DEFB MODU
;
LD A,2 ;schalte RAM 4
LD L,4 ;weg
LD D,0
CALL PV1
DEFB MODU
;
POP HL
POP AF
POP BC
POP DE
RET
;_______________________________________
;
; UP: Test auf Sectoroverflow
;
; IN: HL --> Speicheradresse
; OUT: event. Speicherschaltung
;
SECOF PUSH AF
PUSH BC
PUSH DE
PUSH HL
LD A,H
CP 80H
JR C,SECOF1 ;nein
;
CALL LOOKM ;suche Modul
LD L,B ;hole aktuelles
LD A,1 ;Steuerbyte
PUSH BC
CALL PV1
DEFB MODU
POP BC
;
LD A,D ;letzter Sector?
CP 0C3H
JP Z,MERR1 ;ja
;
ADD 40H ;berechne neues
LD D,A ;Steuerbyte und
LD L,B ;schalte Modul
LD A,2 ;entsprechend
CALL PV1
DEFB MODU
POP HL
LD HL,4000H
PUSH HL
;
SECOF1 POP HL
POP DE
POP BC
POP AF
RET
;_______________________________________
;
; UP: schalte RAM4 wieder aktiv
;
SWI4 PUSH AF
PUSH BC
PUSH DE
PUSH HL
;
LD A,2
LD L,4
LD D,3
CALL PV1
DEFB MODU
;
POP HL
POP DE
POP BC
POP AF
RET
;_______________________________________
;
; UP: Cursor auf Fensteranfang
;
HOME PUSH AF
LD A,10H
CALL PV1
DEFB CRT
POP AF
RET
;_______________________________________
;
; UP: Farbspeicher ein-/ausschalten
;
FARB1 PUSH AF
CALL PV1
DEFB OSTR
DEFB ESC
DEFB '9'
DEFB 0
POP AF
RET
;_______________________________________
;
; UP: Multiplikation L*8
;
; IN: L --> Faktor
; OUT: HL --> Produkt
;
MUL8 LD H,0
RLC L
RL H
RLC L
RL H
RLC L
RL H
RET
;_______________________________________
;
; UP: Linie ziehen
;
; IN: ARG1 XA
; ARG2 YA
; ARG3 XE
; ARG4 YE
; FARB Grafikfarbe
;
PLOT CALL PV1
DEFB LINE
RET
;_______________________________________
;
; UP: Ausgabe Fehlermeldungen und
; R}cksprung ins CAOS
;
; IN: HL --> Text-Adresse
;
ERRTEX CALL PV1 ;Zeilenschaltung
DEFB NL
LD E,ZKOUT
CALL PV3
;
CALL PV1 ;Zeilenschaltung
DEFB OSTR
DEFB '!'
DEFW CRLF
DEFW BEEP
DEFB 0
;
CALL PV1
DEFB LOOP
;_______________________________________
;
; Text: Fehler im JUMP-Aufruf
;
KERR DEFM 'UP nicht implementiert'
DEFB 0
;_______________________________________
;
; Text: Fehler in Fensterparametern
;
PERR DEFM 'Parameterfehler'
DEFB 0
;_______________________________________
;
; Text: Fehler Speicher}berlauf
;
MERR DEFM 'Modul ist voll'
DEFB 0
;_______________________________________
;
; Text: Fehler kein Modul
;
MOERR DEFM 'M011 nicht gefunden'
DEFB 0
;_______________________________________
;
; physisches Programmende
;
;***************************************
Detected encoding: ASCII (7 bit) | 2
|