;Der kleine Architekt (v1.4)
;21.5.1990 (1.,14.,15.,16.,17.,18.,20.5.1990)
;[Line1 - Zeichnen beliebiger Linien ( Bildschirmstart beliebig )30.12.1989]
;
NOLIST
;WRITE"ARCHI4.BIN"
;
FLYBACK EQU &BD19
;
;
;dynamische Variablen
;
ERRFLG EQU &A400;DB 0 (Errornummer)
ART EQU ERRFLG+1;DB 0 Zeichenart(0=move;1=plot;2=draw;3=Rechteck)
XPOS EQU ART+1;DW 0 (xpos Grafikcursor)
YPOS EQU XPOS+2;DB 0 (ypos Grafikcursor)

BUFFANF EQU YPOS+1;DW 0 (Bufferanfangsadr)
BUFFEND EQU BUFFANF+2;DW 0 (Bufferendadr)
BUFFMAX EQU BUFFEND+2;DW 0 (akt.benutzte Bufferendadr)

BILDNR EQU BUFFMAX+2;DB 0 (akt.Bildnummer)
BILDANF EQU BILDNR+1;DW 0 (akt.Bildanfangsadr)
BILDEND EQU BILDANF+2;DW 0 (Bildendadr)
BILDPOS EQU BILDEND+2;DW 0 (aktuelle Poition im Bild)

BILDPTR EQU BILDPOS+2;DW 0 (Pointer im Bild,fuer Berechnungen der Routinen)

POSSET EQU BILDPTR+2;DB 0 (<>0=neue Position bei Linemake setzen)
;Variablen fuer Line
XANF EQU POSSET+1;DW 0 x-Anfang
YANF EQU XANF+2;DB 0 y-Anfang
XEND EQU YANF+1;DW 0 x-Ende
YEND EQU XEND+2;DB 0 y-Ende
LCALL EQU YEND+1;DW 0 Line-Call (HTLINE oder VTLINE)
KDIFF EQU LCALL+2;DW 0 kleinere Differenz(line) oder Merkdistanz(Kreis)
;
;Variablen fuer Move
NMOVE EQU KDIFF+2;DB 0,0 (Normalmove y,x)
PMPOS EQU NMOVE+2;DS 3 (PointerMovePOS xx,y)
POWIN EQU PMPOS+3;DS 6 (Pointerwindow +0=ob(y),+1=un(y),+2=li(xx),+4=re(xx))
 POWINOB EQU POWIN;DB 0
 POWINUN EQU POWIN+1;DB 0
 POWINLI EQU POWIN+2;DW 0
 POWINRE EQU POWIN+4;DW 0
 AMOVE EQU POWIN+6;DB 0,0 (akt.Move y,x)
PMPOS2 EQU POWIN+8;DS 3 (Backup-Pos)
ZMOVE EQU PMPOS2+3;DB 0 (Zaehler-Move)
ALTJOY EQU ZMOVE+1;DB 0 (alter Joystickwert)
;
;
;
ORG &9800
JP BUFFINITST
JP INITST
JP MOVE
JP BILDSHOW

JP BILDDECST
JP BILDINCST

JP BILDZURUECKST
JP BILDVORST
;
JP DEEK
JP DOKE
;
JP WAEHLEST
JP BILDCLSST

JP POSPRINT0;Pointer auf Curpos+Pos ausg.
;
;Mit Maske C
WRITESCR0 LD A,C
;auf Screen schreiben
; EIN  HL=Screenadr ; A=Bitmaske
; AUS  -
WRITESCR OR (HL);verknuepfen,auch xor (HL)
LD (HL),A;auf Screen
RET
;
BPOS JP 0;Adresse der Positionsberechnung BposM1 oder BposM2
;
;
AVONIX LD A,(IX+0)
INC IX
INC IX
RET
HLVONIX LD L,(IX+0)
INC IX
LD H,(IX+0)
INC IX
RET
;
;
;call buffinit,buffanf,buffend
BUFFINITST CP 2
RET NZ
CALL HLVONIX;buffend
EX DE,HL;nach de
CALL HLVONIX;buffanf
EX DE,HL;de=anfang,hl=ende
CALL BUFFINIT
OR A
JP NZ,ERROR
CALL NEUBILD;neues Bild schaffen
OR A
RET Z;Ok
JP ERROR
;
;call init,links,rechts,oben,unten,mode(1 oder 2)
INITST CP 5
RET NZ
CALL AVONIX;Mode holen
PUSH AF;sich
CALL SCRINIT;Screen init
CALL AVONIX;unten
LD H,A;nach H
CALL AVONIX;oben
LD L,A;nach L
PUSH HL;sich
CALL HLVONIX;rechts
LD B,H
LD C,L
CALL HLVONIX;links
EX DE,HL;nach DE
POP HL
POP AF;Mode
JP MOVEINIT
;
BILDDECST CALL DATDEC;Posit.erniedrigen
OR A
JP NZ,ERROR
BILDDECST1 CALL &BB6C;Txt Clear Window
JP BILDSHOW
;
BILDINCST LD HL,(BILDPOS)
LD (BILDPTR),HL;als akt.Pointer
LD HL,(BILDEND);max.Adr
CALL DATGET0;evtl.Daten+Art holen
OR A
JP NZ,ERROR
CALL ARTMAKE;Zeichenart ausfuehren
LD HL,(BILDPTR);erhoehten Pointer
LD (BILDPOS),HL;nehmen
RET
;
BILDZURUECKST
CALL LASTBILD
OR A
JP NZ,ERROR
JR BILDDECST1
;
BILDVORST
CALL NEXTBILD
OR A
JP NZ,ERROR
JR BILDDECST1
;
;
DEEK CP 2
RET NZ
CALL HLVONIX;Deek-Zielvariable
EX DE,HL;nach de
CALL HLVONIX;Adresse
LD C,(HL)
INC HL
LD B,(HL)
EX DE,HL
LD (HL),C
INC HL
LD (HL),B
RET

