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


KOPIA    LD   A,(KOPFLG)
         DEC  A
         JRZ  KOP2
         DEC  A
         JRZ  KOP4
         LD   A,1
         LD   (KOPFLG),A
         LD   HL,(RAD)
         LD   (255:250),HL
         LD   HL,KOP1
         LD   C,KOP2-KOP1
         CALL CUR
         JP   TANGENT

KOP1     DEFM "MARKERA SISTA "
         DEFM "RADEN ATT KOPIERA."

; (255:250) = RAD1  ursprungsrad
; (255:252) = RAD2  sista ursprungsraden
; (255:254) = RAD3  destinationsraden

KOP2     LD   A,2
         LD   (KOPFLG),A
         LD   HL,(RAD)
         LD   (255:252),HL
         LD   HL,KOP3
         LD   C,KOP4-KOP3
         CALL CUR
         JP   TANGENT

KOP3     DEFM "MARKERA DESTINATION "
         DEFM "F\R KOPIA."

KOP4     CALL FR]NBUFF
         JPC  TANGENT
         XOR  A            Clear carry
         LD   (KOPFLG),A
         LD   HL,(255:250) RAD1
         LD   DE,(RAD)
         LD   (255:254),DE Spara RAD3
         PUSH DE           Spara rad
         SBC  HL,DE        RAD3 <= RAD1?
         LD   C,A          Kod "bak}t"
         JRNC KOP6         Ja, hoppa
         INC  C            Kod "fram}t"
         LD   HL,(255:252) RAD2
         AND  A
         SBC  HL,DE        RAD3 > RAD2 ?
         JPC  KOP6         Ja, hoppa
         POP  DE
         LD   HL,KOP5
         LD   C,KOP6-KOP5
         CALL CUR
         JP   TANGENT

KOP5     DEFM "OTILL]TEN DESTINATION."

; KOMMANDO:
; C=0 Kopiering av rader BAK]T
; C=1 Kopiering av rader FRAM]T

KOP6     LD   A,(254:7)    CTRL-C ?
         AND  A
         LD   A,255
         JPNZ KOP9         Ja, hoppa
         LD   DE,(255:254) RAD3 destina-
         LD   (RAD),DE     tion
         PUSH BC
         CALL TILLBUFF     H{mta rad
         CALL INSL         Skjut in ny
         POP  BC
         JPC  KOP9         Minnet fullt
         LD   HL,(PRAD)
         PUSH HL
         LD   HL,(SAKNAS)
         PUSH HL
         LD   DE,(255:250) RAD1 orginal
         BIT  0,C
         JRNZ KOP7
         INC  DE           En inskjuten!
KOP7     LD   (RAD),DE
         PUSH BC
         CALL TILLBUFF     H{mta rad
         POP  BC
         POP  HL
         LD   (SAKNAS),HL
         POP  HL
         LD   (PRAD),HL
         LD   HL,(255:254) Destination
         LD   (BRAD),HL    f|r kopian
         PUSH BC
         CALL FR]NBUFF     Spara kopia
         POP  BC
         JRC  KOP9         Minnet fullt
         LD   HL,(255:254) Destination
         INC  HL           |kas pga
         LD   (255:254),HL inskjuten rad
         LD   HL,(255:252) Sista orginal
         LD   DE,(255:250) \ka RAD1 pga
         INC  DE           ny rad
         BIT  0,C          Fram}t ?
         JRNZ KOP8         Ja, hoppa
         INC  DE
         INC  HL           Ny sista
         LD   (255:252),HL orginalrad
