1 REM Ins{nd av Kristoffer Eriksson <5357>    1988-06-21 18.58.59 (KERMIT)
; Fil: WNDINIT.ASM 
; Av: Kristoffer Eriksson, "SKE" <5357>. 
; 
;-Ver--/-Datum----/-Sign-/-Kommentar---------------------------------- 
; 2.00 / 88-04-10 / SKE  / WNDINIT utbruten ur WINDOW.ASM. Kommandoradshant. 
; 
; 
; Hindrar dubbelladdning, hanterar kommandoraden, skriver meddelanden, 
; initierar en del av programkoden i de andra modulerna. 

            EXTERN Init 

ChkLU:      =     43 
IO:         =     90 
Iocm.Wra:   =     4 
LUS.WIN:    =     7 


; --------- Initiering av inladdad kod ----- 

Init:       EXX 
            PUSH  HL 
            PUSH  DE 
            PUSH  BC 

            CALL  Chain.Clr        ; F|rbered Chain-data. 
            CALL  ClinePar         ; Hitta kommandoraden. 
            JR C  Ini.X1           ; Inga parametrar alls (vilket {r ok). 
            EXX 
            LD    HL,Itext5 
            LD    BC,ItextEnd - Itext5 
            CP    ";" 
            JP NZ ExitWrite        ; Tala om att inga parametrar accepteras. 
            EXX 
            CALL  Chain.Load       ; Lagra CHAIN-fil fr}n resten av raden. 
            LD    HL,Itext6 
            LD    BC,ItextEnd - Itext6 
            JP C  ExitWrite        ; Klaga p} syntaxen. 

            ; Kolla om det redan finns en enhet WND:. 

