        NAM     TEACH 
  
* TEACH MORSE CODE
* COPYRIGHT (C) 1976, HOWARD CUNNINGHAM 
  
* REVISION HISTORY
* 
*       06/10/76 INITIAL VERSION
*       04/11/77 RECONFIGURED FOR MITS 680B 
*       04/11/77 DOUBLE WEIGHT IF AVERAGE > 90 PCT. ADDED 
*       04/11/77 LETTER PROBABILITY NEVER ZERO ADDED
  
        ORG     0 
        JMP     TEACH 
  
* ASSEMBLY CONSTANTS
  
ACIA    EQU     $F000   ACIA ADDRESS
ON      EQU     $41     TONE ON 
OFF     EQU     $01     TONE OFF
LINE    EQU     70      TERMINAL LINE LENGTH
FREQ    EQU     500     MACHINE CYCLES PER MSEC 
WPM     EQU     15      CHARACTER TRANSMISSION SPEED
IDLE    EQU     3*50    IDLE RESPONSE WAIT
  
* GLOBAL DATA 
  
NUM     FDB     4       NUMBER OF CHARACTERS IN ALPHABET
GIVE    FCB     IDLE    RESPONSE WAIT TIME IN SEC/50
COLUMN  FCB     0       COLUMNS REMAINING BEFORE END OF LINE
TONE    FCB     OFF     SIDETONE STATE
SEED    FDB     $C0DE 
        PAGE
* CHARACTER TABLES (DIRECTLY ADDRESSED) 
  
MORSE   EQU     .-1 
        FCB     ^11011,^100011,^10011,^1011 
        FCB     ^111111,^101111,^100111,^1111 
        FCB     ^111110,^11110,^10110,^1110 
        FCB     ^10010,^1010,^110,^111
        FCB     ^100001,^10001,^11001,^1001 
        FCB     ^11101,^10101,^1101,^101
        FCB     ^111100,^111000,^10100,^1100
        FCB     ^110000,^100000,^11000,^10000 
        FCB     ^1000,^100,^11,^10
MAXNUM  EQU     .-1-MORSE 
  
ASCII   FCB     $25     OVERALL PERCENTAGE
        FCC     'Q7ZG'
        FCC     '098O'
        FCC     '1JPW'
        FCC     'LRAM'
        FCC     '6BXD'
        FCC     'YCKN'
        FCC     '23FU'
        FCC     '45VH'
        FCC     'SITE'
  
ERROR   FCB     256*30/100  ASSUME NOMINAL AVERAGE
        RMB     MAXNUM
        PAGE
        ORG     $100
  
* SUBROUTINE PRESET 
* 
*       INITIALIZE I/O AND GLOBAL VARIABLES.
  
PRESET  LDX     &MAXNUM 
        LDA A   &255
PRE1    STA A   ERROR,X WORST CASE ERROR PROBABILITIES
        DEX 
        BNE     PRE1
        LDA A   &256*30/100 ASSUME NOMINAL AVERAGE
        STA A   ERROR 
        LDX     &4
        STX     NUM     MINIMUM SIZE
        LDA A   &IDLE 
        STA A   GIVE    AVERAGE SPEED 
        RTS 
  
  
* SUBROUTINE RANDOM 
* 
*       TAUSWORTH GENERATOR USING PRIMITIVE TRINOMIAL 
*       X**15 + X**4 + 1  WITH PERIOD 2**15 - 1.
*       RETURNS 0 < (B,A) < 2**15.
*       REF COMM. ACM 11,9 (SEPT 68) 641-644
  
RANDOM  LDA A   SEED+1  W=SEED
        LDA B   SEED
        ASR B           X=SHIFT(W,-4) 
        ROR A 
        ASR B 
        ROR A 
        ASR B 
        ROR A 
        ASR B 
        ROR A 
        EOR A   SEED+1  Y=XOR(W,X)
        EOR B   SEED
        STA A   SEED+1
        STA B   SEED
        TAB             Z=SHIFT(Y,15-4) 
        ASL B 
        ASL B 
        ASL B 
        AND B   &$7F
        EOR B   SEED    SEED=XOR(Y,Z) 
        STA B   SEED
        RTS 
  
  