DOKE CP 2
RET NZ
CALL HLVONIX;Doke-Wert
EX DE,HL;nach de
CALL HLVONIX;Adr
LD (HL),E
INC HL
LD (HL),D
RET
;
;call bildselect,bildnr
WAEHLEST CP 1
RET NZ
CALL AVONIX
CALL WAEHLEBILD
OR A
RET Z;Ok
JP ERROR
;
;letzten Schritt clear (ab bildpos)
BILDCLSST CALL DATDEC;Posit.erniedrigen
OR A
JP NZ,ERROR
CALL DATCLS;Daten ab aktueller bildpos loeschen(3 Bytes)
JR BILDDECST1
;
;
;
ERROR
LD (ERRFLG),A;Error set
RET
;
;
;
;** Grundprozeduren **
;
;MAUS
;PUSH AF
;PUSH BC
;PUSH HL
;LD HL,MAUST;Meldungstabelle
;LD B,A;MELD SICH
;INC B;MELD+1
;JR MAUS2;DJNZ
;MAUS1 LD A,(HL)
;INC HL
;OR A;0=TRENNBYTE
;JR NZ,MAUS1;WEITER
;MAUS2 DJNZ MAUS1;NEXT MELD.
;CALL TEXAUS;Text ausg.
;POP HL
;POP BC
;POP AF
;RET
;
;TEXAUS
;LD A,(HL)
;INC HL
;OR A;0?
;RET Z
;CALL &BB5A;Txt Output
;JR TEXAUS
;
DAUS100 ;fuer 0..999
LD DE,100
CALL DAUS1
LD E,10
CALL DAUS1
LD A,L;REST
INC A;KORREKTUR MIND.1
JR DAUS3
DAUS1
XOR A;ZAEHLER=0+NC
DAUS2
SBC HL,DE
INC A
JR NC,DAUS2
ADD HL,DE;EIN SBC RUECKGAENGIG REST
DAUS3
ADD A,"0"-1 ;AUF ASCII
JP &BB5A;Txt Output
;
HLGET
PUSH DE;SICH
EX DE,HL;ANFADR NACH DE
LD H,0
LD L,A;NUMMER DER ADR.
ADD HL,HL;*2,DA IMMER 2 BYTES
ADD HL,DE;ANFADR DAZU
LD E,(HL);LOW BYTE
INC HL
LD D,(HL);HI
EX DE,HL;NACH HL
POP DE;ZURUECK
RET
;
;Vergleich HL,DE
; AUS  AF veraendert; cy=1,z=1 => hl=de ; cy=0,z=0 => hl>de ; cy=1,z=0 =>hl<de
HLVGLDE
LD A,H
SUB D
RET NZ
LD A,L
SUB E
RET
;
;DE=DE+A
; AUS  AF veraendert
DEADDA
ADD A,E
LD E,A
RET NC
INC D
RET
;
;DE=DE-A
; AUS  AF veraendert
DESUBA
NEG;Zweierkomplement
ADD A,E
LD E,A
RET C;Ueberlauf,dann ok
DEC D
RET
;
;Art entsprechend de setzen (x-Koord.,Bit 2..7)
; EIN  D(Bit 2..7) enthaelt Art
; AUS  (Art)(Bit 0..5) aus D(Bit 2..7) ; D(Bit 0,1) erhalten
ARTSET
PUSH AF
LD A,D
AND %11111100;Bit 2..7
RRCA
RRCA;Bit 2 wird Bit 0
LD (ART),A;set
LD A,D
AND %11;nur bit 0,1 lassen
LD D,A
POP AF
RET
;
;Art nach de holen
; EIN  (Art)
; AUS  D(Bit 2..7)=(Art)
ARTGET
PUSH AF
LD A,(ART)
AND %00111111;Bit 6,7 unbenutzt
RLCA
RLCA;Bit 0 wird Bit 2
OR D;mit Hi-x-Koord.verkn.
LD D,A;nach D
POP AF
RET
;
;
;** Grafikcursorprozeduren **
;
;Grafik-Cursor set
; EIN  DE=xpos ; L=ypos
GRACURSET LD (XPOS),DE
LD A,L
LD (YPOS),A
RET
;
;Grafikcursor home
GRACURHOME
LD DE,(POWINLI);Pointer-Window links
LD A,(POWINOB);Pointer-Window oben
LD L,A
JR GRACURSET
;
;
;** Bufferprozeduren **
;
;Bildanzahl get
; AUS  A=Bildanzahl(0..n)
BILDANZGET
PUSH HL
LD HL,(BUFFANF)
LD A,(HL)
POP HL
RET
;
;Bildanzahl set
; EIN  A=Bildanzahl(0..n)
BILDANZSET
PUSH HL
LD HL,(BUFFANF)
LD (HL),A
POP HL
RET
;
;Bildanzahl inc
BILDANZINC LD HL,(BUFFANF);Adr Lg.
INC (HL);+1
RET
;
;Buffer initialisieren
; EIN  DE=Bufferanfang ; HL=Bufferende
; AUS  A=0=Ok(Variablen initialisiert) ,sonst A=Errornr
BUFFINIT
LD (BUFFANF),DE
LD (BUFFEND),HL
INC DE;Anfang erhoehen
CALL HLVGLDE;HL mit DE vergleichen
LD A,1;Buffer voll
RET C;Err.DE>HL
LD (BUFFMAX),DE;Endadr als max.Bufferadr
LD A,0
LD (BILDNR),A;akt.Bildnr
CALL BILDANZSET;0 Bilder
XOR A;0=kein Fehler
RET
;
;Platz im Buffer ab Bildpos schaffen
; EIN  BC=gewuenschte Laenge
; AUS  A=Fehler
MACHEPLATZ LD HL,(BUFFMAX)
ADD HL,BC
EX DE,HL;nach DE
LD HL,(BUFFEND)
CALL HLVGLDE
LD A,1;Buffer voll
RET C;hl<de
LD HL,(BUFFMAX);alter Buffmax
LD (BUFFMAX),DE;Buffmax+Anz set
LD BC,(BILDPOS)
OR A
PUSH HL;Buffmax sich
SBC HL,BC;ergibt Lg
LD B,H
LD C,L
POP HL
LD A,B
OR C;Lg=0?
RET Z;Ja,Ok
INC BC;Korrektur+1, warum ??
LDDR;kopieren
XOR A;Ok
RET
;
;Platz im Buffer ab Bildpos loeschen
; EIN  BC=Anzahl
LOESCHEPLATZ LD A,B
OR C;Lg=0?
RET Z;schon fertig
LD HL,(BUFFMAX)
OR A
SBC HL,BC
LD (BUFFMAX),HL;buffmax-anzahl
LD DE,(BILDPOS)
OR A
SBC HL,DE
PUSH HL;wirkl.Lg sich
LD H,D
LD L,E;nach HL
ADD HL,BC;Start=Bildpos+Anzahl
POP BC;wirkl.Lg
LD A,B
OR C;0?
RET Z;Ja,ok
LDIR;kopieren
RET
;
;zusaetzlich Art entsprechend D setzen
DATGET0 CALL DATGET
OR A
CALL Z,ARTSET;falls kein Fehler
RET
;akt.Daten ab Bildptr holen+Bildptr erhoehen
; EIN  HL=max.Adr von (Bildptr)
; AUS  DE=xpos ; L=ypos ; A=Fehler
DATGET
LD DE,(BILDPTR)
INC DE
INC DE
INC DE
CALL HLVGLDE
LD A,6;Error
RET C;DE>HL
EX DE,HL;nach HL
LD (BILDPTR),HL;neuer Pointer set
CALL DATGET1;ab HL holen
LD L,A;ypos nach L
XOR A;Ok
RET
;
DATGET1
DEC HL
LD A,(HL);ypos
DEC HL
LD D,(HL);xpos hi
DEC HL
LD E,(HL);xpos lo
RET
;
;Bildpos einen eintrag zurueck,falls moeglich
DATDEC LD DE,(BILDANF)
INC DE
INC DE;Lg ueberlesen
LD HL,(BILDPOS)
CALL HLVGLDE
LD A,2;Bildanf erreicht
RET C;Bildpos<Bildanf
RET Z;oder gleich
DEC HL
DEC HL
DEC HL
LD (BILDPOS),HL
XOR A;0=Ok
RET
;
;Art mit D verknuepfen
DATPUSH0 CALL ARTGET; Art nach D
;Daten an aktuelle Bildpos schreiben
; EIN  DE=x-Koordinate+Art ; L=Y-Koordinate
; AUS  A=Fehler
DATPUSH PUSH DE;sich
PUSH HL
LD HL,(BILDPOS)
LD DE,(BILDEND)
CALL HLVGLDE
LD A,0;0=ok
JR NZ,DATPUSH1;<>,ok
LD BC,3;Anzahl Bytes
CALL MACHEPLATZ;gleich,also Platz schaffen
OR A
JR NZ,DATPUSH1;Err
LD HL,(BILDEND)
INC HL
INC HL
INC HL
LD (BILDEND),HL
CALL BILDLGGET
INC BC
INC BC
INC BC;+3
CALL BILDLGSET
XOR A;0=Ok
DATPUSH1 POP HL
POP DE
OR A
RET NZ;Err
LD A,L;ypos
LD HL,(BILDPOS)
LD (HL),E
INC HL
LD (HL),D
INC HL
LD (HL),A
INC HL
LD (BILDPOS),HL
XOR A;0=ok
RET
;
;zusaetzlich Art entsprechend D setzen
DATPOP0 CALL DATPOP
OR A
CALL Z,ARTSET;falls kein Fehler
RET
;Daten von der vorhergehenden Bildpos holen
; EIN  -
; AUS  DE=x-Koordinate+Art ; L=Y-Koordinate ; A=Fehler
DATPOP CALL DATDEC;Posit erniedrigen
OR A
RET NZ;Err
LD HL,(BILDPOS)
LD E,(HL);xp lo
INC HL
LD D,(HL);xp hi
INC HL
LD L,(HL);ypos
XOR A;0=Ok
RET
;
;einen Schritt (ab bildpos) loeschen (keine Ueberpruefung!!)
DATCLS LD BC,3;3 Bytes
CALL LOESCHEPLATZ;evtl.Loeschen(ab bildpos)
CALL BILDLGGET;akt.Lg nach BC
DEC BC
DEC BC
DEC BC
CALL BILDLGSET;neue Lg-3
LD HL,(BILDEND)
DEC HL
DEC HL
DEC HL
LD (BILDEND),HL;neues Ende
RET
;
;
;
;** Bildprozeduren **
;
;Bildlaengenget
; AUS  BC=Bildlaenge
BILDLGGET
PUSH HL
LD HL,(BILDANF)
LD C,(HL)
INC HL
LD B,(HL)
POP HL
RET
;
;Bildlaengenset
; EIN  BC=Bildlaenge
BILDLGSET
PUSH HL
LD HL,(BILDANF)
BILDLGSET2 LD (HL),C
INC HL
LD (HL),B
POP HL
RET
;
;Initialisieren eines Bildes
; EIN  HL=Anfadr des Bildes(Bufferadr)
; AUS  A=Fehler
BILDINIT
LD (BILDPOS),HL
LD BC,2;Lg=2
CALL MACHEPLATZ;2 Bytes Platz schaffen
OR A
RET NZ;Err
LD HL,(BILDPOS)
LD (BILDANF),HL;als Bildanf
INC HL
INC HL;Lg ueberlesen
LD (BILDPOS),HL
LD (BILDEND),HL
LD BC,2
CALL BILDLGSET;Bildlaenge auf 2 setzen(wg.Laenge)
CALL BILDANZINC
LD HL,BILDNR
INC (HL);Bildnr erhoehen
XOR A;0=Ok
RET
;
;Neues Bild schaffen
; AUS  A=Fehler
NEUBILD
LD HL,(BUFFMAX);akt.Ende
CALL BILDINIT
RET
;
;Bild Nr.A waehlen
; EIN  A=Bildnr
; AUS  A=Fehler
WAEHLEBILD LD C,A;Nr nach C
CP 1
LD A,3;erstes Bild
RET C;Nr<1
CALL BILDANZGET;Bildanz nach A
CP C
LD A,4;Bild nicht vorh.
RET C;A<C
LD A,C;Bildnr
LD (BILDNR),A;set
LD HL,(BUFFANF)
INC HL;bildanz
LD (BILDANF),HL
LD B,A;Bildnr
JR WAEHLEB2
WAEHLEB1 PUSH BC
CALL BILDLGGET
LD HL,(BILDANF)
ADD HL,BC
LD (BILDANF),HL
POP BC
WAEHLEB2 DJNZ WAEHLEB1
CALL BILDLGGET;Lg des akt.Bildes get
LD HL,(BILDANF)
ADD HL,BC;Bildanf+bildlg
LD (BILDEND),HL
LD (BILDPOS),HL
XOR A;0=Ok
RET
;
;letztes Bild waehlen (vor akt.Pos)
; AUS  A=Fehler
LASTBILD LD A,(BILDNR)
DEC A;-1
CALL WAEHLEBILD
RET
;
;naechstes Bild waehlen
; AUS  A=Fehler
NEXTBILD LD A,(BILDNR)
INC A
LD C,A;sich
LD A,5;letztes moegliches Bild
RET Z;Bild schon 255
LD A,C;Bildnr
CALL WAEHLEBILD
OR A
RET Z;kein Fehler
;also nur Bild nicht vorhanden
CALL NEUBILD;neues Bild schaffen
OR A
RET NZ;Err
LD A,(BILDNR);neue Bildnr
CALL WAEHLEBILD
RET
;
;Bild zeigen
BILDSHOW
CALL GRACURHOME;Grafik-Cursor home
LD HL,(BILDANF);akt.Bildanf
INC HL
INC HL;Lg ueberlesen
LD (BILDPTR),HL;als Hilfspointer
BUFFERSHOW1
LD HL,(BILDPOS);max.Adr
CALL DATGET0;Koord.+Art aus Buffer holen
OR A
RET NZ;keine mehr,fertig
CALL ARTMAKE;Art ausfuehren
JR BUFFERSHOW1;weiter
;
;
;** Zeichenartprozeduren **
;
; EIN  DE=xpos , L=ypos ; (xpos),(ypos)=vorherige Position
;      ausser bei Kreis de=Radius
; AUS  (xpos),(ypos) aktualisiert , IY erhalten
ARTMAKE
LD A,(ART);Zeichenart
CP 6;>=6?
RET NC;Ja
PUSH HL
LD HL,ARTTABELL
CALL HLGET;A.Adr holen
EX (SP),HL;Adr auf Stack,ypos nach L zurueck
RET;Routine anspringen
;
ARTTABELL
DEFW GRACURSET;0=Artmove
DEFW ARTPUNKT
DEFW LINEMAKE;Artline
DEFW ARTUNCO;unconnected Line
DEFW ARTRECHTECK
DEFW ARTKREIS
;
ARTPUNKT
CALL GRACURSET;Posit set,A=y-Koord.
DEFB #DD
LD L,A;nach XL
CALL BPOS;Posit berechnen
JP WRITESCR;Punkt setzen
;
ARTUNCO LD A,(POSSET);Posset-Flg
PUSH AF;sich
XOR A
LD (POSSET),A;Posset verbieten
CALL LINEMAKE;Linie ziehen
POP AF
LD (POSSET),A;altes Flg
RET

