home *** CD-ROM | disk | FTP | other *** search
/ Columbia Kermit / kermit.zip / archives / archimedes.tar.gz / archimedes.tar / arrs423.s < prev    next >
Text File  |  1993-05-01  |  7KB  |  328 lines

  1. ;    (c) D.R.McAuley 1987
  2. r0      RN 0
  3. r1      RN 1
  4. r2      RN 2
  5. r3      RN 3
  6. r4      RN 4
  7. r5      RN 5
  8. r6      RN 6
  9. r7      RN 7
  10. r8      RN 8
  11. r9      RN 9
  12. r10     RN 10
  13. r11     RN 11
  14. r12     RN 12
  15. r13     RN 13
  16. r14     RN 14
  17. pc      RN 15
  18.  
  19. ON        * 1
  20. OFF       * 0
  21. OutputToo * OFF        ; ON means buffer output also OFF means ...
  22.  
  23.  
  24. C_bit   * &20000000
  25. V_bit   * &10000000
  26.  
  27.  
  28. ; Useful SWI numbers
  29. OS_IntOn   * 19
  30. OS_IntOff  * 20
  31. OS_Claim   * 31
  32. OS_Release * 32
  33.  
  34. ; Useful Vector numbers
  35. ErrorV     * &01
  36. IrqV       * &02
  37. WrchV      * &03
  38. Rdch       * &04
  39. CliV       * &05
  40. ByteV      * &06
  41. WordV      * &07
  42. FileV      * &08
  43. ArgsV      * &09
  44. BGetV      * &0A
  45. BputV      * &0B
  46. GBPBV      * &0C
  47. OpenV      * &0D
  48. ReadlineV  * &0E
  49. FSCV       * &0F
  50. EventV     * &10
  51. INSV       * &14
  52. REMV       * &15
  53. CNPV       * &16
  54. UKVDU23V   * &17
  55. UKSWIV     * &18
  56. UKPLOTV    * &19
  57. MouveV     * &1A
  58. VDUXV      * &1B
  59. TickerV    * &1C
  60. UpcallV    * &1D
  61.  
  62. ; Buffer numbers
  63.  
  64. Keyboard    * 0
  65. RS423_In    * 1
  66. RS243_Out   * 2
  67.  
  68.  
  69.  
  70.  IMPORT  |_rsinsertinn|
  71.  IMPORT  |_rsremoveinn|
  72.  IMPORT  |_rscountnpinn|
  73.  IMPORT  |_rsinsertout|
  74.  IMPORT  |_rsremoveout|
  75.  IMPORT  |_rscountnpout|
  76.  IMPORT  |_kbinsertinn|
  77.  IMPORT  |_kbremoveinn|
  78.  IMPORT  |_kbcountnpinn|
  79.  
  80.  AREA |C$$code|, CODE, READONLY
  81.  
  82.  
  83. |v$codeseg|
  84.  
  85.  
  86. ; intercept the appropriate system vectors
  87. ; r2 is a dummy work space pointer
  88. rsintercept
  89.         SWI     OS_IntOff       ; Disable Interrupts
  90.  
  91.         MOV     r2, #0 
  92.  
  93.         MOV     r0, #INSV
  94.         ADR     r1, vecinsert
  95.         SWI     OS_Claim        ; Claim vector
  96.  
  97.         MOV     r0, #REMV
  98.         ADR     r1, vecremove
  99.         SWI     OS_Claim        ; Claim vector
  100.  
  101.         MOV     r0, #CNPV
  102.         ADR     r1, veccountnp
  103.         SWI     OS_Claim        ; Claim vector
  104.  
  105.         SWI     OS_IntOn        ; Enable Interrupts
  106.         MOV     pc, r14
  107.  
  108. ; release the claims we have on system interrupts
  109. ; r2 is a dummy work space pointer
  110. rsrelease
  111.         SWI     OS_IntOff       ; Disable Interrupts
  112.  
  113.         MOV     r2,#0
  114.  
  115.         MOV     r0, #INSV
  116.         ADR     r1, vecinsert
  117.         SWI     OS_Release      ; Release vector
  118.  
  119.         MOV     r0, #REMV
  120.         ADR     r1, vecremove
  121.         SWI     OS_Release      ; Release vector
  122.  
  123.         MOV     r0, #CNPV
  124.         ADR     r1, veccountnp
  125.         SWI     OS_Release      ; Release vector
  126.  
  127.         SWI     OS_IntOn        ; Enable Interrupts
  128.         MOV     pc, r14
  129.  
  130.  
  131.  
  132.  
  133. ; intercept the appropriate system vectors
  134. ; r2 is a dummy work space pointer
  135. kbintercept
  136.         SWI     OS_IntOff       ; Disable Interrupts
  137.  
  138.         MOV     r2, #0 
  139.  
  140.         MOV     r0, #INSV
  141.         ADR     r1, kbvecinsert
  142.         SWI     OS_Claim        ; Claim vector
  143.  
  144.         MOV     r0, #REMV
  145.         ADR     r1, kbvecremove
  146.         SWI     OS_Claim        ; Claim vector
  147.  
  148.         MOV     r0, #CNPV
  149.         ADR     r1, kbveccountnp
  150.         SWI     OS_Claim        ; Claim vector
  151.  
  152.         SWI     OS_IntOn        ; Enable Interrupts
  153.         MOV     pc, r14
  154.  
  155. ; release the claims we have on system interrupts
  156. ; r2 is a dummy work space pointer
  157. kbrelease
  158.         SWI     OS_IntOff       ; Disable Interrupts
  159.  
  160.         MOV     r2,#0
  161.  
  162.         MOV     r0, #INSV
  163.         ADR     r1, kbvecinsert
  164.         SWI     OS_Release      ; Release vector
  165.  
  166.         MOV     r0, #REMV
  167.         ADR     r1, kbvecremove
  168.         SWI     OS_Release      ; Release vector
  169.  
  170.         MOV     r0, #CNPV
  171.         ADR     r1, kbveccountnp
  172.         SWI     OS_Release      ; Release vector
  173.  
  174.         SWI     OS_IntOn        ; Enable Interrupts
  175.         MOV     pc, r14
  176.  
  177.  
  178. ; insert a charater into a buffer either a character from the receiver
  179. ; or a character to be transmitted
  180. vecinsert
  181.         CMP     r1, #RS423_In
  182.         [       OutputToo = ON                
  183.         CMPNE   r1, #RS423_Out
  184.         ]
  185.         MOVNE   pc, r14
  186.         STMFD   r13!,{r0-r12}  
  187.         [       OutputToo = ON
  188.         CMP     r1, #RS423_In
  189.         BLEQ    |_rsinsertinn|
  190.         BLNE    |_rsinsertout|
  191.         |
  192.         BL      |_rsinsertinn|
  193.         ]
  194.         CMP     r0, #1
  195.         LDMFD   r13!, {r0-r12,r14}
  196.         BIC     r14, r14, #C_bit
  197.         ORREQ   r14, r14, #C_bit
  198.         MOVS    pc, r14
  199.  
  200.  
  201. ; remove a character from a buffer, either fetch a receoved character
  202. ; or transmit the next character
  203. vecremove
  204.         CMP     r1, #RS423_In
  205.         [       OutputToo = ON
  206.         CMPNE   r1, #RS423_Out
  207.         ]
  208.         MOVNE   pc, r14
  209.         STMFD   r13!,{r1,r3-r12}
  210.         AND     r0, r14, #V_bit
  211.         [       OutputToo = ON
  212.         CMP     r1, #RS423_In
  213.         BLEQ    |_rsremoveinn|
  214.         BLNE    |_rsremoveout|
  215.         |
  216.         BL      |_rsremoveinn|
  217.         ]
  218.         LDMFD   r13!, {r1,r3-r12,r14}
  219.         BIC     r14, r14, #C_bit
  220.         CMP     r0, #256
  221.         ORRGE   r14, r14, #C_bit
  222.         MOV     r2, r0
  223.         MOVS    pc, r14
  224.  
  225. ; either examine the buffers or purge there contents
  226. veccountnp
  227.         BVS     veccountp
  228.         CMP     r1, #RS423_In
  229.         [       OutputToo = ON
  230.         CMPNE   r1, #RS423_Out
  231.         ]
  232.         MOVNE   pc, r14
  233.         [       OutputToo = ON
  234.         CMP     r1, #RS423_In
  235.         ]
  236.         STMFD   r13!,{r3-r12}
  237.         AND     r0, r14, #V_bit
  238.         AND     r1, r14, #C_bit
  239.         [       OutputToo = ON
  240.         BLEQ    |_rscountnpinn|
  241.         BLNE    |_rscountnpout|
  242.         |
  243.         BL      |_rscountnpinn|
  244.         ]
  245.         LDMFD   r13!, {r3-r12,pc}
  246.  
  247. veccountp
  248.         CMP     r1, #RS423_In
  249.         [       OutputToo = ON
  250.         CMPNE   r1, #RS423_Out
  251.         ]
  252.         MOVNE   pc, r14
  253.         [       OutputToo = ON
  254.         CMP     r1, #RS423_In
  255.         ]
  256.         STMFD   r13!,{r1-r12}
  257.         AND     r0, r14, #V_bit
  258.         AND     r1, r14, #C_bit
  259.         [       OutputToo = ON
  260.         BLEQ    |_rscountnpinn|
  261.         BLNE    |_rscountnpout|
  262.         |
  263.         BL      |_rscountnpinn|
  264.         ]
  265.         LDMFD   r13!, {r1-r12,pc}
  266.  
  267.  
  268.  
  269. kbvecinsert
  270.         CMP     r1, #Keyboard
  271.         MOVNE   pc, r14
  272.         STMFD   r13!, {r0-r12}
  273.         BL      |_kbinsertinn|
  274.         CMP     r0, #1
  275.         LDMFD   r13!, {r0-r12,r14}
  276.         BIC     r14, r14, #C_bit
  277.         ORREQ   r14, r14, #C_bit
  278.         MOVS    pc, r14
  279.  
  280. kbvecremove
  281.         CMP     r1, #Keyboard
  282.         MOVNE   pc, r14
  283.         STMFD   r13!,{r1,r3-r12}
  284.         AND     r0, r14, #V_bit
  285.         BL      |_kbremoveinn|
  286.         LDMFD   r13!, {r1,r3-r12,r14}
  287.         BIC     r14, r14, #C_bit
  288.         CMP     r0, #256
  289.         ORRGE   r14, r14, #C_bit
  290.         MOV     r2, r0
  291.         MOVS    pc, r14
  292.  
  293. kbveccountnp
  294.         BVS     kbveccountp
  295.         CMP     r1, #Keyboard
  296.         MOVNE   pc, r14
  297.         STMFD   r13!,{r3-r12}
  298.         AND     r0, r14, #V_bit
  299.         AND     r1, r14, #C_bit
  300.         BL      |_kbcountnpinn|
  301.         LDMFD   r13!, {r3-r12,pc}
  302.  
  303. kbveccountp
  304.         CMP     r1, #Keyboard
  305.         MOVNE   pc, r14
  306.         STMFD   r13!,{r1-r12}
  307.         AND     r0, r14, #V_bit
  308.         AND     r1, r14, #C_bit
  309.         BL      |_kbcountnpinn|
  310.         LDMFD   r13!, {r1-r12,pc}
  311.  
  312.  
  313.  
  314. ; Need at least 64 bytes of Data to stop objasm hanging!!!!
  315.  AREA |C$$data|
  316. |v$dataseg|
  317.  DCD &0
  318.  ALIGN 64
  319.  
  320.  
  321.  EXPORT  |rsintercept|
  322.  EXPORT  |rsrelease|
  323.  
  324.  EXPORT  |kbintercept|
  325.  EXPORT  |kbrelease|
  326.  
  327.  END
  328.