* MAIN PROGRAM TEACH
* 
*       ENTRY VIA POWER-UP RESET OR OTHERWISE; STACK POINTER
*       IS REINITIALIZED.  INTERRUPTS ARE NOT USED. 
  
TEACH   LDS     &STACK  ENTRY POINT 
        BSR     PRESET
TEA0    JSR     GRAPH 
TEA1    BSR     SELECT  SELECT AND
        CLR A           CLEAR ERROR FLAG
        PSH A 
TEA6    BSR     SEND    SEND CHARACTER
        TST     ACIA+1  CLEAR INPUT, IF ANY 
TEA2    LDA A   &1
        BIT A   ACIA
        BEQ     TEA3    IF NO RESPONSE YET
        LDA A   ACIA+1
        CMP A   &$D 
        BEQ     TEA0    IF SPECIAL COMMAND
        CMP A   ASCII,X 
        BNE     TEA2    IF WRONG GUESS
        BRA     TEA4
TEA3    LDA A   &20 
        BSR     WAIT
        INC B           ADVANCE TIME
        CMP B   GIVE
        BNE     TEA2    IF SOME TIME LEFT 
        PUL A           SET ERROR FLAG
        LDA A   &255
        PSH A 
TEA4    PSH A 
        LDA A   GIVE
        ASL B           COMPUTE NEW SPEED 
        BCC     TEA5
        LDA B   &255    SET TO MAX ON OVERFLOW
TEA5    BSR     WEIGHT  ADJUST SPEED
        STA A   GIVE
        LDA B   ASCII,X ANSWER
        BSR     PRINT 
        LDA B   &$20    SPACE 
        BSR     PRINT   DOUBLE SPACE
        LDA A   &250
        BSR     WAIT
        PUL A 
        CMP A   ASCII,X 
        BNE     TEA6    TRY LETTER OVER IF INCORRECT
        PUL A           GET ERROR FLAG
        BSR     GRADE   EVALUATE PERFORMANCE
        BRA     TEA1
  
  
* SUBROUTINE SELECT 
* 
*       ON EXIT X CONTAINS A CHARACTER POINTER SELECTED 
*       WITH PROBABILITIES PROPORTIONAL TO THEIR RESPECTIVE 
*       ERROR RATES.  REQUIRES AVERAGE ERROR
*       RATE > 5 FOR REASONABLE PROCESSING TIME.
  
SELECT  BSR     RANDOM
SEL1    LDX     NUM 
SEL2    SEC 
        SBC A   ERROR,X DECREMENT BY ERROR PROBABILITY
        SBC B   &0
        BMI     SEL3    IF RANDOM NUMBER HAS COUNTED PAST ZERO
        DEX 
        BNE     SEL2
        BRA     SEL1
SEL3    RTS 
  
  
* SUBROUTINE SEND 
* 
*       THE CHARACTER REFERENCED BY X IS TRANSMITTED
*       AS MORSE CODE. ON EXIT X IS PRESERVED, B IS ZERO. 
  
SEND    LDA B   MORSE,X GET MORSE BIT PATTERN 
        LSR B 
SEN1    LDA A   &ON 
        STA A   TONE
        LDA A   &1200/WPM DIT TIME IN MSEC
        BCC     SEN2
        LDA A   &3*1200/WPM DAH TIME
SEN2    BSR     WAIT
        LDA A   &OFF
        STA A   TONE
        BSR     PAUSE   INTER-ELEMENT SPACE 
        LSR B 
        BNE     SEN1    LOOP UNTIL ONLY STOP BIT REMAINS
        RTS 
  
  
* SUBROUTINES PAUSE, WAIT 
* 
*       DELAY ONE DIT TIME (PAUSE) OR MSEC (WAIT).
*       ON EXIT A IS ZERO, B AND X ARE PRESERVED. 
  
PAUSE   LDA A   &1200/WPM 
WAIT    PSH B 
WAI1    LDA B   TONE
        STA B   ACIA
        LDA B   &FREQ/12 DELAY 1/2 MSEC 
WAI2    DEC B 
        BNE     WAI2
        LDA B   &OFF
        STA B   ACIA
        LDA B   &FREQ/12
