; TEXT-EDITOR                       2/8
; Anders Franz`n <5258>
; Stockholm April 1985
; Uppdaterad juli 1985


CUR      PUSH HL
         PUSH BC
         LD   HL,CUR1
         LD   BC,8
         CALL 0:11   ;CUR(23,0)
         POP  HL      CHR$(7)"*  ";
         LD   C,L    OBS  B=noll !!
         POP  HL
         CALL 0:11
         RET


; TILLBUFF
; Subrutin som placerar |nskad textrad
; i buffert.
; IN   DE = nr p} |nskad rad (OBS att
;           f|rsta raden {r nummer ett.

TILLBUFF LD   HL,(BRAD)  Gammal rad
         LD   (BRAD),DE  Spara ny rad
         LD   C,L
         LD   B,H
         XOR  A
         SBC  HL,DE      Samma rad ?
         RETZ            Ja, retur
         LD   HL,(TXT)
         JRNC TIL1       Rad < brad
         LD   A,B
         OR   C
         JRZ  TIL1       Ingen brad
         EX   DE,HL
         XOR  A
         SBC  HL,BC      Ber{kna antal
         INC  HL         rader from brad
         EX   DE,HL
         LD   HL,(PRAD)  Bradens prad
TIL1     LD   B,A        B=noll!
TIL2     LD   A,(HL)     L{ngd p} prad
         AND  A          Slut p} rader ?
         JRZ  TIL3       Ja, hoppa
         DEC  DE
         LD   A,D        Har vi hittat
         OR   E          raden ?
         JRZ  TIL3       Ja, hoppa
         LD   C,(HL)     L{ngd p} prad
         ADD  HL,BC      Peka p} n{sta
         JR   TIL2
TIL3     LD   (PRAD),HL
         LD   (SAKNAS),DE
         PUSH HL
         LD   HL,BUFF1
         PUSH HL
         LD   (HL),32
         LD   E,L
         LD   D,H
         INC  DE
         LD   BC,159
         LDIR            Blanka buffert
         POP  DE         Pekar p} buff
         POP  HL         Pekar p} prad
         LD   A,(HL)     L{ngd prad
         AND  A          Slut p} rader
         RETZ            Ja, retur
         DEC  A          Blankrad ?
         RETZ            Ja, retur
         INC  HL         F|rsta tecknet
         LD   B,A        Antal tecken
TIL4     LD   A,(HL)     Tag tecken
         INC  HL
         BIT  7,A        <TAB> ?
         JRNZ TIL5       Ja, hoppa
         LD   (DE),A     L{gg ner tkn
         INC  DE
         DJNZ TIL4       Upprepa
         RET             Klart!

TIL5     AND  127        Antalet space
         ADD  E
         LD   E,A        Fixa space !!
         DJNZ TIL4       N{sta tecken
         RET             Klart!


; FR]NBUFF
; Subrutin som sparar textrad som be-
; finner sig i buffert. Raden antas
; ha det nr som finns i (BRAD).

SPARRAD  LD   (BRAD),DE
         LD   A,255
         LD   (FILFLG),A
FR]NBUFF LD   HL,(BRAD)
         LD   A,H        Finns n}gon
         OR   L          rad i buffert ?
         RETZ            Nej, retur
         LD   HL,BUFF1   Pekar p} rad
         LD   DE,BUFF2+1
         LD   B,160      L{ngd p} raden
FR]1     LD   A,(HL)     Tag tecken
         INC  HL
         CP   32         Space ?
         JRNZ FR]3       Nej, hoppa
         CP   (HL)       Tv} space ?
         JRNZ FR]3       Nej, hoppa
         LD   C,1
FR]2     INC  C          R{kna space
         DEC  B          Raden slut ?
         JRZ  FR]4       Ja, gl|m space
         INC  HL
         CP   (HL)       Ett till space?
         JRZ  FR]2       Ja, r{kna p}
         DEC  B          [r raden slut ?
         JRZ  FR]4       Ja, gl|m space
         INC  B          ]terst{ll B
         LD   A,C        Antal space
         SUB  128        Antal < 128 ?
         JRC  FR]3       Ja, bit 7 satt
         INC  A          Antal-127
         OR   128        S{tt bit 7
         LD   (DE),A     L{gg ner antal
         INC  DE
         LD   A,255      Kod f|r 127 st
FR]3     LD   (DE),A     L{gg ner tkn
         INC  DE
         DJNZ FR]1       forts{tt
FR]4     LD   HL,BUFF2
         EX   DE,HL      HL=sista tkn
         AND  A
         SBC  HL,DE
         EX   DE,HL
         LD   C,E
         LD   B,D        BC=l{ngd rad
         LD   (HL),C     L{gg ner l{ngd
         LD   DE,(SAKNAS)
         LD   A,D        Saknas n}gra
         OR   E          rader ?
         JRZ  FR]6       Nej, hoppa
         PUSH HL         Ny prad
         PUSH DE         Antal saknade
         LD   HL,(EOT)
         ADD  HL,DE      Addera saknade
         ADD  HL,BC      Addera radl{ngd
         EX   DE,HL
         LD   HL,(MAX)
         AND  A
         SBC  HL,DE
         POP  DE         Antalet saknade
         POP  HL         Ny prad
         JPC  ERR        Minnet fullt !
         PUSH HL
         LD   HL,(EOT)
FR]5     LD   (HL),1     Fixa en ny rad
         INC  HL
         DEC  DE         Minska saknade
         LD   A,D        Fattas det
         OR   E          {nnu fler ?
         JRNZ FR]5       Ja, upprepa
         LD   (HL),A     Markera slut !
         LD   (EOT),HL
         LD   (SAKNAS),DE
         DEC  HL
         LD   (PRAD),HL
         POP  HL         Ny prad
FR]6     LD   DE,(PRAD)  Gammal prad
         LD   A,(DE)     L{ngd p} denna
         SUB  C
         JRZ  FR]9       Lika l}nga
         JRNC FR]7       Nya {r mindre
         PUSH HL         Ny prad
         PUSH DE         Gammal prad
         LD   HL,(EOT)
         NEG
         LD   C,A        BC=antal bytes
         ADD  HL,BC         som fattas
         EX   DE,HL
         LD   HL,(MAX)
         AND  A
         SBC  HL,DE
         POP  DE         Gammal prad
         POP  HL         Ny prad
         JPC  ERR        Minnet fullt !
         PUSH HL
         PUSH DE
         LD   HL,(EOT)
         PUSH HL
         AND  A
         SBC  HL,DE
         EX   (SP),HL
         LD   E,L
         LD   D,H        DE=gammal EOT
         ADD  HL,BC      HL=nytt EOT
         LD   (EOT),HL
         EX   DE,HL
         POP  BC         Tkn att flytta
         LD   A,B        Finns n}got
         OR   C          att flytta ?
         JRZ  FR]8       Nej, hoppa
         LDDR            G|r plats
         JR   FR]8
FR]7     PUSH HL
         PUSH DE
         EX   DE,HL      HL=gammal prad
         LD   C,A        BC=antal bytes
         ADD  HL,BC         att ta bort
         EX   DE,HL
         LD   HL,(EOT)
         PUSH HL
         AND  A
         SBC  HL,DE
         EX   (SP),HL    HL=gammalt EOT
         AND  A
         SBC  HL,BC
         LD   (EOT),HL   Spara nytt EOT
         POP  BC         Tkn att flytta
         EX   DE,HL
         POP  DE
         PUSH DE
         LD   A,B
         OR   C
         JRZ  FR]8
         INC  BC         [ven slutbyte !
         LDIR
FR]8     POP  DE
         POP  HL
FR]9     LD   A,(HL)     L{ngd ny prad
         AND  A          L{ngden noll ?
         JRZ  FR]10      Ja, klart !
         LD   C,A
         LD   B,0
         LDIR            Placera prad
FR]10    LD   A,(FILFLG) Ska tom rad
         AND  A          sparas sist
         LD   A,0        i TED?
         LD   (FILFLG),A
         RETNZ           Ja, retur
         LD   HL,(EOT)
         LD   DE,(TXT)
         LD   BC,(PRAD)
FR]11    DEC  HL
         PUSH HL
         AND  A
         SBC  HL,DE
         POP  HL
         JRC  FR]12
         LD   A,(HL)
         CP   1
         JRNZ FR]12
         PUSH HL
         SBC  HL,BC     Carry EJ satt !
         POP  HL
         JRNZ FR]11
         LD   BC,0
         LD   (BRAD),BC
         JR   FR]11
FR]12    INC  HL
         LD   (HL),0
         LD   (EOT),HL
         LD   A,B
         OR   C
         JRNZ FR]13
         LD   (PRAD),HL
FR]13    AND  A          Clear carry
         RET

ERR      LD   HL,ERR1
         LD   C,ERR2-ERR1
         CALL CUR
         LD   A,3        ERROR 3
         SCF
         RET
ERR1     DEFM "MINNET [R FULLT."
ERR2     EQU  $


; ADR
; Ber{kna adress bildminnet f|r rad
; att skriva ut. Ber{kna antal tecken
; att skriva p} sk{rmraden (B).

ADR      LD   BC,(1:215) B=Sk{rmbredd
         SUB  B         Hela raden ?
         JRNC ADR1      Ja, hoppa
         NEG
         LD   B,A       B=dell{ngd
         XOR  A
ADR1     LD   E,(IX+0)  DE = adress till
         LD   D,(IX+1)       bildminnet
         INC  IX        Uppdatera
         INC  IX        tabellpekare
         RET            OBS! C=254 !!!!

; SKRIVRAD
; Rutin som skriver ut raden i buffert
; p} bildsk{rmen. CTRL-tkn |vers{tts
; till "_X". SKRIV1 anropas av EDITOR.
; Rutinen optimerad f|r att bli s}
; snabb som m|jligt.

SKRIVRAD LD   A,(SRAD)  Sk{rmrad att
         ADD  A         skriva rad p}
         LD   E,A
         LD   D,0
         LD   IX,3:116  Adresstabell
         ADD  IX,DE     f|r bildminnet
SKRIV1   LD   HL,BUFF1  Peka p} rad
         LD   A,(L[NGD) Radl{ngd
SKRIV2   CALL ADR       DE--> bildminnet
         PUSH AF
SKRIV3   LD   A,31
SKRIV4   CP   (HL)      CTRL-tecken ?
         JRNC SKRIV6    Ja, hoppa
; F|ljande instruktion "SMART" d}
; r{knaren B ej {ndras d{rf|r att
; C fr}n b|rjan {r st|rre {n maximala
; antalet tecken att skriva (80).
         LDI            Skriv p} sk{rm
         DJNZ SKRIV4    Fyll hela raden
SKRIV5   POP  AF        Forts{ttning p}
         AND  A         n{sta sk{rmrad ?
         JRNZ SKRIV2    Ja, hoppa
         RET

SKRIV6   LD   A,(HL)    Tag CTRL-tecknet
         CP   6         Slut grafik?
         JRZ  SKRIV8    Ja, skriv ut
         CP   23        Start grafik?
         JRZ  SKRIV8    Ja, skriv ut
         LD   A,"_"     \vers{tt CTRL-X
         LD   (DE),A    till "_X"
         INC  DE
         DJNZ SKRIV7    Sk{rmrad ej full
         POP  AF
         AND  A         Hela raden klar?
         RETZ           Ja, retur
         CALL ADR       N{sta sk{rmrad
         PUSH AF
SKRIV7   LD   A,(HL)    Tag CTRL-tecknet
         ADD  64        G|r stor bokstav
SKRIV8   LD   (DE),A    Skriv p} sk{rm
         INC  DE
         INC  HL
         DJNZ SKRIV3    Fyll hela raden
         JR   SKRIV5
