home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / SIMTEL / CPMUG / CPMUG041.ARK / TEACH.ASM < prev    next >
Assembly Source File  |  1984-04-29  |  9KB  |  516 lines

  1. ;TEACH MORSE CODE
  2. ;
  3. ;
  4. ; REVISION HISTORY
  5. ;
  6. ;    10/02/76 INITIAL VERSION ADAPTED FROM 6800
  7. ;    10/07/76 DOUBLE WEIGHT IF AVERABE > 90 PCT. ADDED.
  8. ;    10/07/76 LETTER PROBABILITY NEVER ZERO ADDED.
  9. ;    12/06/76 REVISED RANDOM AND REMOVED PUNCTUATION
  10. ;         TO SAVE SPACE IN 512 BYTE ROM.
  11. ;    03/23/77 CORRECT TYPO IN DOUBLE WEIGHT PROBABILITY.
  12. ;    06/03/77 ADDED SWITCHES FOR CPM, MORORW, IMSAI, AND HAL
  13. ;    09/08/78 ADDED SWITCH FOR SHERWOOD ASSEMBLY
  14. ;
  15. ; ASSEMBLY CONSTANTS
  16. ;
  17. FREQ    EQU    2000    ;MACHINE CYCLES PER MSEC
  18. WPM    EQU    15    ;CHARACTER TRANSMISSION SPEED
  19. IDLE    EQU    3*50    ;IDLE RESPONSE WAIT
  20. MAXNUM    EQU    26+10    ;MAXIMUM NUMBER OF CHARACTERS
  21. PPIM    EQU    0FH    ;8255 MODE SELECT
  22. ;
  23. FALSE    EQU    0
  24. TRUE    EQU    NOT FALSE
  25. ;
  26. IMSAI    EQU    FALSE    ;USES PORT 255
  27. HAL    EQU    FALSE    ;ORRIGINAL VERSION
  28. CPM    EQU    TRUE    ;USE BDOS I/0
  29. MOROWS    EQU    FALSE    ;USE EI/DI INSTEAD OF I/O PORT
  30. SHERWOOD EQU    TRUE    ;USE SONALERT FOR TONE ON PORT 203
  31. ;
  32. LINE    EQU    62    ;TERMINAL LINE LENGTH
  33. ;
  34. ; MONITOR SUBROUTINE ENTRIES
  35. ;
  36.     IF    HAL
  37. CO    EQU    8009H    ;COMMAND OUTPUT
  38. CI    EQU    8003H    ;COMMAND INPUT
  39. CSTS    EQU    8012H    ;COMMAND INPUT STATUS
  40. ;
  41.     ORG    40H    ;RAM
  42.     ENDIF
  43. ;
  44.     IF    CPM
  45.     ORG    100H
  46.     ENDIF
  47. ;
  48.     IF    NOT HAL
  49.     JMP    BEGIN
  50.     ENDIF
  51. ;
  52. ;
  53. ;  GLOBAL DATA
  54. ;
  55. SEED    DW    1234H    ;RANDOM NUMBER (MUST BE NON-ZERO)
  56. NUM    DW    ERROR+4    ;SIZE OF CURRENT ALPHABET
  57. GIVE    DB    IDLE    ;RESPONSE WAIT TIME IS SEC/50
  58. TOLD    DB    0    ;255 IF STUDENT WAS TOLD LETTER, 0 OTHERWISE
  59. COLUMN    DB    LINE    ;PRINT POSITION REMAINING ON LINE
  60. ;
  61. ;  OBJECT TIME STACK
  62. ;
  63.     DS    30
  64. STACK    DS    0
  65. ;
  66. ;  ERROR RATE FUNCTION
  67. ;
  68. ;
  69.     IF    HAL
  70.     ORG    100H    ;MUST ORG AT A MULTIPLE OF 100H
  71.     ENDIF
  72. ;
  73.     IF    NOT HAL    ;ORG TO NEXT MULTIPLE OF 100H
  74.     ORG    ($ OR 255) + 1
  75.     ENDIF
  76. ;
  77. ERROR    DB    255    ;TOTAL ERROR RATE
  78.     DS    MAXNUM
  79. ;
  80. ;  ENTRY POINT (FWA ROM)
  81. ;
  82. ;
  83.     IF    HAL
  84.     ORG    200H
  85.     ENDIF
  86. ;
  87. BEGIN    JMP    TEACH
  88. ;
  89. ;  CHARACTER CODE TABLES
  90. ;
  91. MORSE    EQU    $-1
  92.     DB    11011000B,11000100B,11001000B,11010000B
  93.     DB    11111100B,11110100B,11100100B,11110000B
  94.     DB    01111100B,01111000B,01101000B,01110000B
  95.     DB    01001000B,01010000B,01100000B,11100000B
  96.     DB    10000100B,10001000B,10011000B,10010000B
  97.     DB    10111000B,10101000B,10110000B,10100000B
  98.     DB    00111100B,00011100B,00101000B,00110000B
  99.     DB    00001100B,00000100B,00011000B,00001000B
  100.     DB    00010000B,00100000B,11000000B,01000000B
  101. ;
  102. ASCII    DB    25H    ;OVERALL PERCENTAGE
  103.     DB    'Q7ZG'
  104.     DB    '098O'
  105.     DB    '1JPW'
  106.     DB    'LRAM'
  107.     DB    '6BXD'
  108.     DB    'YCKN'
  109.     DB    '23FU'
  110.     DB    '45VH'
  111.     DB    'SITE'
  112. ;
  113. ; MAIN PROGRAM TEACH
  114. ;
  115. ;    ENTRY VIA JUMP.  STACK POINTER IS REINITIALIZED.
  116. ;    INTERUPTS ARE NOT USED.
  117. ;
  118. TEACH:    LXI    SP,STACK
  119.     CALL    PRESET
  120. TEA1:    CALL    GRAPH
  121. TEA2:    CALL    SELECT
  122.     MVI    A,0
  123.     STA    TOLD    ;CLEAR STUDENT TOLD FLAG
  124. TEA3:    CALL    SEND
  125.     PUSH    D
  126.     CALL    CSTS    ;LOOK FOR ENTRY WHILE SENDING
  127.     ANA    A
  128.     JZ    TEA4
  129.     CALL    CI    ;DISCARD CHARACTER
  130. TEA4:    MVI    B,0    ;CLEAR RESPONSE TIME COUNTER
  131.     MVI    C,0    ;CLEAR CORRECT RESPONSE FLAG
  132. TEA5:    PUSH    B
  133.     CALL    RANDOM    ;MIX UP NUMBERS
  134.     CALL    CSTS
  135.     ANA    A
  136.     JZ    TEA6    ;IF NO RESPONSE YET
  137.     CALL    CI    ;GET CHARACTER
  138.     POP    B
  139.     POP    D
  140.     CPI    0DH    ;CARRIAGE RETURN
  141.     JZ    TEA1    ;GIVE STUDENT A GRAPH
  142.     LXI    H,ASCII-ERROR
  143.     DAD    D
  144.     CMP    M
  145.     PUSH    D
  146.     JNZ    TEA5    ;IF WRONG GUESS
  147.     MOV    C,A    ;SET CORRECT RESPONSE FLAG
  148.     JMP    TEA7
  149. TEA6:    MVI    C,20
  150.     CALL    WAIT    ;KILL SOME TIME
  151.     POP    B
  152.     MOV    A,B
  153.     INR    A    ;GAD***** IS THIS SILLY
  154.     MOV    B,A    ;WHY NOT INR B *********
  155.     LDA    GIVE
  156.     CMP    B
  157.     JNZ    TEA5    ;IF SOME TIME LEFT
  158.     LXI    H,TOLD
  159.     MVI    M,255    ;RECORD TIMEOUT
  160. TEA7:    MOV    A,B    ;COMPUTE NEW SPEED
  161.     POP    D
  162.     STC
  163.     CMC
  164.     RAL        ;RESPONSE TIME * 2
  165.     JNC    TEA8
  166.     MVI    A,255    ;SET TO MAXIMUN ON OVERFLOW
  167. TEA8:    LXI    H,GIVE
  168.     MOV    B,M
  169.     CALL    WEIGHT    ;ADJUST SPEED
  170.     MOV    M,A
  171.     LXI    H,ASCII-ERROR
  172.     DAD    D
  173.     PUSH    B    ;SAVE ANSWER
  174.     MOV    C,M
  175.     CALL    PRINT    ;OUTPUT CORRECT ANSWER
  176.     MVI    C,' '
  177.     CALL    PRINT    ;DOUBLE SPACE
  178.     MVI    C,250
  179.     CALL    WAIT
  180.     POP    B
  181.     MOV    A,C
  182.     ANA    A
  183.     JZ    TEA3    ;IF INCORRECT TYR IT OVER
  184.     CALL    GRADE
  185.     JMP    TEA2
  186. ;
  187. ; SUBROUTINE PRESET
  188. ;
  189. ;    INITIALIZE I/O AND GLOBAL VARIABLES
  190. ;
  191. PRESET:    LXI    H,ERROR+MAXNUM
  192. PRE1:    MVI    M,255    ;SET ERRORS TO MAXIMUM
  193.     DCR    L
  194.     JNZ    PRE1
  195.     MVI    M,256*30/100    ;GUESS AVERAGE OF 70 PERCENT
  196.     LXI    H,ERROR+4
  197.     SHLD    NUM    ;MINIMUM ALPHABET
  198.     MVI    A,IDLE
  199.     STA    GIVE    ;AVERAGE SPEED
  200.     LXI    H,1234H
  201.     SHLD    SEED    ;NON-ZERO RANDOM SEED
  202. ;
  203.     IF    HAL
  204.     MVI    A,0A6H
  205.     OUT    PPIM    ;PROGRAM MODE 1 OUTPUT
  206.     ENDIF
  207. ;
  208.     IF    SHERWOOD
  209.     XRA    A    ;INIT FRONT PANNEL PIA
  210.     OUT    200
  211.     OUT    202
  212.     CMA
  213.     OUT    201
  214.     OUT    203
  215.     MVI    A,4
  216.     OUT    200
  217.     OUT    202
  218.     MVI    A,10H
  219.     OUT    203    ;INITIALLY TURN OFF TONE
  220.     ENDIF
  221. ;
  222.     RET
  223. ;
  224. ;
  225. ; SUBROUTINE RANDOM
  226. ;
  227. ;    TAUSWORTH GENERATOR USING PRIMITAVE TRINOMIAL
  228. ;      X**15 + X + 1 WITH PERIOD 2**15-1.
  229. ;    RETURNS 0 < (D,E) < 2**15.
  230. ;
  231. RANDOM:    LXI    H,SEED
  232.     MOV    A,M
  233.     STC
  234.     CMC
  235.     RAL        ;HE SHOULD HAVE USED ORA A !!!!!!
  236.     MOV    D,A
  237.     INX    H
  238.     MOV    A,M
  239.     RAR
  240.     XRA    M
  241.     MOV    M,A
  242.     MOV    A,D
  243.     DCX    H
  244.     XRA    M
  245.     JNC    RAN1
  246.     XRI    60H
  247. RAN1:    MOV    M,A
  248.     MOV    E,A
  249.     RET
  250. ;
  251. ;
  252. ; SUBROUTINE SELECT
  253. ;
  254. ;    ON EXIT (D,E) CONTAINS A POINTER TO THE SELECTED
  255. ;    CHARACTER IN THE ERROR TABLE.  PRESERVES NO REGISTERS.
  256. ;
  257. SELECT:    CALL    RANDOM
  258.     MOV    A,D
  259.     CMA        ;MAKE RANDOM NUMBER NEGATIVE
  260.     MOV    D,A
  261. SEL1:    LHLD    NUM    ;BEGIN SCAN
  262. SEL2:    MOV    C,M    ;GET ERROR RATE
  263.     MVI    B,0
  264.     INX    B    ;INSURE PROPABILITY IS NEVER ZERO
  265.     XCHG
  266.     DAD    B    ;ADD ERROR TO RANDOM NUMBER
  267.     RC        ;STOP LOOP ON CARRY OUT
  268.     XCHG
  269.     DCR    L
  270.     JNZ    SEL2    ;SCAN REMAINDER OF TABLE
  271.     JMP    SEL1    ;START SCAN OVER
  272. ;
  273. ;
  274. ; SUBROUTINE SEND
  275. ;
  276. ;    THE CHARACTER REFERENCED BY (D,E) IS SENT AS MORSE CODE.
  277. ;    ON EXIT D,E ARE PRESERVED.
  278. ;
  279. SEND:    LXI    H,MORSE-ERROR
  280.     DAD    D
  281.     MOV    B,M    ;GET MORSE LETTER
  282. SEN1:    MOV    A,B
  283.     STC        ;HE SHOULD HAVE USED ORA A !!!!!!***
  284.     CMC
  285.     RAL        ;GET NEXT ELEMENT IN CARRY
  286.     MOV    B,A
  287.     MVI    C,1200/WPM    ;ONE DIT TIME IN MSEC
  288.     JNC    SEN2
  289.     MVI    C,3*1200/WPM    ;ONE DAH TIME
  290. SEN2:    ANA    A
  291.     RZ        ;IF LAST BIT WAS STOP BIT
  292.     CALL    BEEP
  293.     MVI    C,1200/WPM    ;INTER ELEMENT SPACE
  294.     CALL    WAIT
  295.     JMP    SEN1    ;LOOP FOR REMAINING BITS
  296. ;
  297. ;
  298. ; SUBROUTINE WAIT
  299. ;
  300. ;    DELAY C MSEC.  ON EXIT A AND C ARE ZERO.
  301. ;    ALL OTHER REGS ARE PRESERVED.
  302. ;
  303. WAIT:    MVI    A,FREQ/16
  304. WAI1:    DCR    A
  305.     JNZ    WAI1    ;LOOP FOR A MSEC
  306.     DCR    C
  307.     JNZ    WAIT    ;IF MORE MSEC TO GO
  308.     RET
  309. ;
  310. ;
  311. ; SUBROUTINE BEEP
  312. ;
  313. ;    DELAY C MSEC WHILE GENERATING A 1000HZ SIDETONE.
  314. ;    OUTPUT IS ON 8255 PORT PC4.
  315. ;    ENTRY/EXIT SAME AS WAIT (SEE ABOVE).
  316. ;
  317. BEEP:
  318.     IF    SHERWOOD
  319.     MVI    A,20H
  320.     OUT    203    ;TONE ON
  321.     ENDIF
  322. BEE9:    MVI    A,FREQ/16/2
  323. BEE1:    DCR    A
  324.     JNZ    BEE1    ;LOOP FOR 1/2 MSEC
  325. ;
  326.     IF    HAL
  327.     MVI    A,1001B    ;SET PC4
  328.     OUT    PPIM    ;LO TO HIGH ON OUTPUT
  329.     ENDIF
  330. ;
  331.     IF    MOROWS
  332.     EI
  333.     ENDIF
  334. ;
  335.     IF    IMSAI
  336.     MVI    A,1000$0000B
  337.     OUT    0FFH
  338.     ENDIF
  339. ;
  340. BEE2:    MVI    A,FREQ/16/2
  341. BEE3:    DCR    A
  342.     JNZ    BEE3    ;LOOP FOR SECOND 1/2 MSEC
  343. ;
  344.     IF    HAL
  345.     MVI    A,1000B    ;CLEAR PC4
  346.     OUT    PPIM    ;HIGH TO LO ON OUTPUT
  347.     ENDIF
  348. ;
  349.     IF    MOROWS
  350.     DI
  351.     ENDIF
  352. ;
  353.     IF    IMSAI
  354.     MVI    A,0000$0000B
  355.     OUT    0FFH
  356.     ENDIF
  357. ;
  358.     DCR    C
  359.     JNZ    BEE9    ;IF MORE MSECS TO GO
  360. ;
  361.     IF    SHERWOOD
  362.     MVI    A,255
  363.     OUT    203
  364.     ENDIF
  365. ;
  366.     RET
  367. ;
  368. ;
  369. ; SUBROUTINE WEIGHT
  370. ;
  371. ;    COMPUTES A WEIGHTED MOVING AVERAGE
  372. ;    AS FOLLOWS, A = .875 * B + .125 * A
  373. ;    ALL OTHER REGS ARE PRESERVED.
  374. ;
  375. WEIGHT:    ADD    B
  376.     RAR        ;(A+B)/2
  377.     ADD    B
  378.     RAR        ;((A+B)/2+B)/2
  379.     ADD    B
  380.     RAR        ;(((A+B)/2+B)/2+B)/2
  381.     RET
  382. ;
  383. ;
  384. ; SUBROUTINES RETURN, PRINT
  385. ;
  386. ;    OUTPUT CR/LF OR CHARACTER IN C.
  387. ;    ON EXIT D,E AND A ARE PRESERVED.
  388. ;
  389. RETURN:    LXI    H,COLUMN
  390.     MVI    M,LINE+2
  391.     MVI    C,0DH    ;CR
  392.     CALL    PRINT
  393.     MVI    C,0AH    ;LF   FALL THROUGH TO PRINT
  394. PRINT:    PUSH    D
  395.     PUSH    PSW
  396.     CALL    CO
  397.     POP    PSW
  398.     POP    D
  399.     LXI    H,COLUMN
  400.     DCR    M
  401.     JZ    RETURN    ;LOCAL CR/LF
  402.     RET
  403. ;
  404. ;
  405. ; SUBROUTINE GRADE
  406. ;
  407. ;    INDIVIDUAL AND TOTAL ERROR RATES ARE
  408. ;    COMPUTED.  THE SIZE OF THE ALPHABET IS
  409. ;    INCREASED IF PERFORMANCE IS ADAQUATE.
  410. ;    ON ENTRY D,C POINTS TO CHARACTER ERROR TABLE
  411. ;    ENTRY, (TOLD) IS 0 FOR CORRECT OR 255 FOR INCORRECT.
  412. ;
  413. GRADE:    LDA    TOLD
  414.     XCHG
  415.     MOV    B,M
  416.     CALL    WEIGHT    ;ADJUST INDIVIDUAL RATE
  417.     MOV    M,A
  418.     XCHG
  419.     LXI    H,ERROR
  420.     LDA    TOLD
  421.     MOV    B,M
  422.     CALL    WEIGHT    ;ADJUST AVERAGE RATE
  423.     MOV    M,A
  424.     CPI    256*30/100
  425.     JNC    GRA3    ;IF BAD AVERAGE
  426.     CPI    256*10/100
  427.     JNC    GRAD    ;IF GOOD, BUT NOT GREAT
  428.     XCHG
  429.     MOV    B,M
  430.     LDA    TOLD
  431.     CALL    WEIGHT    ;COUNT SCORE TWICE IF HOT
  432.     MOV    M,A
  433. GRAD:    LHLD    NUM
  434.     MVI    A,256*40/100
  435. GRA1:    CMP    M
  436.     JC    GRA3    ;IF BAD INDIVIDUAL RATE
  437.     DCR    L
  438.     JNZ    GRA1
  439. GRA2:    LXI    H,NUM    ;CHECK FOR COMPLETE ALPHABET
  440.     MVI    A,MAXNUM
  441.     CMP    M
  442.     JZ    GRA3
  443.     INR    M    ;ADD LETTER
  444. GRA3:    RET        ;GAD* THIS IS SILL, WHY JUMP TO A RETURN
  445. ;
  446. ;
  447. ; SUBROUTINE GRAPH
  448. ;
  449. ;    THE PREDICTOR FUNCTION IS DISPLAYED.
  450. ;    ALL THE REGISTERS ARE DESTROYED.
  451. ;
  452. GRAPH:    LHLD    NUM
  453.     XCHG
  454. GPH1:    CALL    RETURN
  455.     LXI    H,ASCII-ERROR
  456.     DAD    D
  457.     MOV    C,M    ;GET ASCII FOR CURRENT CHARACTER
  458.     CALL    PRINT
  459.     MVI    C,' '
  460.     MOV    H,D
  461.     MOV    L,E
  462.     MOV    A,M    ;B IS ERROR RATE
  463. GPH2:    CALL    PRINT    ;PRINT BAR GRAPH
  464.     MVI    C,'*'
  465.     SUI    255/LINE+1
  466.     JNC    GPH2    ;IF A IS STILL POSITIVE
  467.     MVI    C,250    ;SLOW DOWN FOR FAST DISPLAYS
  468.     CALL    WAIT
  469.     DCR    E
  470.     JP    GPH1    ;LOOP FOR ALL BARS
  471.     CALL    CI
  472.     CPI    1BH    ;ESC CHAR-WANT NEW RUN AT IT?
  473.     JZ    TEACH    ;YUP-START OVER
  474.     CPI    1    ;JUMP TO MONITOR
  475.     JZ    0FC00H    ;YUP GOTO ODT
  476.     JMP    RETURN
  477. ;
  478. ;
  479. ; ADDED I/O DRIVERS
  480. ;
  481.     IF    CPM
  482. CO:    PUSH    H!    PUSH    D!    PUSH    B
  483.     PUSH    PSW
  484.     MOV    E,C
  485.     MVI    C,2
  486.     CALL    BDOS
  487.     POP    PSW
  488.     POP    B!    POP    D!    POP    H
  489.     RET
  490. ;
  491. BDOS    EQU    5H
  492. ;
  493. CI:    PUSH    H!    PUSH    D!    PUSH    B
  494.     CALL    CICPM
  495.     POP    B!    POP    D!    POP    H
  496.     RET
  497. ;
  498. CICPM:    LHLD    1
  499.     LXI    D,6
  500.     DAD    D
  501.     PCHL
  502. ;
  503. CSTS:    PUSH    H!    PUSH    D!    PUSH    B
  504.     CALL    CSTSCP
  505.     ANI    1
  506.     POP    B!    POP    D!    POP    H
  507.     RET
  508. ;
  509. CSTSCP:    LHLD    1
  510.     INX    H!    INX    H!    INX    H
  511.     PCHL
  512.     ENDIF
  513. ;
  514.     END  TEACH
  515.