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 