ARTRECHTECK
LD C,L;yn (neue ypos)
LD A,(YPOS);ya (alte ypos)
LD B,A;auch in B
LD HL,(XPOS);xa
CALL ARTRECH1;waag.L. zu xn,ya
LD A,C;yn
CALL ARTRECH1;senk.L.zu xn,yn
EX DE,HL;de=xa
LD A,C;yn
CALL ARTRECH1;waag.L.zu xa,yn
LD A,B;ya
CALL ARTRECH1;senk.L.zu xa,ya
EX DE,HL;xn in DE
LD L,C;yn
JP GRACURSET
;
; EIN  DE=xpos , A=ypos
; AUS  alles bis auf AF,IX erhalten
ARTRECH1
PUSH HL
PUSH DE
PUSH BC
LD L,A;ypos nach L
CALL LINEMAKE
POP BC
POP DE
POP HL
RET
;
;art 5 Sonderfall  ein de=Radius!
ARTKREIS
LD HL,0
LD (KDIFF),HL;MERKDISTANZ=0
ARTKR1 PUSH HL
PUSH DE
CALL ARTKRPLO ;X UND Y
CALL NEGHL
CALL ARTKRPLO;-X UND Y
CALL NEGHL
CALL ARTKRPLO ;-X,-Y
CALL NEGHL
CALL ARTKRPLO
POP DE
POP HL
INC HL;HL+1(Y-POS)
;
PUSH HL
PUSH DE
ADD HL,HL
DEC HL;KORREKRUR
LD BC,(KDIFF);ALTE MERKDISTANZ
ADD HL,BC;ZUSAMMEN=DISTANZ OBEN
LD (KDIFF),HL;Merkdistanz=OD
EX DE,HL;XPOS NACH HL
ADD HL,HL;*2
DEC HL;KORREKTUR
EX DE,HL;HL WIEDER OD
LD B,H
LD C,L;BC=OD
OR A
SBC HL,DE ;HL JETZT SD
PUSH HL;SD SICH
SRL B;WARUM ??
SBC HL,BC;SD-OD
POP HL;SD ZUR.
POP DE;XPOS ZUR.
JP P,ARTKR2;UEBERLAUF
LD (KDIFF),HL;Merkdistanz=SD
DEC DE;XPOS-1
ARTKR2 POP HL ;YPOS ZUR.
LD A,D
CP H
RET C
LD A,E
CP L
JR NC,ARTKR1
RET