WAI3    DEC B 
        BNE     WAI3
        DEC A 
        BNE     WAI1
        PUL B 
        RTS 
  
  
* SUBROUTINE WEIGHT 
* 
*       COMPUTES A WEIGHTED MOVING AVERAGE AS FOLLOWS,
*               A = .875 * A + .125 * B 
*       ON EXIT B IS DESTROYED. 
  
WEIGHT  PSH A 
        ABA 
        ROR A           (A+B)/2 
        PUL B 
        ABA 
        ROR A           ((A+B)/2+A)/2 
        ABA 
        ROR A           (((A+B)/2+A)/2+A)/2 
        RTS 
  
  
* SUBROUTINES RETURN, PRINT 
* 
*       OUTPUT CR/LF OR CHARACTER FROM B.  GENERATE LOCAL CR/LF 
*       WHEN REQUIRED.  ON EXIT A AND X ARE PRESERVED.
  
RETURN  LDA B   &LINE+2 RESET COLUMN COUNTER
        STA B   COLUMN
        LDA B   &$D 
        BSR     PRINT   OUTPUT CR 
        LDA B   &$A 
PRINT   PSH B 
        LDA B   &2
PRI1    BIT B   ACIA
        BEQ     PRI1    IF PREVIOUS CHARACTER INCOMPLETE
        PUL B 
        STA B   ACIA+1  SEND CHARACTER
        DEC     COLUMN
        BEQ     RETURN
        RTS 
  
  
* SUBROUTINE GRADE
* 
*       INDIVIDUAL AND TOTAL ERROR RATES ARE COMPUTED.
*       THE SIZE OF THE ALPHABET IS INCREASED IF
*       PERFORMANCE IS ADEQUATE.
*       ON ENTRY X IS CHARACTER POINTER, A IS 0 FOR CORRECT 
*       RESPONSE, 255 FOR INCORRECT OR NO RESPONSE. 
*       ON EXIT A, B AND X ARE DESTROYED. 
  
GRADE   PSH A 
        TAB 
        LDA A   ERROR,X 
        BSR     WEIGHT  ADJUST INDIVIDUAL RATE
        STA A   ERROR,X 
        LDA A   ERROR 
        PUL B 
        PSH B 
        BSR     WEIGHT  ADJUST AVERAGE RATE 
        STA A   ERROR 
        PUL B 
        CMP A   &256*30/100 
        BHI     GRA3    IF BAD AVERAGE
        CMP A   &256*10/100 
        BHI     GRA0    IF GOOD, BUT NOT GREAT
        LDA A   ERROR,X 
        BSR     WEIGHT  COUNT SCORE TWICE IF HOT
        STA A   ERROR,X 
GRA0    LDX     NUM 
        LDA A   &256*40/100 
GRA1    CMP A   ERROR,X CHECK INDIVIDUAL ERROR RATES
        BLS     GRA3    IF ANY ONE BELOW STANDARDS
        DEX 
        BNE     GRA1
GRA2    LDA A   &MAXNUM ADD NEW LETTER IF POSSIBLE
        CMP A   NUM+1 
        BEQ     GRA3
        INC     NUM+1 
GRA3    RTS 
  
  
* SUBROUTINE GRAPH
* 
*       THE PREDICTOR FUNCTION IS DISPLAYED.
*       ON EXIT A, B AND X ARE DESTROYED. 
  
GRAPH   LDX     NUM 
        INX 
GPH1    BSR     RETURN
        LDA B   ASCII-1,X CURRENT CHARACTER 
        BSR     PRINT 
        LDA B   &$20    SPACE 
        LDA A   ERROR-1,X 
GPH2    BSR     PRINT   PRINT BAR GRAPH 
        LDA B   &'*'
        SUB A   &255/LINE+1 
        BCC     GPH2    IF A STILL POSITIVE 
        DEX 
        BNE     GPH1    IF MORE BARS TO GO
GPH3    LDA A   ACIA
        ASR A 
        BCC     GPH3    PAUSE 
        BRA     RETURN
  
  
* STACK AREA
  
        RMB     15
STACK   EQU     .-1 
  
  
        END 
        MON 
