;******** Archi-Draw-Pack  fuer Mode 1 , Mode 2 **********************
;

;ARCHIDR1 - ArchiDraw (v1.4) im Mode 1
;17.3.1991
;[Line1 - Zeichnen beliebiger Linien ( Bildschirmstart beliebig )30.12.1989]
;
NOLIST
;WRITE"ARCHIDR1.BIN"
;
limit &a400
;
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)

BILDANF EQU BUFFANF+2;DW 0 (akt.Bildanfangsadr)
BILDPOS EQU BILDANF+2;DW 0 (aktuelle Position 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)
;
;
POWINOB EQU KDIFF+2;DB 0 !!!
POWINLI EQU POWINOB+1;DW 0 !!!
;

;
ORG &A000
JP VARINIT
JP WAEHLEST
JP BILDSHOW

;
;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 BPOSM1;*** Adresse der Positionsberechnung BposM1
;

;
VARINIT CP 1
RET NZ
LD L,(IX+0)
LD H,(IX+1);Bufferanfang holen
LD (BUFFANF),HL;set
LD A,&FF
LD (POSSET),A;Flag,Position bei Linemake setzen
LD HL,0
LD (POWINLI),HL
LD A,0
LD (POWINOB),A
RET
;
;call bildselect,bildnr
WAEHLEST CP 1
RET NZ
LD A,(IX+0);Bildnr holen
CALL WAEHLEBILD
LD (ERRFLG),A;Error set(0=ok)
RET
;
;

;
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
;

;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
;


;
;** Grafikcursorprozeduren **
;
;
;Grafikcursor home
GRACURHOME
LD DE,(POWINLI);Pointer-Window links
LD A,(POWINOB);Pointer-Window oben
LD L,A
;weiter...
;Grafik-Cursor set
; EIN  DE=xpos ; L=ypos
GRACURSET LD (XPOS),DE
LD A,L
LD (YPOS),A
RET

;
;
;** Bufferprozeduren **
;
;
;akt.Daten ab Bildptr holen+Bildptr erhoehen + Art entsprechend D setzen
; EIN  HL=max.Adr von (Bildptr)
; AUS  DE=xpos ; L=ypos ; A=Fehler
DATGET0
LD DE,(BILDPTR)
INC DE
INC DE
INC DE
;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
JR NZ,WEITER;ungleich
LD A,L
SUB E
;
WEITER:
;
LD A,6;Error
RET C;DE>HL
EX DE,HL;nach HL
LD (BILDPTR),HL;neuer Pointer set
;DATGET1;ab HL holen
DEC HL
LD A,(HL);ypos
DEC HL
LD D,(HL);xpos hi
DEC HL
LD E,(HL);xpos lo
;
LD L,A;ypos nach L
XOR A;Ok
JP ARTSET;Art setzen
;
;
;** Bildprozeduren **

;Bildlaengenget
; AUS  BC=Bildlaenge
BILDLGGET
PUSH HL
LD HL,(BILDANF)
LD C,(HL)
INC HL
LD B,(HL)
POP HL
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
;Bildanzahl get
; AUS  A=Bildanzahl(0..n)
BILDANZGET
PUSH HL
LD HL,(BUFFANF)
LD A,(HL)
POP HL
;
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
;

;
;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
;
;
;
;Line
;
SCRHI DEFB &C0;Screen-Hi-Byte &40 oder &C0
HLINE JP HLINEM1;*** Adresse der Horizontalroutine HLineM1
VLINE JP VLINEM1;*** Adresse der Vertikalroutine VLineM1
;
;
; 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)
;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)
;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
;
;
;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
;
;
;
;Bildschirmpositionsberechnung (beliebiger Bildschirmstart)
;30.12.1989
;
;BPOSM1 (Mode 1)
;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
;
;
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
;

;********************************************************************

;ARCHIDR2 - ArchiDraw (v1.4) im Mode 2
;17.3.1991
;[Line1 - Zeichnen beliebiger Linien ( Bildschirmstart beliebig )30.12.1989]
;
NOLIST
;WRITE"ARCHIDR2.BIN"
;
limit &a400
;
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)

BILDANF EQU BUFFANF+2;DW 0 (akt.Bildanfangsadr)
BILDPOS EQU BILDANF+2;DW 0 (aktuelle Position 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)
;
;
POWINOB EQU KDIFF+2;DB 0 !!!
POWINLI EQU POWINOB+1;DW 0 !!!
;

;
ORG &A000
JP VARINIT
JP WAEHLEST
JP BILDSHOW

;
;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 BPOSM2;Adresse der Positionsberechnung BposM2
;

;
VARINIT CP 1
RET NZ
LD L,(IX+0)
LD H,(IX+1);Bufferanfang holen
LD (BUFFANF),HL;set
LD A,&FF
LD (POSSET),A;Flag,Position bei Linemake setzen
LD HL,0
LD (POWINLI),HL
LD A,0
LD (POWINOB),A
RET
;
;call bildselect,bildnr
WAEHLEST CP 1
RET NZ
LD A,(IX+0);Bildnr holen
CALL WAEHLEBILD
LD (ERRFLG),A;Error set (0=ok)
RET
;
;

;
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
;

;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
;


;
;** Grafikcursorprozeduren **
;
;
;Grafikcursor home
GRACURHOME
LD DE,(POWINLI);Pointer-Window links
LD A,(POWINOB);Pointer-Window oben
LD L,A
;weiter...
;Grafik-Cursor set
; EIN  DE=xpos ; L=ypos
GRACURSET LD (XPOS),DE
LD A,L
LD (YPOS),A
RET

;
;
;** Bufferprozeduren **
;
;
;akt.Daten ab Bildptr holen+Bildptr erhoehen + Art entsprechend D setzen
; EIN  HL=max.Adr von (Bildptr)
; AUS  DE=xpos ; L=ypos ; A=Fehler
DATGET0
LD DE,(BILDPTR)
INC DE
INC DE
INC DE
;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
JR NZ,WEITER;ungleich
LD A,L
SUB E
;
WEITER:
;
LD A,6;Error
RET C;DE>HL
EX DE,HL;nach HL
LD (BILDPTR),HL;neuer Pointer set
;DATGET1;ab HL holen
DEC HL
LD A,(HL);ypos
DEC HL
LD D,(HL);xpos hi
DEC HL
LD E,(HL);xpos lo
;
LD L,A;ypos nach L
XOR A;Ok
JP ARTSET;Art setzen
;
;
;** Bildprozeduren **

;Bildlaengenget
; AUS  BC=Bildlaenge
BILDLGGET
PUSH HL
LD HL,(BILDANF)
LD C,(HL)
INC HL
LD B,(HL)
POP HL
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
;Bildanzahl get
; AUS  A=Bildanzahl(0..n)
BILDANZGET
PUSH HL
LD HL,(BUFFANF)
LD A,(HL)
POP HL
;
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
;

;
;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
;
;
;
;Line
;
SCRHI DEFB &C0;Screen-Hi-Byte &40 oder &C0
HLINE JP HLINEM2;Adresse der Horizontalroutine HLineM2
VLINE JP VLINEM2;Adresse der Vertikalroutine VLineM2
;
;
; 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 !
;
;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!)
;
;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 BPOSM2
;
;
;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
;
;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 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
;

;********************************************************************
