1 REM Ins{nd av Stig Johansson <664>    1987-10-23 07.36.41 (SEND)
    ; TEDI.ASM
    ; ASM-kod med kommentarer till rutiner inf|rda i TED.
    ; Det {r huvudsakligen dessa rutiner som skiljer TEDI
    ; fr}n TED.
    ; Stig Johansson  < 664 >.   871022
    ;....................................................

    ; Detta {r rutinen "CTRL-GV" med vilken man kan flytta hela
    ; texten }t h|ger eller v{nster till |nskad v{nster-marginal.

VMARG:    LD   HL,VTXT        Utskrift texten "V-marg."
          LD   BC,9
          CALL CUR
          LD   HL,VBF1
          LD   BC,3
          PUSH HL
          CALL 5              Fr}n tangentbordet till VBF1
          POP  HL             |nskad v{nster-marginal.
          LD   A,(HL)
          CP   13             Om RETURN
          JP   Z,TANGENT      tillbaks.
          LD   HL,VBF1        Omvandla talet i VBF1 till bin{rt.
          LD   A,(6174)       Men kolla f|rst datorns check-summa,
          CP   126            [r det ch-sa 11273 ?
          PUCH AF
          CALL Z,6174         Ja !
          POP  AF
          CALL NZ,6172        Nej det {r ch-sa  9913 eller 10042.
          EX   DE,HL          Bin{ra talet till HL
          LD   (VBF2),HL      och lagra det i VBF2.

    ; Nedanst}ende rutin kollar antalet rader i texten som skall f|rses
    ; med space-byte. De rader som b|rjar l{ngst ut till v{nster,saknar
    ; spacebyte. Genom att dessa rader f|rses med space-byte och d{rmed
    ; blir en byte l{ngre m}ste hela texten i minnet f|rst flyttas fram
    ; (bakifr}n),s} m}nga byte, sedan flyttas texten tillbaks och sam-
    ; tidigt f|rses med dessa byte.

          LD   HL,(VBF4)      Text-radens start-adress.
VLOOP:    LD   DE,0
          LD   A,(HL)         H{mta radens l{ngd-byte.
          CP   0              Om l{ngdbyten {r noll {r texten slut, hoppa
          JR   Z,VEND1        d} till text-flyttn och byte-komplementering.
          LD   E,A            Annars spara l{ngden i E.
          INC  HL
          CP   1              Om tom rad hoppa.
          JR   Z,VV1
          LD   A,(HL)         H{mta radens andra byte,
          CP   128            om den {r >128, har raden redan space-byte.
          JR   NC,VREF        hoppa d} till test referens-punkt.
          PUSH HL             Spara rad-adressen.
          LD   HL,(VANT)
          INC  HL             I VANT lagras hur m}nga rader
          LD   (VANT),HL      som saknar space-byte.

    ; Texten kanske redan har V-marg. och raderna b|rjar p} olika kolumner.
    ; Referenspunkt {r d} den kolumn,som den rad b|rjar p},som ligger l{ngst
    ; ut till v{nster. Fr}n denna ref-punkt skall sedan hela texten flyttas.

          LD   A,128          F|r de rader som saknade space-byte blir
          LD   (VREFBF),A     nu space-byten 128 =l{ngst t.v.
          POP  HL
VV1:      ADD  HL,DE          Ber{kna n{sta rad-adress.
          DEC  HL
          JR   VLOOP
VREF:     PUSH HL
          LD   HL,VREFBF      I VREFBF lagras l{gsta space-byten, den
          CP   (HL)           som skall vara ref-punkt.
          JR   NC,VRET
          LD   (HL),A
VRET:     POP  HL
          JR   VV1
VTXT:     DEFM "V-marg. :"
VEND1:    PUSH HL
          LD   HL,VANT        Om (VANT) =noll, har alla rader redan
          LD   A,(HL)         space-byte, texten i minnet beh|ver ej
          INC  HL             framflyttas
          LD   C,(HL)
          OR   C
          POP  HL
          JR   Z,VNOT         = hoppa till VNOT.

    ; Koll om minnesutrymme finns f|r f|rl{ngning med en byte av de rader
    ; som saknade space-byte.  Annars till NOMEM f|r utskrift text och
    ; hoppa ur rutinen.

          PUSH HL
          LD   HL,(VANT)      HL =ant.rader utan space-byte.
          EX   DE,HL          DE =          -"-
          LD   HL,(EOT)       HL = adr.textslut.
          ADD  HL,DE
          INC  HL             Blivande text-slut.
          EX   DE,HL
          LD   HL,(MAX)       Adress f|r fullt minne.
          SBC  HL,DE          Om subtraktionen blir negativ finns
          POP  HL             det ej utrymme.
          JP   M,NOMEM        Hoppa d} ur.

    ; Nu skall texten framflyttas - med b|rjan p} sista raden

          LD   DE,(VBF4)      Textens start-adress.
          PUSH HL             Spara textens slut-adress.
          SBC  HL,DE          Ber{kna textens storlek.
          LD   B,H
          LD   C,L            BC =textstorlek =ant.byte att flytta.
          INC  BC
          LD   DE,(VANT)      DE = antalet byte texten skall framflyttas.
          POP  HL
          PUSH HL
          ADD  HL,DE          HL = ny text-slut-adress.
          EX   DE,HL          DE =     -"-
          POP  HL             HL = ursprungliga slut-adress.
          LDDR                Flytta texten !!.
VNOT:     LD   DE,(VANT)
          LD   HL,(VBF4)
          ADD  HL,DE          HL = textens start-adress efter framflyttningen.

     ; Utr{kna antalet steg +/- fr}n ref-punkten.

          LD   A,(VREFBF)
          LD   E,A            E= ref-byten.
          LD   A,(VBF2)       A= |nskad  v{nster-marginal
          SET  7,A            A= A+128
          CP   E              J{mf|r.
          JR   C,VR1          Om texten skall flyttas }t v{nster, A < E ,hoppa.
          SUB  E              annars A-E = antalet kolumner }t h|ger.
          JR   VR2
VR1:      LD   B,A            Kasta om
          LD   A,E            A och
          LD   E,B            E.
          SUB  E              A = ant.kolumner }t v{nster.
          PUSH HL
          LD   HL,VBF3        Markera med " 2 "  i VBF3
          LD   (HL),2         att texten skall flyttas }t v{nster.
          POP  HL
VR2:      LD   (VREFBF),A     Till VREFBF ant. kolumner att flytta texten.

    ; F|ljande rutin kompletterar rader med space-byte, om space-byte
    ; saknas samt {ndrar space-bytens v{rde till r{tt antal space.

VLOP2:    LD   A,(HL)
          CP   0              Om radl{ngsbyten {r noll {r texten slut.
          JR   Z,VEND2
          LD   E,A            E= radens l{ngd.
          LD   D,0
          CP   1              Om tom rad
          JR   Z,VHARTAB      hoppa.
          INC  HL
          LD   A,(HL)         Testa om radens andra byte {r
          CP   128            en space-byte
          JR   C,VX2          Hoppa om space-byte ej finns.
          PUSH HL
          LD   HL,VREFBF
          LD   C,(HL)         C = ny V-marginal.
          LD   B,A            Spara A i B.
          LD   A,(VBF3)
          CP   2              Om VBF3 inneh}ller "2" skall texten
          LD   A,B            flyttas }t v{nster,
          JR   Z,VX1          = hoppa till VX1
          ADD  A,C            annars addera
          JR   VX             och hoppa.
VX1:      SUB  C              Texten }t v{nster =subtrahera ist{llet f|r add.
VX:       POP  HL
          LD   (HL),A         L{gg in den nya space-byten.
VX2:      CP   128
          DEC  HL             Backa till plats f|r l{ngd-byten.
          JR   NC,VHARTAB     Hoppa om space-byte finns.
          LD   A,(VREFBF)
          SET  7,A
          LD   (HL),A         L{gg in space-byten p} platsen f|r l{ngdbyten.
          DEC  HL             Backa ett steg till.
          INC  E              INC gamla l{ngdbyten
          LD   (HL),E         och l{gg in den som f|rsta byte i raden.
VHARTAB:  LD   C,E
          LD   B,0            BC= radl{ngd,= antal byte att flytta.
          LD   DE,(VBF4)      DE= till adress.
          LDIR                Flytta tillbaks raden.
          LD   (VBF4),DE      Spara flytta-till-adressen.
          JR   VLOP2

NMTXT:    DEFM "MINNET R[CKER EJ !"
NOMEM:    LD   HL,NMTXT
          LD   C,18
          CALL CUR            Utskrift text "MINNET R[CKER EJ"
          JR   VEND3          Till }terst{lln. buffrar och uthopp.

VEND2:    LD   HL,(VANT)      ]terst{llning av buffrar.
          EX   DE,HL
          LD   HL,(EOT)
          ADD  HL,DE          Ber{kna textens nya slutadress
          LD   (EOT),HL       och lagra den i EOT.
          LD   HL,SLUT
          LD   (VBF4),HL      Textens f|rsta adress.
 VEND3:   LD   HL,0
          LD   (VANT),HL      Noll-st{ll
          LD   (VBF3),HL      buffrar.
          LD   A,255
          LD   (VREFBF),A
          JP   TILLBUFF       K L A R T .

    ; Denna rutin kunde f|renklas om man ist{llet {ndrade i TED-s
    ; rutin FR]NBUFF s} att spacebyte lades in som andra byte p} alla
    ; rader, {ven p} de som {r skrivna med b|rjan l{ngst till v{nster.
 .................................................................


    ; K{llkoden med kommentarer till rutinen DELETE STYCKE.

    ; I nedanst}ende kommentarer anv{nder jag begreppet STYCKE f|r
    ; den text som skall raderas, och begreppet TEXT f|r |vrig text.

DELBLK:   LD   A,(DBFLG)    Har f|rsta CTRL-E tryckts ?
          DEC  A
          JR   Z,DB1        Ja -  hoppa till raderning.
          LD   A,1          Nej detta {r f|rsta CTRL-E
          LD   (DBFLG),A    = markera flaggan med 1.
          LD   HL,(RAD)     Lagra radnummert p} vilken mark|ren
          LD   (DB2BUF),HL  befinner sig i  DB2BUF.
          LD   HL,(PRAD)    Lagra denna radens adress
          LD   (DB1BUF),HL  i DB1BUF
          LD   HL,(\VERST)  Lagara |versta radens nummer
          LD   (DB3BUF),HL  i DB3BUF.
          LD   HL,KOP1      Skriv p} nedersta raden :
          LD   C,19         "MARKERA SISTA RADEN"
          CALL CUR          Utskrift.
          JP   TANGENT      Hoppa till n{sta TANGENT-tryckn.

                            **  R A D E R A  **
DB1:      LD   HL,(PRAD)    H{mta styckets sista rad-adress.
          LD   A,(HL)       H{mta den radens l{ngd.
          LD   E,A          F|r {ven sista raden i det markerade
          LD   D,0          stycket skall bort.
          ADD  HL,DE        Eft.ADD:HL=styckets sista rads slut-adr.
          PUSH HL           Spara denna adress.
          LD   DE,(DB1BUF)  H{mta styckets f|rsta rads start-adress.
          DEC  HL
          SBC  HL,DE        HL blir =antal byte som skall bort.
          POP  HL           Om talet {r negativt, har felaktig
          JP   M,DB4        radmarkering skett, hoppa d} ur rutinen.
          PUSH DE           Annars spara styckets start-adr.
          PUSH HL           Spara styckets sista adress.
          EX   DE,HL        DE=        -"-
          LD   HL,(EOT)     HL= hela textens slutadress.
          SBC  HL,DE        Texten efter stycket som skall bort,
          INC  HL           skall flyttas till styckets f|rsta adress,
          LD   B,H          och d{rmed radera stycket.
          LD   C,L          BC= l{ngden p} texten som skall flyttas.
          POP  HL           HL= F|rsta adr.till texten efter stycket.
          POP  DE           DE= Dit texten eft.stycket ska flyttas.
          LDIR              Flytta texten eft.stycket= radera stycket.
          EX   DE,HL        HL- 1 = textens nya slutadress.
          DEC  HL           Texten i minnet har blivit mindre =
          LD   (EOT),HL     l{gg in nya slutadressen.
          LD   (BRAD),BC    Rad noll i buffert.
DB3:      LD   HL,(DB2BUF)  ]terst{ll
          LD   (RAD),HL     rad-nummert.
          LD   HL,(DB3BUF)  ]terst{ll sidans |versta
          LD   (\VERST),HL  radnummer.
          XOR  A
          LD   (DBFLG),A    Nollst{ll DELETE-flaggan.
          JP   EDITOR       KLART !!.
DB4:      LD   HL,KOP5      Utskrift "OTILL]TEN MARKERING"
          LD   BC,22
          CALL CUR
          JP   DB3          Till }terst{lln.buffrar och uthopp.

    ; N{r man trycker CTRL-E hamnar man i ovanst}ende rutin "DELBLK."
    ; DELLINE har jag tagit bort.  I TANGENT-rutinen under TAN9
    ; har jag inf|rt att n{r flaggan (DBFLG) har en 1-a
    ; skrivs <E> ut p} |versta raden.
.....................................................................


   ; MENY-val f|r andra CTRL-tecknet.
   ; N{r man trycker CTRL-G kommer man till denna rutin.

ZC:       DEFM "CTRL ( K,G,Y,Q,V,W )"
ZCTRL:    LD   HL,ZC
          LD   C,20
          LD   DE,(65011)
          PUSH DE
          CALL CUR          Utskrift "CTRL ( K,G,Y,Q,V.W )"
          POP  DE
          LD   (65011),DE
          CALL GET          H{mta in andra CTRL-tecknet fr.tangentbordet.
          CP   11
          JP   Z,KLICK      K = till KLICK
          CP   7
          JP   Z,ORDMODE    G = till ORDMODE
          CP   25
          JP   Z,HM[RKE     Y = H-m{rk med #.
          CP   17
          JR   Z,CTRL       Q = Controlltecken till texten.
          CP   22
          JP   Z,VMARG      V = [ndra v{nster-marginalen.
          CP   23
          JR   Z,WMARG      W = S{tt v{nstermarginal vid 1-ta TAB-markeringen.
          JP   TAN14
        ;...............................................

    ; S{tt v{nster-marginal med CTRL-GW

WMARG:    LD   HL,WMGFLG
          LD   A,(HL)       Skall V{nster-marginal s{ttas ?
          AND  A            {r A =noll
          JR   NZ,WM1       nej A {r ej noll,V-marg. skall kopplas ur =hoppa.
          INC  A            jo A =noll, INC A till 1
          JR   WM2          och hoppa till lagring av A i WMGFLG.
WM1:      XOR  A            Koppla ur , allts} nollst{ll A
WM2:      LD   (HL),A       lagra A i WMGFLG.
          JP   TANGENT
    .....................................................

    ; Fr}n TED-s rutin BRYT kopplas  nedanst}ende  rutin  in  f|r
    ; varje   ord-brytning  om  ordmode  och  v{nstermarginal  {r
    , inkopplade.
    ; I rutinen  RETURN  h{mtas f|rsta TAB-markeringen in med
    ; rutinen WM3, om v{nstermarginalen {r satt.
    ; I bufferten KOL lagras d} denna TAB-markering  .N{r man
    ; sedan trycker RETURN hamnar mark|ren p}  den  TAB-markerade
    ; kolumnen ist{llet f|r l{ngs bort i v{nsterkanten.

WM4:      CALL WM3          Leta fram f|rsta TAB-markeringen.
          EX   DE,HL
          LD   HL,BUFF1+159
          PUSH HL
          SBC  HL,DE        Ber{kna radens slutadress i BUFF1.
          PUSH HL
          LD   DE,BUFF1     Ber{kns radens l{ngd.
          SBC  HL,DE
          LD   B,H
          LD   C,L          BC= radens l{ngd.
          INC  BC
          POP  HL
          POP  DE
          LDDR              Flytta fram raden i BUFF1, bakifr}n.
          LD   A,(WTAB)
          LD   B,A
          LD   A,32
          EX   DE,HL
WMLOP:    LD   (HL),A       L{gg in space framf|r raden.
          DEC  HL
          DJNZ WMLOP
          RET
WM3:      LD   HL,TABRAD1
          LD   BC,158       Max-position f|r TAB
          PUSH HL
          LD   A,127
          CPIR              Leta fram f|rsta TAB-markeringen p}
          POP  DE           TABRADEN.
          LD   A,C          Om C =noll
          AND  A            ingen TAB-markering
          JR   Z,WM3B       = hoppa.
          SBC  HL,DE
          DEC  HL
          LD   (WTAB),HL    Spara vilken kolumn som har makeringen.
          RET
WM3B:     LD   HL,0         Nollst{ll HL f|r KOLumn i rutin RETURN,
          LD   (WTAB),HL    ingen space framf|r texten.(rutin WM4).
          RET
 .................................................................

    F|rutom att jag inf|rt dessa rutiner har jag {ven  gjort  div.
    {ndringar i TEDI j{mf|rt med TED.
    Rutinen som skriver ut hj{lp-raderna har jag gjort om  s}  att
    den   blir   lite   smidigare.   Som   synes  har  jag  {ndrat
    markeringarna  av  inkopplade   rutiner   p}   raden   ovanf|r
    TAB-linjalen.  Detta f|r att f} plats med fler markeringar och
    {nd} passa f|r 40-teckens sk{rm.  Jag har inf|rt att  man  med
    h|gerpilen  kan  h{mta  ut tidigare anv{nt filnamn inte enbart
    f|r SKRIVFIL utan {ven f|r L[SFIL. Likas} om man vill  anv{nda
    tidigare s|k-ord. Samtidigt  som  man  h{mtar  filnamn  eller
    s|kord med h|gerpilen,kan man redigera resp. ord el. filnamn.
    Med  en  rutin  fr}n Kjell Svensson <5318> har jag snabbat upp
    tangentbordsrepetitionen vilket g|r TEDI smidigare att  arbeta
    med.
 ======================================================================
