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 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