1 REM Ins{nd av Anders Franz`n <5258>    1988-01-01 13.01.19 (KERMIT)
; KERM2.ASM
; Anders Franz`n <5258>
; Stockholm 1987-09-13


BAUD75   EQU  2:117
BAUD300  EQU  9:213
BAUD1200 EQU  39:82
BAUD2400 EQU  78:165
BAUD4800 EQU  157:74

; Flaggor
; 0  L{mna terminal
; 1  Hoppa till TED
; 2  XOFF mottaget
; 3  XOFF s{nt
; 4  Inbuff full
; 5  Data i TED-buff
; 6  TED full
; 7  Fel p} DUMP/LOG-fil

INIT     LD   HL,BUFF1
         LD   (INBUFF),HL
         LD   A,L       Rensa mottagar-
         LD   (INPOS),A buffert
INIT1    LD   HL,BUFF2
         INP  56        Undvik
         LD   (HL),A    dubbeltryck!
         LD   (UTBUFF),HL
         LD   A,L       Rensa tangent-
         LD   (UTPOS),A buffert
         LD   H,36
         LD   (TIMER),HL
         LD   A,(FLAGG)
         AND  00011100B
         LD   (FLAGG),A
         CALL FIXBAUD
         CALL FIXTED
         RET

TERMINAL LD   (RETUR),SP
         LD   HL,TERMBILD
         CALL VISABILD
         CALL 2:147
         EX   DE,HL
         SET  7,(HL)    T{nd mark|r
         CALL INIT1     T|m tangentbuff
         CALL INTON     Sl} p} interrupt
         CALL XON       Ev s{nd XON
TERM1    CALL TAN       Polla tangenter
         LD   HL,FLAGG
         BIT  0,(HL)
         JPNZ EXIT      Avsluta!
         BIT  2,(HL)
         JRNZ TERM2     XOFF mottaget
         CALL CHECKTAN  Kolla om tangent
         CALLC TKNUT    Behandla tangent
         INP  58
         AND  2         B{rv}g?
         JRNZ TERM2     Nej, hoppa
         CALL TEDSEND   S{nda fr}n TED?
         CALLC TKNUT    Behandla tkn
         LD   A,(DMP)
         AND  A
         CALLNZ DISK    Ev tkn fr}n fil
         CALLC TKNUT    Behandla tkn
TERM2    CALL MOTTAG    L{s inputbuffer
         CALLC TKNIN    Behandla tkn
         INP  58
         AND  2         B{rv}g?
         JRZ  TERM1     Ja, hoppa
         LD   HL,FLAGG
         RES  2,(HL)    Inget XOFF
         JR   TERM1

; L{mna terminalrutinen
EXIT     CALL XOFF      S{nd XOFF
         LD   HL,FLAGG
         BIT  5,(HL)
         CALLNZ TS5     Spar i TED
         CALL 2:147
         EX   DE,HL
         RES  7,(HL)    Sl{ck mark|r
         LD   DE,TERMBILD
         CALL SPARBILD
         CALL INTOFF    Sl} av interrupt
         LD   SP,(RETUR)
         RET

;Sl} p} interrupt
INTON    DI             St{ng interrupt
         LD   A,I
         LD   (IREG),A  Spara register
         LD   HL,VEKTOR Interruptvektor
         LD   A,H       H|g byte till
         LD   I,A       CPU:ns I-reg
         LD   A,L       L}g byte till
         OUT  57        PIO:ns port A
         LD   A,4FH     Programmera PIO
         OUT  57        f|r inputmode
         EXX
         LD   HL,S1
         LD   DE,R1
         EXX
         EI             Sl} p} interrupt
         RET

;Sl} av interrupt
INTOFF   LD   A,(BITAR) H}ller byte p}
         AND  A         att s{ndas?
         JRNZ INTOFF    Ja, v{nta
         DI
         LD   A,255
         OUT  57        PIO i bitmode
         OUT  57        Alla bitar in
         LD   A,(IREG)
         LD   I,A       ]terst{ll I-reg
         LD   A,52      L}g byte till
         OUT  57        PIO:ns port A
         EI             Sl} p} interrupt
         LD   A,200     L}ng tid timer
         LD   (253:247),A tangentbordet
         XOR  A
         LD   (253:245),A Ingen tangent
         RET

;Behandla intkn
TKNIN    CP   10
         JRNZ TKNIN2
         LD   A,(NEWLINE)
         DEC  A
         JRNZ TKNIN1
         LD   A,13
         CALL SKRIV
