1 REM Ins{nd av Kristoffer Eriksson <5357> 1988-06-21 19.05.55 (KERMIT) ; Fil: WNDSAVE.ASM ; Av: Kristoffer Eriksson, "SKE" <5357>. ; ;-Ver--/-Datum----/-Sign-/-Kommentar---------------------------------- ; X.00 / 85-03-22 / SKE / WNDSAVE utbrutet. ; 1.00 / 85-03-27 / SKE / ; 2.00 / 88-04-17 / SKE / Anv{nder LU.SWID i st{llet f|r LU.CSIZE i Where. ; ]terst{ller attribut efter WndSave och WndRestore. ; ; ; Lagring av f|nsterinneh}llet inklusive ram, till str{ng, samt }terutskriv- ; ning av str{ngen till f|nstret. Genom att t ex lagra f|nstret innan ramen ; skrivits ut kan man sedan ta bort f|nstret genom att skriva tillbaks det ; som stod d{r fr}n b|rjan. Eller man kan spara f|nstret, st{nga det, |ppna ; ett nytt p} annan plats menmed samma format, och skriva ut inneh}llet d{r. ; ; Dessa rutiner accessar bildminnet direkt, liksom {ven str{ngen. ; ; Importerar CrtAdr, BasicTyp, Typ.806 EXTERN WndSave, WndRestore ; Spara f|nstret i str{ng. DE = VAROOT f|r str{ngen. [r Carry sann, lagras ; inte attributen. [r maskinen inte en 806, lagras attributen inte heller. WndSave: PUSH HL ; HL & BC sparas f|r WNDWRITEs skull. PUSH BC PUSH AF CALL Where ; HL <- CRT-adress, B <- h|jd, C <- bredd. POP AF PUSH AF ;----, PUSH HL ;----! PUSH BC ;----! $$1: JR C SAV.X1 ; ! SLA C ; ! F|rdubbla utrymmet p} ABC806 om carry. SAV.X1: CALL Mul1$2 ; ! HL <- B*C, Lagringsutrymme PUSH HL ;--, ! CALL VARPTR ; ! ! BC <- DIM, DE <- Adress, HL <- Pek LEN JR Z SAV.G}rEj4; ! ! EX (SP),HL ;--+ ! PUSH HL ;-,! ! SCF ; !! ! SBC HL,BC ; !! ! POP BC ;-'! ! Utrymmeskrav. POP HL ;--' ! Pekare till LEN. JR NC SAV.G}rEj3; ! LD (HL),C ; ! St{ll str{ngens l{ngd. INC HL ; ! LD (HL),B ; ! POP BC ;----! H|jd & bredd. POP HL ;----! F|nsteradress. POP AF ;----' Attributflagga. SAV.L2: PUSH BC ; Lagra bilden. PUSH HL LD B,C SAV.L1: LD C,(HL) ; Ingen instruktion i deninre loopen INC HL ; p}verkar Carry-flaggan. $$2: JR C SAV.X2 IN A,(53) ; Dessa tre instruktioner g{ller bara LD (DE),A ; f|r ABC 806 med attribut-minne. INC DE ; JR C {ndras till bara JR. SAV.X2: LD A,C LD (DE),A INC DE DJNZ SAV.L1 POP HL LD BC,80 PUSH AF ; Bevara Carry-flaggan. ADD HL,BC POP AF POP BC DJNZ SAV.L2 SAV.]ter: POP BC ; OBS: Hopp hit av RES.]ter POP HL JR RetOut53 ; ]terst{ll attribut, och returnera. SAV.G}rEj4: POP BC ; Rensa upp stacken. SAV.G}rEj3: POP BC POP BC POP BC JR SAV.]ter ; ]terst{ll f|nstret fr}n str{ng. DE = VAROOT f|r str{ngen. [r Carry sann, ; }terst{lls inte attributen, utan det senast anv{nda i det aktuella f|nstret ; anv{nds (det {r redan inst{llt av drivrutinerna). [r maskinen inte en 806, ; }terst{lls attributen inte heller. WndRestore: PUSH HL ; HL & BC sparas f|r WNDWRITEs skull. PUSH BC CALL VARPTR ; BC <- DIM, DE <- Adress, HL <- Pek LEN. JR Z RES.]ter PUSH AF CALL Where ; HL <- CRT-adress, B <- h|jd, C <- bredd. POP AF RES.L2: PUSH BC ; ]terst{ll bilden PUSH HL ; Inre loopen inneh}ller inga instruktioner LD B,C ; som p}verkar carry-flaggan. RES.L1:$$3: JR C RES.X1 LD A,(DE) ; Dessa tre instruktioner g{ller bara OUT (53),A ; f|r ABC 806 som har attribut-minne. INC DE ; RES.X1: LD A,(DE) INC DE LD (HL),A INC HL DJNZ RES.L1 POP HL LD BC,80 PUSH AF ; Skydda Carry-flaggan. ADD HL,BC POP AF POP BC DJNZ RES.L2 RES.]ter: JR SAV.]ter ; H{mta data ur VAROOT. Returnerar sann Z-flagga om data {r d}liga. ; BC <- DIM, DE <- Adress, HL <- Pekare till l{ngden. ; P}verkar inte Carry-flaggan (f|r WndRestore). VARPTR: EX DE,HL ; Vid anrop: DE=VAROOT BIT 7,H RET Z ; Z om orimligt l}g VAROOT LD C,(HL) ; BC <- DIM INC HL LD B,(HL) INC HL LD E,(HL) ; DE <- Adress INC HL LD D,(HL) INC HL BIT 7,D ; Z om ej riktig str{ng, eller oallokerad RET ; HL pekar nu p} LEN, ; HL <- CRT-adress f|r f|nstrets |vre v{nstra h|rn, B <- h|jd, C <- bredd i ; bytes (inte tecken). R{knar in de delar av f|nstrets ram som rymms p} ; sk{rmen. Where: PUSH DE LD L,41 ; Utr|na bildsk{rmens fysiska bredd. LD A,(IX+LU.SWID) CP L DEC L ; Om LU.SWID < 41, f}r vi 40 i L,annars 80. JR C WH.X1 LD L,80 WH.X1: CALL LdKoor ; D,E,B,C <- LINE0, COL0, HIGHT, WIDTH LD A,B ; Ta med de delar av ramen som inte hamnar ADD D ; utanf|r sk{rmen CP 25 JR NC WH.X2 INC B ; Undre kanten finns p} sk{rmen WH.X2: LD A,C ADD E CP L JR NC WH.X3 INC C ; H|gra kanten finns p} sk{rmen WH.X3: XOR A CP D JR Z WH.X4 DEC D ; \vre kanten finns p} sk{rmen INC B WH.X4: CP E JR Z WH.X5 DEC E ; V{nstra kanten finns p} sk{rmen INC C WH.X5: CALL CrtAdr ; HL <- Bildminnesadress, justera C POP DE ; ifall WIDTH 40. RET Mul1$2: LD HL,0 ; HL <- B * C PUSH DE LD D,H LD E,C INC B $$JR: JR Mul.X1 Mul.L1: ADD HL,DE Mul.X1: DJNZ Mul.L1 POP DE RET ; --------- Initiering ------------------------ ; ; Attributminnet beh|ver sparas bara om det {r en ABC 806. [r det inte det ; patchar vi bort den programkod som sk|ter det. Init: LD A,(BasicTyp) CP Typ.806 RET Z LD A,($$JR) LD ($$1),A ; [ndra villkorligt JR till ovillkorligt. LD ($$2),A LD ($$3),A RET REL PUSH Init REL CALL ORG Init