KOP8     LD   (255:250),DE N{sta orginal
         XOR  A            A <-- noll
         SBC  HL,DE        Fler rader ?
         JRNC KOP6         Ja, upprepa
KOP9     POP  HL
         LD   (RAD),HL
         RET               Visa sida

KLICK    LD   HL,KLKFLG
KLICK1   LD   A,(HL)
         XOR  255
KLICK2   LD   (HL),A
         JP   TANGENT

INSMODE  LD   HL,INSFLG
         JR   KLICK1

ORDMODE  LD   HL,ORDFLG
         LD   A,(HL)
         INC  A
         CP   3
         JRC  KLICK2
         XOR  A
         JR   KLICK2

BRYTAV   CALL BRYT      Bryt av raden
         JPC  TANGENT   Minnet fullt
         JP   SIDTEST   Fixa |verst

BRYT     CALL FR]NBUFF  Spara rad
         RETC           Minnet fullt
         CALL INSL      Skjut in ny rad
         RETC           Minnet fullt
         LD   HL,160
         LD   DE,(KOL)  Ber{kna antalet
         SBC  HL,DE     tkn from mark|r
         PUSH HL
         LD   C,L       Observera att
         LD   B,H       BC alltid > noll
         LD   HL,BUFF1  HL pekar p} rad
         PUSH HL
         ADD  HL,DE     HL pekar p} tkn
         PUSH HL
         LD   E,L       d{r mark|r {r
         LD   D,H
         LD   (HL),32   Blanka raden
         INC  DE        from d{r mark|r
         LDIR           befinner sig
         LD   A,(ORDFLG)
         CP   2         Rak marginal ?
         CALLZ RAK      Ja, fixa detta
         LD   HL,(RAD)  Nya tomma raden
         LD   (BRAD),HL byts ut mot den
         CALL FR]NBUFF  f|rsta halvan
         LD   DE,(RAD)
         INC  DE        H{mta orginal-
         LD   (RAD),DE
         CALL TILLBUFF  raden
         POP  HL        Plats f|r mark|r
         POP  DE        F|rsta position
         POP  BC        Antal tecken
         LDIR           Flytta fram den
         LD   L,E       bakre halvan
         LD   H,D
         LD   (HL),32   Blanka slutet p}
         INC  DE        raden
         LD   BC,(KOL)
         INC  BC
         LDIR
         CALL FR]NBUFF  Spara rad
         XOR  A
         LD   (KOL),A
         DEC  A
         LD   (SIDFLG),A Visa sida
         AND  A
         RET

; RAK H\GERMARGINAL
; Rutin som skjuter in mellanslag
; mellan l{mpliga ord i en rad s}
; att en rak h|gerkant bildas.

RAK      LD   BC,(L[NGD)
         LD   A,(HMARG)
         AND  A         Saknas marginal?
         JRZ  R1        Ja, kant g{ller
         CP   C         Marg > radl{ngd?
         JRNC R1        Ja, kant g{ller
         CP   5         Marg < 5 ?
         RETC           Ja, ignorera !
         LD   C,A
R1       DEC  C         BC=h|germarginal
         LD   HL,BUFF1  Peka p} rad
         LD   A,32      Blanktecken
R2       CPI            Skippa ev
         RETPO          inledande blanka
         JRZ  R2
         CPIR           Leta n{sta
         RETNZ          Finns ej
         DEC  HL        HL --> blank
         INC  BC
         LD   E,L
         LD   D,H
         ADD  HL,BC
         DEC  HL        Sista kolumnen
         LD   IX,251:0  Slaskvariabler
         LD   (IX+0),B  Nollst{ll (B=0)
R3       INC  (IX+0)    Ber{kna antalet
         CPD            blanka som
         RETPO          saknas i raden
         JRZ  R3
         DEC  (IX+0)
         RETZ           Inga saknas
         CPDR           Leta blank
         RETNZ          Saknas
         INC  HL        HL --> blank
         INC  BC
         LD   (IX+1),C  Spara antal tkn
         LD   A,(RAD)   Kolla om rad {r
         AND  1         udda eller j{mn
         JRZ  R4        Hoppa om j{mn
         EX   DE,HL     B|rja bakifr}n
R4       LD   L,E       F|rsta position
         LD   H,D       att testa
         LD   C,(IX+1)  Antal tecken
         LD   B,0       att testa
R5       CALL INSERT    Skjut in ett
         LD   (HL),32   blanktecken
         DEC  (IX+0)    Ett mindre kvar
         RETZ           Klart
         INC  (IX+1)    Ett tkn till
         LD   A,(RAD)   J{mn eller udda
         AND  1         rad ?
         LD   A,(HL)    Tag blanktkn
         JRNZ R7        Hoppa om udda
         INC  C         Ett tkn till
R6       CPI            Testa tkn
         JPPO R4        Rad slut
         JRZ  R6        Skippa blanka
         CPIR           Leta n{sta
         JRNZ R4        Finns ej fler
         JR   R5        Upprepa

R7       INC  DE        Ny sistaposition
R8       CPD            Testa tkn
         JPPO R4        Rad slut
         JRZ  R8        Skippa blanka
         CPDR           Leta n{sta
         JRNZ R4        Finns ej fler
         INC  HL        Peka p} blanktkn
         INC  BC        som hittats
         JR   R5        Upprepa

BRYTIHOP CALL FR]NBUFF  Spara rad
         JPC  TANGENT
         LD   HL,BUFF1
         LD   DE,BUFF2
         LD   BC,160
         LDIR           Kopiera raden
         LD   DE,(RAD)
         DEC  DE
         LD   A,D       Befinner vi oss
         OR   E         p} rad ett ?
         JPZ  TANGENT   Ja, ignorera
         CALL TILLBUFF  H{mta f|reg}ende
         LD   HL,BUFF1+159 Sista tecknet
         LD   BC,160
         LD   A,32
         CPD            Leta radslut
         JPNZ TANGENT   Raden {r full
BRYTI1   LD   A,32
         CPD            Annat {n space?
         JRNZ BRYTI2    Ja, hoppa
         LD   A,B       Hela raden
         OR   C         genomletad ?
         JRNZ BRYTI1    Nej, upprepa
         DEC  HL
BRYTI2   LD   BC,(KOL)  Antal tecken
         INC  BC        att flytta
         INC  HL
         INC  HL        Sista position
         EX   DE,HL
         LD   HL,BUFF2
         LD   A,(HL)    F|rsta tecknet
         CP   32        ett space ?
         JRZ  BRYTI3    Ja, hoppa
         INC  DE        L{mna en blank
BRYTI3   PUSH HL
         LD   HL,BUFF1+160
         AND  A
         SBC  HL,DE     F}r tecknen att
         SBC  HL,BC     flytta plats p}
         POP  HL        raden ovan ?
         JPC  TANGENT   Nej, ignorera !
         PUSH BC
         LDIR           Fyll ut raden
         CALL FR]NBUFF  Spara raden
         LD   DE,(RAD)
         CALL TILLBUFF  H{mta orginalrad
         POP  BC        Gammal kolumn +1
         PUSH BC
         LD   HL,BUFF1
         LD   E,L
         LD   D,H
         ADD  HL,BC     F|rsta tkn som
         LD   A,160     {r kvar p} rad
         SUB  C         Antal tkn kvar
         LD   C,A       Finns tkn kvar ?
         JRZ  BRYTI4    Nej, hoppa
         LDIR           Flytta v{nster
BRYTI4   POP  BC        Gammal kolumn
         LD   L,E
         LD   H,D
         INC  DE
         LD   (HL),32   Fyll ut radslut
         LDIR           med blanka
         CALL FR]NBUFF
         XOR  A         Placera mark|r
         LD   (KOL),A   i position ett
         DEC  A
         LD   (SIDFLG),A Visa sida
         ; forts{tt ner i SIDTEST

SIDTEST  LD   HL,(RAD)
         LD   A,(SCRFLG)
         AND  A
         JRNZ SIDT1
         DEC  HL
         LD   DE,(SIDSTORL) Rader/sida
         CALL DIVISION
         INC  HL
         LD   DE,(SIDNR) Aktuell sida
         XOR  A         [r det samma
         SBC  HL,DE     sida {nnu ?
         JRZ  SIDT3     Ja, hoppa
         RET            Nej, retur
SIDT1    LD   DE,(\VERST)
         XOR  A
         PUSH HL
         SBC  HL,DE     RAD < \VERST ?
         POP  HL
         JRC  SIDT2     Ja, hoppa
         LD   BC,(SIDSTORL)
         SBC  HL,BC
         JRC  SIDT3
         PUSH HL
         AND  A         \VERST > RAD
         SBC  HL,DE     - SIDSTORL + 1 ?
         POP  HL
         JRC  SIDT3     Ja, hoppa
         INC  HL
SIDT2    LD   (\VERST),HL
         RET
SIDT3    LD   A,(T\MFLG) Skall sk{rm
         AND  A          t|mmas ?
         JRNZ SIDT4      Ja, hoppa
         LD   A,(SIDFLG) Ska sida visas?
         AND  A
         JRNZ SIDT4      Ja, hoppa
         LD   A,(BYTFLG) P}g}r utbyte ?
         AND  A
         JPZ  TANGENT    Nej, hoppa
SIDT4    XOR  A
         RET             Visa sida

RJUST    LD   BC,(KOL)  Ny kolumn
         INC  C
         LD   A,(L[NGD) Radl{ngd
RJUST1   CP   C         Kol inom raden ?
         RETNC          Ja, retur
         ADD  40        \ka radl{ngd
         LD   (L[NGD),A Spara
         LD   (T\MFLG),A Sida ska visas
         PUSH HL
         LD   HL,(RAD)  Fixa \verst
         LD   (\VERST),HL annars fel i
         POP  HL        scroll-mode !!
         JR   RJUST1


SLUT     EQU  $