ARTKRPLO CALL ARTKRPLO1
EX DE,HL;X,Y VERTAUSCHEN
;X,Y BLEIBT VERTAUSCHT
ARTKRPLO1 PUSH HL
PUSH DE
SRL H
RR L;ypo div 2
LD A,(YPOS);y-origin
ADD A,L;zur ypo
DEFB #DD
LD L,A;xl=ypo
LD HL,(XPOS);x-origin
ADD HL,DE;xpo dazu
EX DE,HL;nach de
CALL BPOS;Bildadr aus de,xl berechen
CALL WRITESCR;Punkt auf Scr
POP DE
POP HL
RET
;
RADIUS
PUSH HL;l sich
LD HL,(XPOS);x1
EX DE,HL;hl=x2,de=x1
OR A
SBC HL,DE;x2-x1
CALL M,NEGHL;wenn nagativ-Zweierkomplement
CALL HLHOCH2
EX (SP),HL;(x2-x1)^2 sich;l=y2
LD A,(YPOS)
LD H,A
LD A,L
SUB H;y2-y1
JP P,RADIUS1;positiv,ok
NEG;sonst Zweierkomplement
RADIUS1 LD L,A
LD H,0
ADD HL,HL;*2
CALL HLHOCH2;(y2-y1)^2
POP DE;aus hl
ADD HL,DE;(x2-x2)^2+(y2-y1)^2
CALL SQRA;A=int(sqr(hl))
LD E,A
LD D,0;Radius nach de
LD L,D;l auf 0(init,da unbenutzt)
RET
;hl=hl^2
HLHOCH2 EX DE,HL;Faktor nach de
LD B,D
LD C,E;und nach bc
LD HL,0
LD A,16
MULT1 ADD HL,HL
RL E
RL D
JR NC,MULTNOADD
ADD HL,BC
JR NC,MULTNOADD
INC DE
MULTNOADD DEC A
JR NZ,MULT1
RET
;A=int(sqr(hl)) (8 Bit)
SQRA XOR A
LD BC,&FFFF
SQRALP ADD HL,BC
RET NC
INC A
DEC BC
DEC BC
JR SQRALP
;
;
;
;** PointerMove - Prozeduren **
;
; EIN  DE=links,BC=rechts (0..639) ; H=unten,L=oben (0..199) ; A=Mode(1,2)
MOVEINIT
LD (POWINLI),DE;links set
LD (POWINRE),BC;rechts set
LD (POWINOB),HL;oben,unten set
LD HL,&0101
CP 1;Mode1?
JR NZ,MOVEINIT1;nein
LD H,2;sonst ymove=2
MOVEINIT1 LD (NMOVE),HL;L=y-Move(1),H=x-Move(1 oder 2)
JP GRACURHOME
;
;
PMPOGET ;PmPos get, de=xpos, A und L=ypos
LD DE,(PMPOS)
LD A,(PMPOS+2)
LD L,A
RET
;
KREUZAUS0
CALL PMPOGET
;DE=X-Pos;L=Y-Pos
KREUZAN
KREUZAUS
LD A,(WRITESCR);akt.Mode
PUSH AF;sich
LD A,&AE;xor(HL)
LD (WRITESCR),A;set
PUSH DE;xpos sich
PUSH HL;ypos L sich
LD A,(YPOS)
PUSH AF;sich
PUSH HL;ypos nochmal
LD HL,(XPOS)
EX (SP),HL;sich,neue zurueck
LD A,(ART)
CP 5;Kreis?
CALL Z,RADIUS;Ja,Radius berechnen und nach de
CALL ARTMAKE;Art ausfuehren
POP HL
LD (XPOS),HL;xpos wieder set
POP AF
LD (YPOS),A;ypos wieder set
POP HL;ypos zur.
POP DE;xpos zur.
PUSH HL;ypos sich
PUSH DE;xpos sich
LD A,8
CALL DEADDA;DE=DE+A
CALL XINWIN;DE in Window
LD B,D
LD C,E;nach BC als xend
POP DE;xpos
PUSH DE;wieder sich
LD A,8
CALL DESUBA;DE=DE-A
CALL XINWIN;in Window
CALL HLINE;horiz.Line
POP DE;xpos
POP BC;C=ypos aus L
LD A,C
SUB A,4;-ypos
JR NC,KREUZ2;kein Unterlauf
LD A,(POWINOB);auf min
KREUZ2
LD L,A
CALL YINWIN;L in Wind.
LD H,L;als xanf
LD A,C
ADD A,4;ypos
LD L,A;nach L
CALL YINWIN;in Wind
CALL VLINE;vertik.Line
POP AF
LD (WRITESCR),A;alten Screen-Mode set
RET
;
;
POSPRINT0 ;mit akt.Curpos uebernehmen
LD HL,(XPOS)
LD (PMPOS),HL
LD A,(YPOS)
LD (PMPOS+2),A;Pointerpos set
POSPRINT
LD HL,&0319;Spalte 3;Zeile 25
CALL &BB75;Txt Set Cursor
CALL PMPOGET
PUSH HL;L=ypos sich
EX DE,HL;xpos nach HL
CALL DAUS100;Zahl ausg.
LD A,9;Spalte
CALL &BB6F;Txt Set Column
POP HL;L=ypos
LD H,0;Hi auf 0
JP DAUS100;ausg.
;
;
MOVE
CP 1;1 Param?
RET NZ
CALL AVONIX
LD (ART),A;Zeichenart set
PUSH IX
PUSH IY
PUSH HL
PUSH DE;SICH
LD IY,POWIN;ADR POINTERWINDOWAUSD.
CALL DMOVEINIT;MoveAbst init
CALL POSPRINT0;Pointer auf akt.Curpos+Pos ausg.
PMOVE2
CALL PMPOGET;x(de),y(a,l)-pos get
LD (PMPOS2),DE;als alte xpos
LD (PMPOS2+2),A;als alte ypos
CALL KREUZAN
PMOVE3
CALL WAITJOY
LD B,A;Taste sich
CALL PMPOGET;x(de),y(a,l)-pos get
RR B;0.BIT
CALL C,HOCH
RR B
CALL C,RUNTER
RR B
CALL C,LINKS
RR B
CALL C,RECHTS
RR B
JR C,PMFEUER
RR B
JR C,PMESC
CALL XINWIN;DE in Window
CALL YINWIN;L in Window
LD A,L;neue ypos
LD (PMPOS+2),A;sich
EX DE,HL;neue xpos in HL
LD (PMPOS),HL;sich
LD A,(PMPOS2+2);alte ypos
CP E;=neue ypos?
LD DE,(PMPOS2);alte xpos
JR NZ,PMOVE4;nein,Posit veraendert
OR A
SBC HL,DE;=neue xpos?
JR NZ,PMOVE4;nein,veraendert
;nicht veraendert
CALL DMOVEINIT
JR PMOVE3

