1 REM Ins{nd av Kristoffer Eriksson <5357>    1988-06-21 19.07.05 (KERMIT)
; Fil: WNDSCRL.ASM 
; Av: Kristoffer Eriksson, "SKE" <5357>. 
; 
;-Ver--/-Datum----/-Sign-/-Kommentar---------------------------------- 
; X.00 / 84-12-03 / SKE  / WNDSCRL 
; 1.00 / 85-03-27 / SKE  / 
; 2.00 / 88-04-17 / SKE  / Testar LU.SWID i st{llet f|r LU.CSIZE i CrtAdr. 
;                          Scroll och CLS }terst{ller attribut till LU.OUT53 
;                          korrekt. 
; 
; Rutiner f|r scroll och formfeed i f|nster, i f|rsta hand f|r WNDWRITE. 
; Fysisk access till bildminnet, med rutiner f|r adressber{kning {ven anv{nda 
; av WNDSAVE. F|ruts{tts anropas inom CrtInit - CrtExit, s} CRT.LU.OUT53 {r 
; korrekt. 


            EXTERN Scroll, BackScroll, CLS, CrtAdr, LdKoor, RetOut53 

; Rensa hela f|nstret. "Form-Feed". 

CLS:        CALL  ScreenData 
            RET   Z                ; ]terhopp om "en-dimensionellt" f|nster 
CLS.L1:     PUSH  BC 
            PUSH  HL 
            EX    DE,HL            ; DE <- Bildadr 
            CALL  ClearLine 
            POP   HL 
            POP   BC 
            LD    DE,80 
            ADD   HL,DE            ; N{sta rad 
            DJNZ  CLS.L1 
            RET 


; Scrolla en rad fram- resp bakl{nges i f|nster. 

BackScroll: CALL  LdKoor           ; D,E,B,C <- LINE0, COL0, HIGHT, WIDTH 
            LD    A,D              ; LINE0 
            ADD   B                ; HIGHT 
            LD    D,A 
            DEC   D                ; D <- H|gsta fysiska radnr. 
            CALL  ScreenData. 
            RET   Z                ; ]terhopp om "en-dimensionellt" f|nster. 
            LD    DE,-80           ; Bak}tstegning. 
            JR    Scr.Loop 
 
Scroll:     CALL  ScreenData 
            RET   Z                ; ]terhopp om "en-dimensionellt" f|nster. 
            LD    DE,80            ; (Fram}t-)stegning. 
            JR    Scr.Loop 
Scr.L1:     PUSH  BC 
            PUSH  HL 
            LD    B,A              ; B <- 0 
            LDIR 
            POP   HL 
            POP   BC 
            POP   DE               ; Stegv{rde. 
Scr.Loop:   PUSH  DE 
            PUSH  HL 
            ADD   HL,DE            ; N{sta fr}n-rad. 
            POP   DE               ; DE <- M}l-rad = F|rra fr}n-raden. 
            DJNZ  Scr.L1 
            POP   HL               ; Eliminera stegv{rdet. 


; Rensa enskild rad. DE = Radens startadress, C = radl{ngd. 
; 
; N{r PROM-rutinerna rensar sk{rmen, nollst{ller den attributkoden f|r alla 
; teckenpositioner. Nollst{llt attribut inneb{r att bildsk{rmsh}rdvaran 
; forts{tter visa samma attribut som p} positionen innan, eller om positionen 
; {r den f|rsta p} raden, s} visas vitt p} svart bakgrund. 
; 
; Ett f|nsters v{nstra kant sammanfaller ju inte med sk{rmens kant, s} om alla 
; attribut i ett f|nster nollst{lls, kommer det att visas med de attribut som 
; anv{nds till v{nster om f|nstret (oftast f|nstrets ram), vilket inte {r 
; kompatibelt med vanliga CON:. D{rf|r s{tts h{r attribut f|r vit f|rgrund och 
; svart bakgrund i f|rsta kolumnen, och noll i resten. 

ClearLine:  LD    L,E 
            LD    H,D 
            LD    A,7              ; Vit text/svart bakgrund i f|rsta kolumn. 
            OUT   (53),A 
            LD    (HL)," " 
            INC   DE 
            DEC   C 
            JR Z  RetOut53 
            XOR   A 
            OUT   (53),A           ; Attribut utan inverkan i resten. 
            INC   HL 
            LD    (HL)," "         ; Lagra blanktecken. 
            INC   DE 
            DEC   C 
            JR Z  RetOut53 
            LD    B,A 
            LDIR 
RetOut53:   LD    A,(CRT.LU+LU.OUT53) ; Hopp hit {ven fr}n WNDSAVE. 
            OUT   (53),A           ; ]terst{ll det gamla attributet. 
            RET 


; H{mta f|nstrets koordinater. Anropas {ven fr}n WNDSAVE. 

LdKoor:     LD    D,(IX+LU.LINE0) 
            LD    E,(IX+LU.COL0) 
            LD    B,(IX+LU.HIGHT) 
            LD    C,(IX+LU.WID) 
            RET 


; Ber{kna f|nstrets adress, kolla dess storlek. 

ScreenData: CALL  LdKoor 
ScreenData.:CALL  CrtAdr           ; HL <- Adress i bildminnet f|r f|nstret. 
            XOR   A                ; A <- 0 
            CP    B 
            RET   Z                ; ]terhopp om "en-dimensionellt" f|nster. 
            CP    C 
            RET                    ; Z om "en-dimensionellt" f|nster. 


; Ber{kna till HL fysisk bildminnesaress f|r fysisk rad D och kolumn E, med 
; h{nsyn till 40/80-teckensmode. Justerar {ven ev bredd i C vid 40-teckens- 
; mode. Anropas {ven fr}n WNDSAVE. 

CrtAdr:     LD    A,(IX+LU.SWID)   ; D=Rad, E=Kolumn, HL <- bildminnesadress. 
            CP    41 
            JR NC CrtA.X1 
            SLA   E                ; F|rdubbla kolumnen om WIDTH 40 anv{nds. 
            SLA   C                ; [ven bredden (H|r egentligen inte till 
CrtA.X1:    PUSH  DE               ;   denna rutin, men {r praktisk). 
            LD    E,D 
            LD    L,D 
            LD    D,0 
            LD    H,D 
            ADD   HL,HL            ; 2* 
            ADD   HL,HL            ; 4* 
            ADD   HL,DE            ; 5* 
            ADD   HL,HL            ; 10* 
            ADD   HL,HL            ; 20* 
            ADD   HL,HL            ; 40* 
            ADD   HL,HL            ; 80* 
            POP   DE 
            LD    D, 30720 / 256 
            ADD   HL,DE 
            RET 