TKNIN1   LD   A,10
TKNIN2   CALL SKRIV
         RET

;Kolla om tkn mottaget
MOTTAG   LD   DE,(INBUFF)
         LD   HL,FLAGG
         BIT  4,(HL)
         JRZ  MOT2      Buffer ej full
         LD   A,(INPOS)
         SUB  E
         JPP  MOT1
         NEG
MOT1     CP   32
         JRNC MOT2      Buffer ej t|md
         CALL XON
         RES  4,(HL)    Ingen panik!
MOT2     LD   A,(INPOS)
         CP   E         Mottaget tkn?
         RETZ           Nej, retur
         LD   E,A
         INC  A         Detta tkn
         LD   (INPOS),A behandlat
         LD   A,(DE)    Tag mottaget tkn
         SCF
         RET

;Polla tangentbordet
CHECKTAN LD   HL,(UTBUFF)
         LD   A,(UTPOS)
         CP   L         Tangent i buff?
         RETZ           Nej, retur
         LD   L,A
         INC  A
         LD   (UTPOS),A
         LD   A,(HL)
         AND  127
         SCF
         RET

;Polla tangentbordet
TAN      LD   HL,(UTBUFF)
         INP  56        L{s tangentbord
         BIT  7,A       Tangent nere?
         JRZ  TAN4      Nej, hoppa
         LD   B,18      L}ng tid
         CP   (HL)      Repetering?
         JRNZ TAN1      Nej, hoppa
         LD   BC,(TIMER)
         INC  B
         DJNZ TAN4
         LD   B,3
TAN1     LD   (TIMER),BC
         LD   C,A
         XOR  A
         OUT  6
         LD   A,57
         OUT  6         Klick
         LD   A,(ESCAPE)
         OR   128
         CP   C
         JRZ  TAN2      ESCAPE
         LD   A,(TEDFLG)
         AND  A
         JRZ  TAN3      TED ej i minnet
         LD   A,(TEDESC)
         OR   128
         CP   C
         JRNZ TAN3      Ej TED-escape
         SCF
TAN2     LD   (HL),C
         LD   HL,KERMAREA
         SET  3,(HL)
         LD   HL,FLAGG
         SET  0,(HL)
         RETNC
         SET  1,(HL)
         RET

TAN3     LD   A,C
         LD   (HL),A
         INC  L
         LD   (UTBUFF),HL