Ini.X1:     LD    DE,DevNamn 
            CALL  FindDev 
            LD    HL,IText1 
            LD    BC,IText3n - IText1
            JP NC ExitWrite        ; WND finns redan - ladda ej. 

            ; St{ll i ordning och skriv ut meddelande om inladdningen. 

            LD    HL,WndTop 
            LD    DE,(Y.Botm) 
            XOR   A                ; Nolla carry, och signalera undertryckning 
            SBC   HL,DE            ;   av nollor till I2ASC. 
            EX    DE,HL 
            LD    HL,IText3n 
            CALL  I2ASC            ; F|rbrukat minne. 
            LD    HL,(Y.Top) 
            LD    DE,WndTop 
            XOR   A                ; Nolla carry osv. 
            SBC   HL,DE 
            EX    DE,HL 
            LD    HL,IText4n 
            CALL  I2ASC            ; ]terst}ende minne. 
            LD    HL,IText3n 
            LD    BC,IText5 - IText3n 
            CALL  Write            ; Meddela att laddning utf|rs, och hur 
                                   ;   mycket minne som g}r }t. 

            ; Ta reda p} adressen till gamla CON:s drivrutin, och patcha kod. 

            LD    DE,Ini.CON 
            CALL  FindDev          ; BC <- Adress till drivrutin f|r CON: 
            LD    ($$Entry.CRT + 1),BC ; (WNDMAIN) 

            ; Ta reda p} adressen till ATTRIBUTE-v{rdet, och patcha koden. 

            LD    HL,(116) 
            LD    BC,6 
            ADD   HL,BC 
            LD    ($$ATTR.1+1),HL  ; (WNDMAIN) Adress till ATTRIBUTE-v{rde 
            LD    ($$ATTR.2+1),HL  ; (WNDMAIN) 
            LD    ($$ATTR.3+1),HL  ; (WNDMAIN) 
            LD    ($$ATTR.4+1),HL  ; (WNDOPEN) 

            ; Ta bort referenser till ATTRIBUTE-v{rdet om inte ABC 806. 

            LD    A,(BasicTyp) 
            CP    Typ.806 
            JR Z  Ini.X2 
            LD    HL,$$ATTR.1 
            LD    BC,$$ATTR.2-$$ATTR.1+3 
            CALL  Clear 
            LD    HL,$$ATTR.3-3 
            LD    BC,6 
            CALL  Clear 
            LD    HL,$$ATTR.4 
            LD    BC,6 
            CALL  Clear 
            LD    A,($$RET)        ; Attribut beh|ver }terst{llas bara p} 806. 
            LD    (AttrWrap),A     ; Ers{tt med RET-kod. 

            ; Ta reda p} LU.DCB till gamla fil 0, och patcha koden. 

Ini.X2:     LD    HL,(CRT.LU+LU.DCB) 
            LD    ($$Dev.CRT+1),HL 

            ; St{ll i ordning den rutin som i CONSI-vektorn ska f}nga upp 
            ; anrop fr}n CONREAD i PROM. 

            LD    HL,(ConsI+1)     ; L{nka om get-rutinen 
            LD    ($$ConsI+1),HL   ; (WNDMAIN) 
            LD    HL,ConsI.Ny 
            LD    (ConsI+1),HL 
            LD    HL,(ConRead+1)   ; Adress till den inbyggda CONREAD-rutinen 
            LD    DE,20 
            ADD   HL,DE            ; Adr efter CONSI-anropet i den rutinen 
            LD    ($$CRTInpRet+1),HL    ; (WNDMAIN) 
 
            ; Initiera LU.CSIZE som i 806, om den inte anv{nds (inneh}ller 
            ; 255) p} den aktuella maskinen (802, 800). WINDOW:s rutiner 
            ; anv{nder numera inte denna i n}gra tester (utom AttrWrap som 
            ; bara anv{nds p} ABC806), men den kan lika g{rna initieras {nd}. 

            LD    A,(CRT.LU+LU.CSIZE) 
            INC   A 
            JR NZ Ini.X4                ; Den anv{nds. 
            LD    A,(CRT.LU+LU.WID) 
            CP    41 
            LD    A,1100I               ; Flagga f|r WIDTH < 41 och EL 
            JR C  Ini.X3 
            XOR   A 
Ini.X3:     LD    (CRT.LU+LU.CSIZE),A 

            ; Initiera andra variabler i CRT.LU, och kopiera CRT.LU till 
            ; nya CON.LU. LU.ATTR beh|v ej init, g{ller ej f|r CON. 

Ini.X4:     XOR   A 
            LD    (CRT.LU+LU.WSTAT),A 
            LD    A,(CRT.LU+LU.STAT)    ; Se till att flaggan f|r {kta 
            RES   LUS.WIN,A             ;   f|nster inte {r satt. 
            LD    (CRT.LU+LU.STAT),A 

            LD    HL,CRT.LU 
            LD    DE,CON.LU 
            LD    BC,23            ; Flytta CON: till nytt LU-block 
            LDIR 

            ; L{nka in nya CON.LU i LU.kedjan. 
            ; Med den h{r enkla metoden blir visserligen det gamla kvar sist 
            ; i kedjan, men det g|r inget, och det f|renklar dessutom {ven 
            ; url{nkningen. 

            LD    HL,(LUCh) 
            LD    (CON.LU),HL 
            LD    HL,CON.LU 
            LD    (LUCh),HL 
            LD    HL,DevEntry         ; Anv{nd f|nsterdrivrutinerna f|r CON: 
            LD    (CON.LU+LU.DCB),HL  ; dock |ppnad som vanlig CON: 
 
            ; L{nka in de nya enheterna i enhetslistan. 

            LD    HL,(DevTbA) 
            LD    (DevL{nk1),HL 
            LD    HL,DevL{nk2 
            LD    (DevTbA),HL 

            ; Skydda minnet som programmet ligger i. 

            LD    HL,WndTop 
            LD    (Y.Botm),HL 
            LD    (Y.ComTop),HL 

            ; Avsluta initieringen. 

Exit:       POP   BC 
            POP   DE 
            POP   HL 
            EXX 
$$RET:      RET 


ExitWrite:  CALL  Write 
            JR    Exit 


; Utskrift p} fil 0. Utskrift med CONWRITE fungerar ju inte bra om WINDOW 
; redan {r laddat. 

Write:      XOR   A 
            PUSH  BC 
            CALL  ChkLU 
            POP   BC 
            JP C  ConWrite 
            LD    A,IOCM.WRA 
            JP    IO 


; Nollst{ll adress HL, BC bytes, minst 2. 

Clear:      LD    (HL),0 
            LD    E,L 
            LD    D,H 
            INC   DE 
            DEC   BC 
            LDIR 
            RET 


IText1:     DEFM  "WINDOW finns redan." 
IText3n:    DEFM  "     bytes f|rbrukade. Det finns " 
IText4n:    DEFM  "      bytes kvar." 
            DEFB  10,13 
            DEFM"WINDOW Ver 2.00 laddat. Av Kristoffer Eriksson, 1985 & 1988." 
Itext5:     DEFM  "WINDOW tar inga parametrar ut|ver CHAIN-kommando." 
            DEFB  10,13 
Itext6:     DEFM  "Syntax: RUN WINDOW(,;CHAIN-fil (parametrar))" 
            DEFB  10,13 
ITextEnd: 
Ini.CON:    DEFM  "CON" 