PMOVE4
CALL FLYBACK
;de ist schon (PMPOS2),A schon (PMPOS2+2)
LD L,A
CALL DMOVEINC;amove evtl.erhoehen,nur af veraendert
CALL KREUZAUS;DE=xpos,L=ypos
JR PMOVE2
;

PMFEUER
CALL KREUZAUS0
CALL PMPOGET;x,ypos get
LD A,(ART)
CP 5;Kreis?
CALL Z,RADIUS;Radius berechnen und nach de (l=0)
PUSH DE;xp
PUSH HL;yp
CALL DATPUSH0;mit Art in Buffer
POP HL
POP DE
OR A
CALL NZ,ERROR;Error setzen
JR NZ,PMFEUER1;Buffer voll
CALL ARTMAKE;Art mit de,l ausfuehren
JR PMFEUER2
PMFEUER1 LD A,1;Buffer voll
CALL ERROR
PMFEUER2 SCF
PMENDE
POP DE
POP HL
POP IY
POP IX
RET

PMESC
CALL KREUZAUS0
LD A,7;Esc
CALL ERROR
XOR A;Z/NC
JR PMENDE

HOCH
LD A,L;ypos
SUB (IY+6);-ymove
RET C;Unterlauf
LD L,A
RET

RUNTER
LD A,L;ypos
ADD A,(IY+6);+ymove
RET C;Ueberlauf
LD L,A
RET

LINKS
LD A,(IY+7);xmove
JP DESUBA;DE=DE-A

