;pour - Urversion
;PoPack1 - Pointer-Pack (v1.0)
;19.4.1992 (1.,2.4.1992)
;
nolist
;
;WRITE"POUR1.BIN"
;
org &9000
LD A,#00;keine Maus
LD (MAUS),A
LD HL,#00D2;Rahmen,Innenraum Window
LD (WINDOWB),HL
LD HL,&A100
LD (PHIBU),HL;Hintergrbufferadr
LD HL,#BB00
LD (POWIN),HL;oben,unten
LD HL,#4E00
LD (POWIN+2),HL;links,rechts
LD HL,#1015
LD (PMPOS),HL
CALL PMOVE
RET
;

WINDOWB EQU &a000;DB 0,0 (Farbzahl Rahmen/Innenraum d.Windows)
NMOVE EQU WINDOWB+2;DB 0,0 (Normalmove y,x)
MAUS EQU NMOVE+2;DB 0 (Flag, ob Maus=#FF)
AMOVE EQU MAUS+1;DB 0,0 (akt.Move)
ZMOVE EQU AMOVE+2;DB 0 (Movezaehler)
ALTJOY EQU ZMOVE+1;DB 0 (alter Joystickwert)
PHIBU EQU ALTJOY+1;DW 0;ADR HINTERGR.BUFFER
PMPOS EQU PHIBU+2;DW 0 (PointerMovePOS y,x)
POWIN EQU PMPOS+2;DS 8 (Pointerwindow ob,un-187,li,re-78/Menuewindow ob...)
POSELA EQU POWIN+8;DW 0 (POSitionSELectAdr)
POSLANG EQU POSELA+2;DB 0 (POSitionsLAeNGe des Selects)

;
;V. Keyboard-Pack
WAITMV PUSH BC
PUSH HL
WAITMV1 CALL #BB24;KM Get JOY
LD A,H;Joy 0
OR A
JR NZ,WAITMV3
LD A,L;Joy 1
OR A
JR NZ,WAITMV3
LD HL,KEYTAB
LD B,6;max.Anz
WAITMV2 LD A,(HL);Tastennummer
INC HL
PUSH HL
CALL #BB1E;KM Test KEY, C veraendert !
POP HL
LD A,(HL);Richtungscode
INC HL
JR NZ,WAITMV3;gedrueckt
DJNZ WAITMV2;weiter
XOR A
LD (ALTJOY),A;keine Bewegung
JR WAITMV1;nein,warten
WAITMV3 LD H,A;Code sich
LD A,(ALTJOY);alter Code
CP H;=neuer?
CALL NZ,DMOVEINIT;<>
LD A,H
LD (ALTJOY),A
POP HL
POP BC
RET

NOCHAR
PUSH AF
NOCHAR1
CALL #BB1B;KM Read KEY
JR C,NOCHAR1;Zeichen da
POP AF
RET


;
;II. Screen-Pack
NLINE LD A,D
ADD A,#08
LD D,A
RET NC
AND #38
RET NZ
LD A,D
SUB #40
LD D,A
LD A,E
ADD A,#50
LD E,A
RET NC
INC D
;Uebertrag auf RA unberuecksichtigt
RET

BADR
PUSH HL;SICH
LD A,C;Y-KOORD.
AND #F8
LD L,A
LD H,0
LD D,H
LD E,L
ADD HL,HL
ADD HL,HL
ADD HL,DE
ADD HL,HL;*10 /8*80
LD A,C;Y-KOORD.
AND 7;MOD 8
ADD A,A
ADD A,A
ADD A,A;*8
ADD A,#C0;SCR-START
LD D,A
LD E,B;X-KOORD.
ADD HL,DE;HL=BILDADR
EX DE,HL;NACH DE
POP HL
RET

;
;VI. Pointer-Pack

;Inver,TestBil unbed. in Ram, URomDi
INVER
OR A;LG=0?
RET Z
PUSH BC;SICH
PUSH DE
LD C,A;LAENGE IN C SICH
INVER1
LD D,H
LD E,L;SICH 
LD B,C
INVER2
LD A,(HL);BYTE VOM BILDSCHIRM GET
CPL;COMPLEMENT
LD (HL),A;ZURUECK AUF BILDSCHIRM
INC HL
DJNZ INVER2
LD H,D
LD L,E
LD A,H
ADD A,8
LD H,A
JR NC,INVER1;BIS UEBERLAUF
POP DE
POP BC
RET


TESTBIL
LD A,(HL);BILDSCHIRMBYTE
CP E;TESTBYTE?
RET NZ;NEIN ENDE
LD D,H;HI-BYTE SICH
LD B,7;NOCH 7 LINES
TESTBIL1
LD A,H
ADD A,8;NEXT LINE
LD H,A
LD A,(HL);BYTE
CP E;=WINDOWB?
JR NZ,TESTBIL2;<>ENDE
DJNZ TESTBIL1;BIS ALLE LINES
TESTBIL2
LD H,D;ALTES HI-BYTE
RET
;
;

POHIPUT PUSH BC
LD BC,(PMPOS)
CALL BADR;Bildadr nach DE
LD HL,(PHIBU);gesicherter Hintergrund
LD BC,#0EFF;B=Anz Zeilen
POHIPUT2 LDI
LDI
DEC DE
DEC DE
CALL NLINE
DJNZ POHIPUT2
POP BC
RET

POMOVE PUSH BC
PUSH DE
PUSH HL
PUSH IX
LD BC,(PMPOS)
CALL BADR;Bildadr aus BC
LD HL,POMASK;Pointermaske
LD IX,(PHIBU);PointerMove-Hintergrundbuffer
LD B,#0E;Anz Zeilen
POMOVE2 LD A,(DE)
LD (IX+0),A;Hintergr. sich
INC IX
AND (HL);and-Makse dazu
INC HL
OR (HL);or-Maske
INC HL
LD (DE),A
INC DE
LD A,(DE)
LD (IX+0),A
INC IX
AND (HL)
INC HL
OR (HL)
INC HL
LD (DE),A
DEC DE;alte Adr
CALL NLINE
DJNZ POMOVE2
POP IX
POP HL
POP DE
POP BC
RET
;
DMOVEINIT PUSH AF
PUSH HL
LD HL,#0205;Movewerte bei Maus
LD A,(MAUS)
OR A
JR NZ,DMOVEINIT2;Maus
LD HL,#0101;Joystick,Cursor
DMOVEINIT2 LD (AMOVE),HL;als akt.Move
LD A,12
LD (ZMOVE),A;Zaehler init
POP HL
POP AF
RET
;Moveabstand erhoehen,falls Zaehler zmove=0 , nur af veraendert!
DMOVEINC LD A,(MAUS);Maus?
OR A
RET NZ;Ja,lineare Bewegung
LD A,(ZMOVE);Zaehler
OR A;0?
JR Z,DMOVEINC2;Ja
DEC A;-1
LD (ZMOVE),A
RET
DMOVEINC2
PUSH HL
LD HL,AMOVE;Adr y-Move
INC (HL);+1
LD A,(HL);get
RRA;Bit 0
JR NC,DMOVEINC3;Bit 0 nicht gesetzt
INC HL;Adr x-Move
INC (HL);+1
DMOVEINC3 LD A,5
LD (ZMOVE),A
POP HL
RET
;

BALKAN
LD (POSELA),HL;BALKENADR
LD (POSLANG),A;BALKENLAENGE
JP INVER;INVERTIEREN

BALKAUS
LD A,(POSLANG);BALKEN AN?
OR A
RET Z;NEIN=ZURUECK
PUSH HL;SICH
LD HL,(POSELA);BALKADR
CALL INVER
POP HL
BALKAUS1
XOR A
LD (POSLANG),A;BALKENLAENGE=0
RET


PMOVE
PUSH IX
PUSH IY
PUSH HL
PUSH DE;sich
CALL NOCHAR;BIS KEINE TASTE GEDR
LD IX,POWIN;ADR POINTERWINDOWAUSD.
CALL DMOVEINIT;MoveAbst init
CALL BALKAUS1;KEIN BALKEN

PMOVE2 LD BC,(PMPOS);NEUE P.
CALL TESTWIN;Im Window (evtl. Balken)
CALL POMOVE;Hintergr. sich+Pointer zeigen

PMOVE3
CALL WAITMV
LD BC,(PMPOS)
LD DE,(AMOVE);D=XMOVE/E=YMOVE
LD L,A;TASTENCODE
RR L;0.BIT
CALL C,HOCH
RR L
CALL C,RUNTER
RR L
CALL C,LINKS
RR L
CALL C,RECHTS
RR L
JR C,PMFEUER
RR L
JR C,PMESC
;BC=evtl. neue Pos
LD HL,(PMPOS);alte Pos
OR A
SBC HL,BC
CALL Z,DMOVEINIT;keine Bwg. - Move init
JR Z,PMOVE3;keine Bewegung
PUSH BC;neue Pos merken
CALL DMOVEINC;amove evtl.erhoehen,nur af veraendert
CALL #BD19
CALL POHIPUT;Hintergrund zurueck
POP HL;aus BC
LD (PMPOS),HL;neue Pos set
JP PMOVE2

PMFEUER
LD A,(POSLANG);Lg=0?
OR A
JR Z,PMOVE3;Ja,weiter
CALL POHIPUT;Hintergr zurueck
;LD HL,(POSELA);BILDPOS SELECT
;CALL ADRB;IN KOORD.UMW.
;INC B;XPO+1
;LD (POSPOS),BC;SICH
SCF;OK
PMENDE
POP DE
POP HL
POP IY
POP IX
RET

PMESC
CALL POHIPUT;Hintergr zurueck
XOR A;Z/NC
JR PMENDE

HOCH
LD A,C;YPOS
SUB E;-YMOV
RET C;UEBERL.
CP (IX+0);P.FENSTER OBEN
RET C;A<YMIN
LD C,A;SICH
RET
RUNTER
LD A,C;YPOS
ADD A,E;+YMOVE
RET C;UL.
CP (IX+1);UNTEN
JR Z,RUOK
RET NC;A>YMA
RUOK
LD C,A
RET
LINKS
LD A,B;XPOS
SUB D;-XMOV
RET C;UL.
CP (IX+2);LINKS
RET C;A<MI
LD B,A
RET
RECHTS
LD A,B;XPOS
ADD A,D;+XMOV
RET C;UL.
CP (IX+3);RECHTS
JR Z,REOK
RET NC;A>XMA
REOK
LD B,A
RET

TESTWIN
LD HL,BALKAUS;FORTSETZUNG
PUSH HL;BEI RET
CALL CTEST;IM MENUEWINDOW?
RET C;NEIN
EX DE,HL
CALL BADR;BILDADR NACH DE
EX DE,HL;und HL
LD A,(WINDOWB);WINDOWRAHMBYTE
LD E,A;NACH E
CALL AFIND;ANFANG VOM WINDOW FINDEN
RET NZ;NICHTS GEFUNDEN
INC HL;ADR+1
LD A,(WINDOWB+1);WINDOWINNEN
LD E,A;NACH E
CALL TESTBIL;AN POSIT VORHANDEN?
RET NZ;NEIN ENDE
INC HL
CALL TESTBIL;HIER NOCHMAL?
RET Z;JA AUCH ENDE
CALL EFIND;ENDE FINDEN,C=LG
LD A,(POSLANG);LAENGE AKT.SELECT
OR A;0?
LD A,C;LAENGE
JP Z,TESTWIN1;ALTE LG=0--NUR BALKAN
EX DE,HL;NEUE ADR IN DE 
LD HL,(POSELA);ALTE ADR
OR A
SBC HL,DE
EX DE,HL;HL=NEUE ADR
POP BC;BALKAUSADR
RET Z;GLEICH--BALKEN SCHON DA
PUSH BC;WIEDER AUF STACK
PUSH AF;LG
CALL BALKAUS;LOESCH
POP AF
TESTWIN1
POP BC;BALKAUSRUECKSPR
JP BALKAN

AFIND
LD A,(PMPOS+1);XPO
SUB (IX+6);MLINKS(FENSTER)
RET C;XPO<XLI NZ
INC A
LD C,A;NACH C
LD A,H
AND 7
OR #C0
LD H,A;OBERSTE ZEICHENZEILE
AFIN1 CALL TESTBIL;POSITION=E?
RET Z;JA
DEC HL;LINKS WEITERSUCHEN
DEC C;BYTEZAEHLER-1
JR NZ,AFIN1
INC C;NZ
RET

EFIND
LD C,0;START
PUSH HL;ADR SICH
EFIND1
INC HL;ADR+1
INC C;ZAEHLER+1
CALL TESTBIL;INNENBYTE GEFUNDEN?
JR NZ,EFIND1;NOCH NICHT
POP HL;ALTE ADR ZUR.
RET

CTEST LD A,C;YPOS
SUB (IX+4);-OBEN
RET C
LD A,(IX+5);UNTEN
SUB C;-YPOS
RET C
LD A,B;XPOS
SUB (IX+6);MLINKS 
RET C
LD A,(IX+7);MRECHTS
SUB B
RET


;
;IX. Tabellen

;Tastenueberprueftabelle  Tastencode,Richtungscode(falls gedrueckt)
KEYTAB DEFB 0,1, 2,2, 8,4, 1,8, 9,16, 66,32

POMASK
;And-Maske,Or-Maske,And-...
DEFB #AF,#A8,#FF,#00,#BB,#BA,#FF,#00,#BE,#BE,#FF,#80
DEFB #BF,#BF,#BF,#A0,#BF,#BF,#EF,#E8,#BF,#BF,#FB,#FA
DEFB #BF,#BF,#FE,#FE,#BF,#BF,#F7,#F4,#BF,#BF,#EF,#E8
DEFB #B5,#B5,#77,#74,#D7,#00,#BB,#BA,#FF,#00,#DD,#5D
DEFB #FF,#00,#EE,#2E,#FF,#00,#F7,#17
;
;Ende
;
list
end


;
ADRB
PUSH HL
PUSH DE
LD A,H
AND 7
LD H,A
LD DE,80
LD C,D;0
OR A
ADRB1
SBC HL,DE
INC C
JR NC,ADRB1
ADD HL,DE
LD B,L;X-KOORD.
POP DE
POP HL
RET
;