TAN4     LD   (HL),A    Spara nul{get
         RET

;Behandla uttkn
TKNUT    CP   13
         JRNZ TKNUT1    Ej CR
         LD   C,A
         LD   A,(NEWLINE)
         DEC  A
         LD   A,C
         JRNZ TKNUT1
         CALL TKNUT1    Tolka <RETURN>
         LD   A,10      som CRLF
TKNUT1   LD   C,A
         LD   A,(DUPLEX)
         AND  A         Halv duplex?
         LD   A,C
         CALLZ SKRIV    Ja, till sk{rm
         CALL S[ND      S{nd tangenten
         RET

;Skriver tkn p} sk{rm
SKRIV    AND  127
         LD   (SLASK),A Spara tkn
         CALL 2:147
         EX   DE,HL
         RES  7,(HL)    Sl{ck mark|r
         LD   A,(SLASK)
         CP   32
         JRNC SKR5
         CP   7
         JRZ  SKR1
         CP   8
         JRZ  SKR2
         CP   9
         JRZ  SKR6
         CP   10
         JRZ  SKR7
         CP   12
         JRZ  SKR3
         CP   13
         JRNZ SKR9
         LD   (IX+1),0
         JR   SKR8

SKR1     XOR  A
         OUT  6
         LD   A,131
         OUT  6         Pling!
         JR   SKR9

SKR2     DEC  HL
         DEC  (IX+1)    Minska kolumn
         JPP  SKR9
         LD   A,(2:111) 39 eller 79
         LD   (IX+1),A
         DEC  (IX+0)    F|reg}ende rad
         JPP  SKR8
         JR   SKR7

SKR3     CALL 2:118
         JR   SKR8

SKR5     LD   (HL),A    Skriv p} sk{rm
SKR6     INC  HL
         INC  (IX+1)    \ka kolumn
         LD   A,(2:111) 39 eller 79
         CP   (IX+1)
         JRNC SKR9      Raden ej slut
         LD   (IX+1),0
SKR7     CALL 2:56      Ny rad ev scroll
SKR8     CALL 2:147
         EX   DE,HL
SKR9     SET  7,(HL)    T{nd mark|r
         LD   A,(TEDSAVE)
         DEC  A
         CALLZ TEDSPAR  Spara text i TED
         LD   A,(LOG)
         AND  A
         LD   A,(SLASK)
         RETZ           Ingen loggning
         CP   10
         JRZ  SKR10     Rad ska loggas
         CP   32
         RETC
         LD   HL,(LOGBUFF)
         LD   (HL),A
         INC  L
         LD   (LOGBUFF),HL
         RET

SKR10    LD   HL,(LOGBUFF)
         LD   (HL),13
         INC  L
         LD   (HL),10
         INC  L
         LD   DE,BUFF3
         AND  A
         SBC  HL,DE
         LD   C,L
         LD   B,H
         EX   DE,HL
         LD   IX,FIL
         LD   DE,8:150
         CALL FILCONTR  Skriv rad
         JRC  SKR12
         LD   HL,BUFF3
         LD   (LOGBUFF),HL
         LD   A,(SLASK) ]terst{ll
         RET

SKR12    LD   (FELKOD),A
         LD   HL,FLAGG
         SET  0,(HL)    L{mna terminal
         SET  7,(HL)    Fel p} LOG-fil
         LD   A,(SLASK) ]terst{ll
         RET

;S{nder tkn fr}n fil
DISK     LD   IX,KERMAREA
         CALL GETFIL    H{mta ett tkn
         CCF
         RETC           Retur om OK
         AND  A
         JRNZ DISK1     Annat fel {n EOF
         LD   IX,FIL
         LD   DE,8:144
         CALL FILCONTR  Close
         JRC  DISK1
         XOR  A
         LD   (DMP),A
         RET

DISK1    LD   (FELKOD),A
         LD   HL,FLAGG
         SET  0,(HL)    L{mna terminal
         SET  7,(HL)    Fel p} DUMP-fil
         RET

;S{nd XOFF om XON {r s{nt
XOFF     LD   A,(FLOW)
         DEC  A
         RETNZ          XOFF anv{nds ej
         PUSH HL
         LD   HL,FLAGG
         BIT  3,(HL)    XOFF s{nt?
         LD   A,19
         CALLZ S[ND     Nej, s{nd XOFF
         LD   HL,FLAGG
         SET  3,(HL)
         POP  HL
         RET

;S{nd XON om XOFF {r s{nt
XON      LD   A,(FLOW)
         DEC  A
         RETNZ          XON anv{nds ej
         PUSH HL
         LD   HL,FLAGG
         BIT  3,(HL)    XOFF s{nt?
         LD   A,17
         CALLNZ S[ND    Ja, s{nd XON
         LD   HL,FLAGG
         RES  3,(HL)
         POP  HL
         RET

;S{nd iv{g tecknet A
S[ND     PUSH HL        Spara register
         PUSH DE
         PUSH BC
         LD   C,A       Byte att s{nda
         INP  58
         AND  2         Finns b{rv}g?
         JRZ  S[ND1     Ja, hoppa
         XOR  A
         OUT  6
         LD   A,131     Pling i
         OUT  6         h|gtalaren
         SCF
         JR   S[ND7     S{nd inget!

S[ND1    LD   B,10      Tio bitar
         LD   A,(PARITET)
         AND  A
         JRZ  S[ND5     S{nd byte "r}"
         RES  7,C
         DEC  A
         JRZ  S[ND5     Alltid noll
         DEC  A
         JRZ  S[ND4     Alltid ett
         DEC  A
         LD   A,C
         JRZ  S[ND3     J{mn paritet
         AND  A
         JPPO S[ND5     Hoppa om udda
         JR   S[ND4

S[ND3    AND  A
         JPPE S[ND5     Hoppa om j{mn
S[ND4    SET  7,C
S[ND5    PUSH BC
         CALL TAN       Polla tangenter
         POP  BC
         LD   A,(BITAR) P}g}r s{ndning?
         AND  A
         JRNZ S[ND5     Ja, v{nta
         LD   (BYTE),BC Spara B och C
S[ND7    POP  BC        ]terst{ll
         POP  DE        register
         POP  HL
         RET            Klart !

;S{nd och ta emot data
TERMINT  EX   AF
         EXX
         JP   (HL)      Hoppa

S1       CALL REC
         INP  58
         OR   16+8      RTS + ettbit
         OUT  58
         LD   A,(BITAR)
         AND  A         Startbit (NC)
         JRZ  S1        Inget att s{nda
         LD   B,A
         LD   HL,0
         LD   (S5+7),HL
         LD   A,(BYTE)
         LD   C,A       Byte att s{nda
S3       LD   (S5+16),BC
         LD   C,58
         IN   B,(C)
         SET  3,B       TxD=1
         JRC  S4        Hoppa om ettbit
         RES  3,B       TxD=0
S4       OUT  (C),B     Skicka iv{g bit
S5       CALL REC
         LD   HL,(BAUDSEND)
         LD   BC,0
         ADD  HL,BC
         LD   (S5+7),HL
         JRNC S5
         LD   BC,0
         RR   C
         DJNZ S3
         XOR  A
         LD   (BITAR),A
         JR   S1

REC      EX   DE,HL
         JP   (HL)

R1       CALL END       V{nta 128 us
         INP  58        L{s V24-porten
         RRC  A         Linjen l}g?
         JRNC R1        Ja, b|rja om
R2       CALL END       V{nta 128 us
         INP  58        L{s V24-porten
         RRC  A         Startbit?
         JRC  R2        Nej, inte {nnu
         LD   HL,206:164 19% av bittid
         LD   (R5+7),HL
R3       CALL END
         INP  58        L{s V24-porten
         RRC  A         St|rning?
         JRC  R2        Ja, b|rja om
         LD   HL,(BAUDREC)
         LD   DE,(R5+7)
         ADD  HL,DE     Har halva bit-
         LD   (R5+7),HL tiden g}tt?
         JRNC R3        Nej, v{nta...
         LD   B,9
R4       RR   C         Spara bit i C
         LD   (R5+16),BC
R5       CALL END       V{nta 128 us
         LD   HL,(BAUDREC)
         LD   DE,0
         ADD  HL,DE     Har n{sta bit
         LD   (R5+7),HL kommit in nu?
         JRNC R5        Nej, v{nta
         LD   BC,0
         INP  58        L{s V24-porten
         RRC  A         Biten till carry
         DJNZ R4        Upprepa om fler
         JRNC R1        Ej stoppbit
         CALL END
         LD   A,(R5+16)
         LD   HL,(INBUFF)
         LD   (HL),A    Spara tkn
         INC  L
         LD   (INBUFF),HL
         LD   C,A
         LD   A,(INPOS)
         SUB  L
         LD   HL,FLAGG
         JPP  R6
         NEG
R6       CP   64
         JRC  R7        Buffer ej full
         BIT  4,(HL)
         JRNZ R7        Redan noterat
         LD   A,(BITAR)
         AND  A
         JRNZ R7        Tkn s{nds tyv{rr
         CALL XOFF      S{nd XOFF
         SET  4,(HL)    Notera buff full
R7       LD   A,(PARITET)
         AND  A
         LD   A,C
         JRZ  R8        Paritet NONE
         AND  127       Ev paritet bort
R8       CP   17
         JRZ  R9        XON
         CP   19
         JPNZ R2        Ej XOFF
         SET  2,(HL)    Flagga XOFF
         JP   R2

R9       RES  2,(HL)    Sl{ck flagga
         JP   R2        f|r XOFF

END      LD   HL,(TIMER)
         DEC  HL
         LD   (TIMER),HL
         POP  DE        Adress i "s{nd"
         POP  HL        Adress i "rec"
         EXX            ]terst{ll
         EX   AF        registren
         EI             Sl} p} interrupt
         RETI           Interrupt klart

         ORG  $/2*2+2   J{mn adress!

VEKTOR   DW TERMINT     Interruptvektor
BAUDREC  DW BAUD1200    Mottagningsfart
BAUDSEND DW BAUD75      S{ndningsfart
BYTE     DB 0           Byte att s{nda
BITAR    DB 0           Antal bitar
INBUFF   DW 0           Mottaget data
INPOS    DW 0           Sista position
UTBUFF   DW 0           Tangentdata
UTPOS    DW 0           Sista position
TIMER    DW 0           Repetition
IREG     DB 0           V{rde p} I-reg
FLAGG    DB 0
SLASK    DB 0
FELKOD   DB 0           Felkod LOG/DUMP
LOGBUFF  DW 0
RETUR    DW 0