RECHTS
LD A,(IY+7);xmove
JP DEADDA;DE=DE+A
;
;
WAITJOY
PUSH HL
WAITJOY1
CALL &BB24;KM get Joy
OR A;Joy0<>0
JR NZ,WAITJOY3;Ja
LD A,L;Joy1?
OR A
JR NZ,WAITJOY3;Ja
CALL &BB09;KM Read Char
LD C,A;Taste sich
CP 224;Copy
LD A,16
JR Z,WAITJOY3;copy
LD A,C
SUB 240;-Curup=240
LD C,A;Taste nach C
LD A,1
JR Z,WAITJOY3;Curup
RLCA;2
DEC C
JR Z,WAITJOY3;Curdn
RLCA;4
DEC C
JR Z,WAITJOY3;Curlt
RLCA;8
DEC C;243
JR Z,WAITJOY3;Currt
LD A,C
PUSH AF;Taste sich
CALL DMOVEINIT;keine Bewegung=> Move init
PUSH DE
PUSH BC;sich
CALL POSPRINT;akt.Pos auf Bildschirm
POP BC
POP DE
POP AF;Tastencode zurueck
CP 9;252=Esc
JR NZ,WAITJOY1;nein,weiterwarten
LD A,32;Esc set
WAITJOY3
LD C,A;Code sich
LD A,(ALTJOY);alter Code
CP C;=neuer?
CALL NZ,DMOVEINIT;<>
LD A,C
LD (ALTJOY),A
POP HL
RET
;
;
DMOVEINIT
LD HL,(NMOVE);normalMove
LD (AMOVE),HL;als akt.Move
LD A,8
LD (ZMOVE),A;Zaehler init
RET
;Moveabstand erhoehen,falls Zaehler zmove=0 , nur af veraendert!
DMOVEINC
LD A,(ZMOVE);Zaehler
OR A;0?
JR Z,DMOVEINC2;Ja
DEC A;-1
LD (ZMOVE),A
CP 4;>=4?
CALL NC,FLYBACK;Ja,warten
RET
DMOVEINC2
PUSH HL
LD HL,AMOVE+1;Adr x-Move
INC (HL);+1
LD A,(HL);get
RRA;Bit 0
JR NC,DMOVEINC3;Bit 0 nicht gesetzt
DEC HL;Adr y-Move
INC (HL);+1
DMOVEINC3 LD A,2
LD (ZMOVE),A
POP HL
RET
;
;
;x-Koordinate DE in Window bringen
XINWIN
PUSH HL;sich
LD HL,(POWINLI);linke Grenze
SCF;-1
SBC HL,DE
JP P,XINWIN2;zu klein
LD HL,(POWINRE);rechte Grenze
OR A
SBC HL,DE
JP P,XINWIN3;ok
;Koord.zu gross
LD DE,(POWINRE);rechte Grenze nehmen
POP HL
RET
;Koord.zu klein
XINWIN2
LD DE,(POWINLI);linke Grenze nehmen
XINWIN3
POP HL
RET
;
;y-Koordinate L in Window bringen
YINWIN
LD A,(POWINUN);untere Windowgrenze(z.B.199)
CP L;-Koord.
JR C,YINWIN2;zu gross
LD A,(POWINOB);obere Grenze(z.B.0)
SCF
SBC A,L
JR NC,YINWIN3;zu klein
RET;ok
;zu gross
YINWIN2
LD L,A;powinun nehmen
RET
;zu klein
YINWIN3
LD A,(POWINOB)
LD L,A
RET
;
;
;
;Line
;
SCRHI DEFB 0;Screen-Hi-Byte &40 oder &C0
HLINE JP 0;Adresse der Horizontalroutine HLineM1 oder HLineM2
VLINE JP 0;Adresse der Vertikalroutine VLineM1 oder VLineM2
;
;
SCRINIT LD C,A;Mode sich
LD A,&C0;Scr Hi-Byte
LD (SCRHI),A;set
LD A,&FF
LD (POSSET),A;Flag,Position bei Linemake setzen
LD A,C;Mode holen
LD HL,HLINEM1;Adr fuer Mode1
LD DE,VLINEM1;Adr fuer Mode1
LD BC,BPOSM1
CP 1;Mode1?
JR Z,SCRINIT2;Ja
LD HL,HLINEM2;sonst Adressen
LD DE,VLINEM2;fuer Mode2
LD BC,BPOSM2
SCRINIT2 LD (HLINE+1),HL
LD (VLINE+1),DE
LD (BPOS+1),BC
RET
;
;
; EIN  DE=x-Ende , L=y-Ende ; (xpos)=x-Anfang,(ypos)=y-Anfang
; AUS  AF,BC,HL,DE,IX veraendert , (xpos),(ypos)=aktualisiert
LINEMAKE PUSH IY;sich
LD C,L;neue ypos sich
LD HL,(XPOS);xpos
LD (XANF),HL;x-Anf set
LD A,(YPOS)
LD (YANF),A;y-Anf set
LD A,(POSSET);Flag ob Position setzen
OR A
LD A,C;neue ypos
JR Z,LINEMAKE1;0=nicht setzen
LD (XPOS),DE;neue xpos schon mal setzen
LD (YPOS),A;neue ypos schon mal set
LINEMAKE1 CALL LINE
POP IY
RET
;
;Line - zeichnen einer Linie
;EIN  DE=x-Ende / A=y-Ende / (xanf),(yanf)
;
LINE
LD (XEND),DE;x-Ende set
LD (YEND),A;y-Ende set
LD IY,0;beide Vorzeichen positiv=0
LD C,A;und in C sich
LD HL,(XANF);x-Anfang
XOR A;A=0;CY AUS
SBC HL,DE;xanf-xend
JP P,LOK;positiv,ok
CALL NEGHL;Zweierkomplement
DEFB #FD
DEC H;YH=Vorzeichen x-Diff,&ff=negativ
LOK PUSH HL;x-Diff sich
LD A,(YANF);y-Anfang
SUB C;-y-Ende
JR NC,LOK2;positiv,ok
NEG;Zweierkomplement
DEFB #FD
DEC L;YL=Vorzeichen y-Diff,&ff=negativ
LOK2 LD L,A
LD H,0;y-Diff nach HL
POP DE;x-Diff
OR A
SBC HL,DE;y-Diff - x-Diff (cy set)
ADD HL,DE;y-Diff wiederherstellen (cy unbeeinflusst)
SBC A,A;A=&ff,wenn x-Diff groesser
LD (LFLG),A;sich
DEFB #FD
LD A,L;y-Diff nach A
LD BC,VTLINE
JR Z,LOK3;y-Diff groesser oder gleich
EX DE,HL;Differenzen vertauschen
DEFB #FD
LD A,H;Vorz.x-Diff
LD BC,HTLINE;x-Diff groesser
;
;EIN HL=groessere Differenz,A=Vorzeichen dazu / DE=kleinere Differenz/
;    BC=Routinenadr fuer Teillinie (VTLine bei yDiff>=xDiff, sonst HTLine)
;
LOK3 LD (LCALL),BC;Teillinienadr set
PUSH AF;Vorz.gr.Diff
LD (KDIFF),DE;kleinere Diff sich
LD B,H
LD C,L
INC BC;gr.Diff+1=Breite
LD (BREIT),BC;set
CALL NEGHL;Zweierkomplement der Breite
POP AF;Vorz.gr.Diff
PUSH HL;neg.gr.Diff
ADD HL,DE;kleinere-groessere Diff
LD (DDIFF),HL;Differenz der Differenzen
OR A;Vorzeichen gr.Diff negativ?
JR NZ,LOK4;Ja
LD A,(YEND);y-Ende
LD (YANF),A;nach y-Anf
LD HL,(XEND);x-Ende
LD (XANF),HL;nach x-Anf
DEFB #FD
LD A,L;Vorz.y-Diff
CPL;komplementieren
DEFB #FD
LD L,A;und wieder set
DEFB #FD
LD A,H;Vorz.x-Diff
CPL;kompl.
DEFB #FD
LD H,A
;
LOK4 EQU $
LFLG EQU $+1
LD A,0;FLAG 0/FF
OR A;FF=X-DIFF MANIP.
JR NZ,LOK5;JA
;Y GROESSER 
LD HL,VHLP;ADR VERT.INC/DEC
LD (HL),#1B;CODE DEC DE
DEFB #FD
INC H;X-DIFF POSITIV?
JR NZ,LOK6;JA
LD (HL),#13;CODE INC DE
JR LOK6
;X GROESSER 
LOK5
LD HL,HHLP;ADR HORIZ.INC/DEC
LD (HL),#3D;CODE DEC A
DEFB #FD
INC L;POSITIV?
JR NZ,LOK6;JA
DEC (HL);#3C=INC A
LOK6
POP HL;NEG GR DIFF
SRA H
RR L;/2 KORRIGIEREN
LD A,D
OR E;KLEINERE DIFF=0?
JP Z,TLINE;NUR TEILLINIE
LD BC,#0000
PUSH BC;GROE SCHRITTWEITE
POP IY
L1840
PUSH IY
POP DE
OR A
ADC HL,DE
LD DE,(KDIFF);kleinere Differenz
JP P,L1853
L184D
INC BC
ADD IY,DE
ADD HL,DE
JR NC,L184D
L1853
XOR A
SUB E
LD E,A
SBC A,A
SUB D
LD D,A
L1859
ADD HL,DE
JR NC,L1861
ADD IY,DE
DEC BC
JR L1859
DDIFF EQU $+1
L1861
LD DE,0;KL-GR.DIFF
ADD HL,DE
PUSH BC
PUSH HL
BREIT EQU $+1
LD HL,0;BREITE
OR A
SBC HL,BC
JR NC,L1876
ADD HL,BC
LD B,H
LD C,L
LD HL,#0000
L1876
LD (BREIT),HL
CALL TLINE;Teillinie zeichnen
POP HL
POP BC
LD DE,(BREIT)
LD A,D
OR E
JR NZ,L1840
RET
;
;Teillinie ziehen
TLINE LD HL,(LCALL);entweder VTLine oder HTLine
JP (HL);anspringen
;
;vertikale Teillinie ziehen
;EIN  C=Laenge
;
VTLINE LD DE,(XANF);x-Anfang
LD A,C;Laenge=0?
OR A
JR Z,VHLP;ja,nicht zeichnen
LD A,(YANF);y-Anfang
LD H,A;in H sich
ADD A,C;+Laenge
LD (YANF),A;neues y-Anf set
DEC A;Korrektur
LD L,A;y-Ende
CALL VLINE;vertikale Linie ziehen / DE erhalten
VHLP
NOP;DEC/INC DE=x-Koordinate erhoehen,erniedrigen
LD (XANF),DE;und setzen
RET
;
;horizontale Teillinie ziehen
;EIN  BC=Laenge
;
HTLINE LD A,B
OR C;Laenge=0?
LD A,(YANF);y-Koord
JR Z,HHLP;Laenge=0
LD HL,(XANF);x-Anfang
LD D,H
LD E,L;auch in DE
ADD HL,BC;Laenge dazu
LD (XANF),HL;neues y-Anfang set
DEC HL;Korrektur
LD B,H
LD C,L;x-Ende in BC
LD L,A;y-Anf nach L
CALL HLINE;horizontale Linie ziehen
DEFB #DD
LD A,L;y-Koord aus XL
HHLP
NOP;INC/DEC A=y-Koord erhoehen,erniedrigen
LD (YANF),A;und setzen
RET
;
;
;Zweierkomplement von HL
;EIN  HL=Zahl in Komplementdarstellung
;AUS  HL=umgewandelte Zahl / A=H
;
NEGHL XOR A
SUB L
LD L,A
SBC A,A
SUB H
LD H,A
RET
;
;
;
;horizontale/vertikale Linien
;30.12.1989
;Screen ab &4000 oder &C000 !
;
;HLINEM1 (Mode 1) , HLINEM2 (Mode 2)
;EIN   DE=x-Koord.Anfang / BC=x-Koord.Ende / L=y-Koord.
;AUS   HL=letzte Bildadr / XL=yPos / AF,BC,DE veraendert
;BENOETIGT HLINET (ohne Adresse mit Ueberlauf!)
;
;VLINEM1 (Mode 1) , VLINEM2 (Mode 2)
;EIN   DE=x-Koordinate / H=y-Koord.Anfang / L=y-Koord.Ende
;AUS   HL=letzte Bildadr/C=Bitmaske / IXL=y-Anfang / DE erhalten
;
;BENOETIGEN BPOSM1 , BPOSM2
;
;
;Mode 1
HLINEM1 LD A,L;y-Koord
DEFB #DD
LD L,A;nach XL
LD H,B
LD L,C;x-Ende
OR A
SBC HL,DE;-x-Anfang
RET C;Ende<Anfang
PUSH HL;x-Differenz sich
CALL BPOSM1;Positionsberechnung fuer Md1
CALL WRITESCR;Pixel setzen
POP DE;x-Differenz aus HL
SRL D
RR E;x-Diff/2,da 2 Punkte pro Koordinate
HLINEM11 LD A,D
OR E;Differenz schon 0?
RET Z;fertig
RRC C;Maske nach rechts
LD A,C;Maske nach A
CP &10;schon<&10?
JR C,HLINEM12;ja,Maske Unterlauf
DEC DE;jetzt erst Breite-1
CALL WRITESCR;Maske A setzen
JR HLINEM11;und weiter
HLINEM12 LD A,E;Breite Lo
SRL D
RRA
SRL D
RRA;A=DE/4(Pixel pro Byte)
INC A;Byteanz+1,da gleich zuerst Djnz
LD B,A;Byteanzahl nach B
LD C,240;Byte voll (4 Pixel gesetzt)
JR HLINEM14
HLINEM13 INC HL;Adr+1
CALL WRITESCR0;mit C
HLINEM14 DJNZ HLINEM13;weiter
LD A,E
AND &3;Breite Mod 4
RET Z;fertig
;innerhalb Byte Restpixel setzen (A=Anz Bits)
LD DE,HLINET;Tabellenstart
ADD A,E;Tabelle ohne Ueberlaufadresse !
LD E,A
LD A,(DE);Bitmaske aus Tabelle holen
INC HL;next Byte
JP WRITESCR
;
VLINEM1 LD A,L;y-Koord.Ende
SUB H;-y-Koord.Anfang
RET C;Eende<Anfang!
PUSH AF;y-Diff sich
LD A,H;y-Anfang
DEFB #DD
LD L,A;nach XL
CALL BPOSM1;Positionsberechnung fuer Md1
CALL WRITESCR
POP AF;Laenge
RET Z;Laenge=0 - fertig
LD B,A;Laenge nach B
PUSH DE;x-Koord.sich
LD DE,#C050;Ueberlaufwert bei Next Line
VLINEM11
LD A,H
ADD A,8
LD H,A;next Line
AND #38;Ueberlauf?
JR NZ,VLINEM12;nein
ADD HL,DE;+Ueberlaufwert (entspricht -#3FB0)
VLINEM12 CALL WRITESCR0;mit C
DJNZ VLINEM11;bis Laenge=0
POP DE;x-Koord.zurueck
RET
;
;
;Mode 2
HLINEM2 LD A,L;y-Koord
DEFB #DD
LD L,A;nach XL
LD H,B
LD L,C;x-Ende
OR A
SBC HL,DE;-x-Anfang
RET C;Ende<Anfang
PUSH HL;x-Differenz sich
CALL BPOSM2;Positionsberechnung fuer Md2
CALL WRITESCR;Maske mit Scr verknuepfen
POP DE;x-Differenz aus HL
HLINEM21 LD A,D
OR E;Differenz schon 0?
RET Z;fertig
RRC C;Maske nach rechts
DEC DE;Breite-1
JR C,HLINEM22;Maske Unterlauf
CALL WRITESCR0;Pset mit Maske C
JR HLINEM21;und weiter
HLINEM22 LD A,E;Breite Lo
SRL D
RRA
SRL D
RRA
SRL D
RRA;A=DE/8(Pixel pro Byte)
INC A;Byteanz+1,da gleich zuerst Djnz
LD B,A;Byteanzahl nach B
LD C,255;Byte voll (4 Pixel gesetzt)
JR HLINEM24
HLINEM23 INC HL;Adr+1
CALL WRITESCR0;mit C
HLINEM24 DJNZ HLINEM23;weiter
LD A,E
AND &7;Breite Mod 8
RET Z;fertig
;innerhalb Byte Restpixel setzen (A=Anz Bits)
LD DE,HLINET;Tabellenstart
ADD A,E;Tabelle ohne Ueberlaufadresse !
LD E,A
LD A,(DE);Bitmaske aus Tabelle holen
INC HL;next Byte
JP WRITESCR
;
VLINEM2 LD A,L;y-Koord.Ende
SUB H;-y-Koord.Anfang
RET C;Eende<Anfang!
PUSH AF;y-Diff sich
LD A,H;y-Anfang
DEFB #DD
LD L,A;nach XL
CALL BPOSM2;Positionsberechnung fuer Md2
CALL WRITESCR
POP AF;Laenge
RET Z;Laenge=0 - fertig
LD B,A;Laenge nach B
PUSH DE;x-Koord.sich
LD DE,#C050;Ueberlaufwert bei Next Line
VLINEM21
LD A,H
ADD A,8
LD H,A;next Line
AND #38;Ueberlauf?
JR NZ,VLINEM22;nein
ADD HL,DE;+Ueberlaufwert (entspricht -#3FB0)
VLINEM22 CALL WRITESCR0;mit C
DJNZ VLINEM21;bis Laenge=0
POP DE;x-Koord.zurueck
RET
;
;
;
;
;Bildschirmpositionsberechnung (beliebiger Bildschirmstart)
;30.12.1989
;
;BPOSM1 (Mode 1) , BPOSM2 (Mode 2)
;EIN  DE=x-Koordinate (0-639) / IXL=y-Koordinate (0-199)
;AUS  HL=Bildadresse/A,C=BitMaske /B veraendert
;
;BENOETIGT BPOST (ohne Adresse mit Ueberlauf!) , SCRHI=Hi-Byte des Screens
;
;
;Mode 1
BPOSM1 PUSH DE;SICH
DEFB #DD
LD A,L;LD A,IXL
AND #F8;8*INT(Y/8)...
LD L,A
LD C,A
LD H,0
LD B,H;NACH HL UND BC
ADD HL,HL
ADD HL,HL;*4
ADD HL,BC;*5
ADD HL,HL;*10
DEFB #DD
LD A,L;Y-KOORD.
AND 7;REST VON Y/8
ADD A,A
ADD A,A
ADD A,A;*8
ADD A,H;Hi-Byte dazu
LD H,A;schon mal sichern
LD A,(SCRHI);Hi-Byte Scr
ADD A,H;dazu
LD H,A;und setzen
SRL D
RR E;x-Koord/2
LD A,E;xLo nach A
SRL D
RRA;/4
SRL D
RRA;/8
LD B,0
LD C,A;NACH BC
ADD HL,BC;UND ZUR ADR
LD A,E;xLo/2
AND 3;REST VON X/4
LD DE,BPOST;TABELLENADR
ADD A,E;LOW-BYTE DAZU
LD E,A
LD A,(DE);MASKE HOLEN
LD C,A;AUCH NACH C
POP DE;X-KOORD.ZURUECK
RET
;
;
;Mode 2
BPOSM2 PUSH DE;SICH
DEFB #DD
LD A,L;LD A,IXL
AND #F8;8*INT(Y/8)...
LD L,A
LD C,A
LD H,0
LD B,H;NACH HL UND BC
ADD HL,HL
ADD HL,HL;*4
ADD HL,BC;*5
ADD HL,HL;*10
DEFB #DD
LD A,L;Y-KOORD.
AND 7;REST VON Y/8
ADD A,A
ADD A,A
ADD A,A;*8
ADD A,H;Hi-Byte dazu
LD H,A;schon mal sichern
LD A,(SCRHI);Hi-Byte Scr
ADD A,H;dazu
LD H,A;und setzen
LD A,E;X-LOW NACH A
SRL D
RRA;DE/8,A=ERG
SRL D
RRA
SRL D
RRA
LD B,0
LD C,A;NACH BC
ADD HL,BC;UND ZUR ADR
LD A,E;X-LOW
AND 7;REST VON X/8
LD DE,BPOST;TABELLENADR
ADD A,E;LOW-BYTE DAZU
LD E,A
LD A,(DE);MASKE HOLEN
LD C,A;AUCH NACH C
POP DE;X-KOORD.ZURUECK
RET
;
;
;
list
;folgende Tabellen duerfen keine Adresse mit Hi-Byte-Ueberlauf belegen !!
BPOST DEFB #80,#40,#20,#10,#08,#04,#02,#01
HLINET DEFB #00,#80,#C0,#E0,#F0,#F8,#FC,#FE,#FF
nolist
;
LIST
END
;