home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 15 / 15.iso / s / s225 / 1.ddi / OP31AG26.ASM < prev    next >
Encoding:
Assembly Source File  |  1986-08-28  |  64.8 KB  |  1,759 lines

  1. ;"8051"
  2. ;;
  3. ;;   COPYRIGHT 1984, 1985, 1986 JAMES H. HERZOG, JOHN T. EBNER
  4. ;;
  5. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  6. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  7. ;;
  8. ;;       X-TENDER        OPERATING  SYSTEM  VERSION 1.0 
  9. ;;
  10. ;;                              JIM HERZOG
  11. ;;                              JOHN EBNER
  12. ;;  JULY 16, 1986 
  13. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  14. ;;
  15. ;;
  16. ;;  TASK REGISTER BANK (RB0) ASSIGNMENTS
  17. ;;
  18. RB0      EQU       00H       ; PSW FOR REG BANK 0 FOR QUEUED TASKS
  19. RB1      EQU       08H       ; PSW FOR REG BANK 1 FOR IMMED TASKS 
  20. RB2      EQU       10H       ; PSW FOR REG BANK 2 FOR TIMER OPERATIONS
  21. RB3      EQU       18H       ; PSW FOR REG BANK 3 FOR OPSYS 
  22. ;;
  23. ;;  INTERNAL DATA MEMORY ASSIGNMENTS
  24. ;;
  25. ;;   TASK REGISTER BANK (RB0) ASSIGNMENTS 
  26. ;;
  27. ;                  00H       ; TASK REG 0, REG 0 OF RB0, GEN PTR
  28. ;                  01H       ; TASK REG 1, REG 1 OF RB0, GEN PTR
  29. ;                  02H       ; TASK REG 2, BEG OF TASK QUEUE PTR
  30. ;                  03H       ; TASK REG 3, ARG #1 
  31. ;                  04H       ; TASK REG 4, ARG #2 
  32. ;                  05H       ; TASK REG 5, ARG #3 
  33. ;                  06H       ; TASK REG 6, ARG #4 
  34. ;                  07H       ; TASK REG 7, ARG #5 
  35. ;;
  36. ;;   IMMED TASK REGISTER BANK (RB1) ASSIGNMENTS 
  37. ;;
  38. ;;
  39. ;                  08H       ; TASK REG 0, REG 0 OF RB1, GEN PTR
  40. ;                  09H       ; TASK REG 1, REG 1 OF RB1, GEN PTR
  41. ;                  0AH       ; TASK REG 2, BEG OF TASK QUEUE PTR
  42. ;                  0BH       ; TASK REG 3, ARG #1 
  43. ;                  0CH       ; TASK REG 4, ARG #2 
  44. ;                  0DH       ; TASK REG 5, ARG #3 
  45. ;                  0EH       ; TASK REG 6, ARG #4 
  46. ;                  0FH       ; TASK REG 7, ARG #5 
  47. ;;
  48. ;;   TIMER REGISTER BANK (RB2) ASSIGNMENTS
  49. ;;
  50. HBTOC    EQU       12H       ; R2 :HI BYTE TIME OUT COUNTER 
  51. MBTOC    EQU       13H       ; R3 :MID BYTE TIME OUT COUNTER
  52. LBTOC    EQU       14H       ; R4 :LO BYTE TIME OUT COUNTER 
  53. HBTIM    EQU       15H       ; R5 :HI BYTE TIME CONST 
  54. MBTIM    EQU       16H       ; R6 :MID BYTE TIME CONST
  55. LBTIM    EQU       17H       ; R7 :LO BYTE TIME CONST 
  56. ;;
  57. ;;   OPERATING SYSTEM REGISTER BANK (RB3) ASSIGNMENTS 
  58. ;;
  59. ;                  18H       ; OP SYS REG 0, GEN PTR
  60. ;                  19H       ; OP SYS REG 1, GEN PTR
  61. ;                  1AH       ; OP SYS REG 2, BEG OF TASK QUE PTR
  62. ;                  1BH       ; OP SYS REG 3, END OF TASK QUE PTR
  63. ;                  1CH       ; OP SYS REG 4, PTR FOR HOST COM PKT 
  64. ;                  1DH       ; OP SYS REG 5, STORE R0 DURING INT
  65. ;                  1EH       ; OP SYS REG 6, GEN PURPOSE
  66. ;                  1FH       ; OP SYS REG 7, GEN PURPOSE
  67. ;;
  68. ;;   DATA MEMORY ALLOCATION 
  69. ;;
  70. ;;    BIT ADDRESSABLE LOCATIONS 
  71. ;;
  72. SWD      EQU       20H       ; EVENT REGISTER 
  73. ;          BIT 7=1  ACKNOWLEDGEMENT REQUIRED
  74. ;          BIT 6=1  IMMEDIATE TASK RUNNING
  75. ;          BIT 5=1  QUEUED TASK RUNNING 
  76. ;          BIT 4=1  LOCAL ASYNC PORT SENSITIZED 
  77. ;          BIT 3=1  UNREPORTED ERROR  ;PAR PORT SENS
  78. ;          BIT 2=1  PACKET IN PROGRESS
  79. ;          BIT 1=1  PAUSE BIT 
  80. ;          BIT 0=1  QUEUE OVERFLOW  ;;; KB SENS 
  81. SENSR    EQU       21H       ; SENSITIZE REG SER/PAR PORT 
  82. ;          BIT 7=1  SERIAL OUTPUT PORT SENSITIZED 
  83. ;          BIT 6=1  SERIAL INPUT PORT SENSITIZED
  84. ;          BIT 5=1  PARALLEL PRINTER PORT SENSITIZED
  85. ;          BIT 4=1  SOFTSWITCH INPUT SENSITIZED 
  86. ;          BIT 3=1  TIME-OUT ACTIVE 
  87. ;          BIT 2=1  INTERNAL TRANSMITTER READY FLAG 
  88. ;          BIT 1    <SPARE>
  89. ;          BIT 0    <SPARE>
  90. EVENT    EQU       22H       ; EVENT SENSING
  91. ;;
  92. ;;    LOCATIONS 23-2F NOT ASSIGNED
  93. ;;
  94. ;;    INTERNAL ADDRESS SPACE
  95. ;;
  96. HCP      EQU       30H       ; (30-3F)  STORAGE FOR HOST COMMAND PACKET 
  97. SOS      EQU       40H       ; (40-4F)  START OF STACK-SYSTEM STACK 
  98. ICP      EQU       09H       ; (09-0F)  STORAGE FOR IMMEDIATE COM PACKET
  99. BOQ      EQU       50H       ; (50-7F)  BEGINING OF THE TASK QUEUE
  100. STAT     EQU       51H       ; STATUS REGIS OF TASK ON QUEUE
  101. EOQ      EQU       7FH       ; END OF TASK QUEUE
  102. ;;
  103. ;;   EXTERNAL ADDRESS SPACE 
  104. ;;
  105. UDR      EQU       00H       ; USART DATA REGISTER
  106. UCR      EQU       01H       ; USART CONTROL REGISTER 
  107. UDRL     EQU       40H       ; LOCAL USART DATA REGISTER
  108. UCRL     EQU       41H       ; LOCAL USART CONTROL REGISTER 
  109. TAS      EQU       21H       ; DIAG/ADDRESS DIPSWITCH, (READ) 
  110. ;                              BIT 7 6
  111. ;                                  0 0   NO DIAGNOSTICS 
  112. ;                                  0 1   SEND TAS TO HOST 
  113. ;                                         (SWTH)
  114. ;                                  1 0   HOST TO P1,P2,LED
  115. ;                                         (HTPT)
  116. ;                                  1 1   ECHO TO HOST 
  117. ;                                         (ECHO)
  118. LED      EQU       21H       ; LED/BUZZER LATCH, (WRITE)
  119. ;                              BIT 0 =0 LED ON
  120. ;                              BIT 1 =0 BUZZER ON 
  121. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  122.          ORG       00H
  123. ;            VECTOR LOCATION FOLLOWING A RESET
  124. BEGIN:   AJMP       START     ; JUMP TO THE START OF THE PROGRAM
  125. ;            VECTOR LOCATION FOLLOWING EXTERNAL INTERRUPT #0
  126.          ORG       03H
  127. INTR0:   RETI                ; ONLY USING SERIAL PORT INTERRUPT 
  128.          ORG       0BH
  129. TYMER0:  NOP                 ; TIME-OUT ROUTINE (ACTIVIATED BY SENSR.3) 
  130.                              ; PAUSE/RESUME (ACTIVATED BY SWD.1)
  131.          AJMP      TIM0INT   ; JUMP TO TIMER 0 SERVICE ROUTINE
  132. ;            VECTOR LOCATION FOLLOWING EXTERNAL INTERRUPT #1
  133.          ORG       13H
  134. INTR1:   RETI                ; NOT CURRENTLY IMPLEMENTED
  135. ;            VECTOR LOCATION FOLLOWING TIMER INTERRUPT #1 
  136.          ORG       1BH
  137. TYMER1:  RETI                ; NOT CURRENTLY IMPLEMENTED
  138. ;            VECTOR LOCATION FOR SERIAL PORT INTERRUPT
  139.          ORG       23H
  140. SERPRT:  CLR       EA        ; TURN OFF INTERRUPTS
  141. ;   CHECK IF TI 
  142.          JNB       TI,RINT   ; JUMP IF NOT TI 
  143.          SETB      SENSR.2   ; SET TRANSMIT READY FLAG
  144.          CLR       TI        ; CLEAR TI 
  145.          SETB      EA        ; ENABLE INTERRUPTS            
  146.          RETI 
  147. ;   IT MUST BE A RECEIVER INTERRUPT 
  148. RINT:    CLR       EA        ; DISABLE ALL INTERRPTS
  149.          PUSH      ACC       ; PUT ACC ON STACK 
  150.          PUSH      PSW       ; PUT PSW ON STACK 
  151.          MOV       PSW,#RB3  ; USE RB3 FOR INTERRUPT SERVICE
  152.          MOV       A,R4      ; GET THE PTR TO HCP 
  153.          MOV       R1,A      ; SET UP R1 AS PTR TO HCP AREA 
  154.          ACALL     GETCHRI   ; GET THE CHAR 
  155.          LJMP      CHECK     ; SERVICE THE CHARACTER
  156. TIM0INT: NOP
  157. ;        TIMER SERVICE ROUTINE
  158.          CLR       EA        ; DISABLE ALL INTERRUPTS 
  159.          CLR       TR0       ; TURN OFF THE TIMER
  160.          PUSH      ACC       ; PUT ACC ON STACK 
  161.          PUSH      PSW       ; PUT PSW ON STACK 
  162.          MOV       PSW,#RB2  ; USE RB2 FOR TIMEOUT FUNCTIONS
  163.          ACALL     DUMMY     ; CLEAR THE INTERRUPT LATCH
  164. ;  CHECK FOR A PAUSE
  165. TR00:    JNB       SWD.1,TR01; JUMP IF NO PAUSE 
  166.          SETB      EA        ; ALLOW INTERRUPT TO CLEAR PAUSE BIT 
  167.          NOP                 ; WAIT 
  168.          NOP
  169.          CLR       EA        ; DISABLE THE INTERRUPTS 
  170.          AJMP      TR00      ; GO BACK AND TEST AGAIN 
  171. ;  CHECK FOR A TIMEOUT
  172. TR01:    JNB       SENSR.3,TR02 ; JUMP IF TIMEOUT NOT ACTIVE
  173.          CLR       C         ; CLEAR THE CARRY BIT
  174.          MOV       A,R4      ; GET LOW BYTE OF COUNTER
  175.          ADDC      A,#01H    ; INC THE COUNT
  176.          MOV       R4,A      ; RESTORE THE LOW COUNT
  177.          MOV       A,R3      ; GET THE MID BYTE 
  178.          ADDC      A,#00H    ; CONSIDER THE CARRY 
  179.          MOV       R3,A      ; RESTORE THE MID BYTE COUNT 
  180.          MOV       A,R2      ; GET THE HIGH BYTE OF COUNT 
  181.          ADDC      A,#00     ; CONSIDER THE CARRY 
  182.          MOV       R2,A      ; RESTORE THE HIGH COUNT 
  183.          JNC       TR02      ; JMP IF NO TIMEOUT (C <> 1)
  184.          MOV       SP,#SOS+2 ; RESET THE SP
  185.          CLR       EA        ; DISABLE INTERRUPTS 
  186.          CLR       ET0       ; DISABLE TIME-OUT INTERRUPT
  187.          RETI                ; START AFRESH 
  188. ;
  189. ;  RESET COUNTER 0 AND RETURN
  190. ;
  191. TR02:    MOV       TH0,#10H  ; RESET HIGH BYTE OF TIMER 0       
  192.          MOV       TL0,#00H  ; RESET LOW BYTE OF TIMER 0
  193.          SETB      TR0       ; START TIMER 0
  194.          POP       PSW       ;
  195.          POP       ACC       ;
  196.          SETB      EA        ; ENABLE INTERRUPTS AGAIN
  197.          RETI                ;
  198. ;        START OF THE PROGRAM 
  199. START:   CLR       EA        ; DISABLE ALL INTERRUPTS
  200.          MOV       SWD,#00H  ; CLEAR THE STATUS WORD
  201.          MOV       PSW,#RB3  ; USE RB3 FOR THE OP SYS 
  202.          MOV       SP,#SOS   ; INITIALIZE THE SP
  203. ;;
  204. ;;   THIS SECTION INITIALIZES THE OPERATING SYSTEM AND THE USART
  205. ;;
  206.          MOV       P2,#0FFH  ; SELECT THE I/O PORTS         
  207.          LCALL     TASK15    ; FRIENDLY BLINK 
  208. START1:  CLR       EA        ; MASTER INT DISABLE
  209.          MOV       SWD,#00H  ; CLEAR THE STATUS WORD
  210.          MOV       TCON,#00H ; STOP TIMER/EDGE TRIGGER INTERRUPTS 
  211.          MOV       PSW,#RB3  ; USE RB3 FOR OP SYSTEM
  212.          MOV       SP,#SOS   ; INITIALIZE THE STACK PTR 
  213.          LCALL     INIT      ; CLEAR QUEUE AND MEMORY 
  214. ;;
  215. DIAG:    NOP                 ; CHECK IF DIAG REQUESTED
  216. ;;
  217. ;;   THIS IS A DIAGNOSTICS ROUTINE.  IT CHECKS TO SEE IF THE
  218. ;;     USER HAS REQUESTED ANY DIAGNOSTICS BY SETTING THE
  219. ;;     DIAGNOSTICS SWITCH.
  220. ;;
  221.          MOV       P2,#0FFH  ; UPPER AD BYTE FOR I/O PORTS
  222.          MOV       R0,#TAS   ; ADDRESS OF THE DIAGNOS SWITCH
  223.          MOVX      A,@R0     ; GET THE SWITCH CONTENTS
  224.          ANL       A,#0C0H   ; GET THE LEADING 2 BITS 
  225.          JZ        BATCH     ; IF NO DIAG REQUESTED, GO ON
  226.          CJNE      A,#40H,DG1; SEE IF "01" CODE, SEND SWITCH
  227.          LCALL     SWTH      ; TASK TO SEND TAS 
  228.          SJMP      DIAG      ; GO BACK AGAIN
  229. DG1      CJNE      A,#80H,DG2; SEE IF "10" CODE HOST DATA TO PORTS
  230.          LCALL     SWTI      ; USE LOCAL USART
  231.          SJMP      DIAG      ; GO BACK AGAIN
  232. DG2      CJNE      A,#0C0H,DG3; SEE OF "11" CODE, ECHO
  233.          LCALL     ECHO      ; ECHO THE RECEIVED DATA 
  234. DG3      SJMP      DIAG      ; GO BACK AGAIN
  235. ;;
  236. ;;    DIAGNOSTIC SUBROUTINES, CALLED WITH DIAGNOSTIC SWITCH 
  237. ;;
  238. SWTH:    NOP       ;SEND THE ADDRESS/DIAG SWITCH TO THE HOST
  239. ;;
  240. ;;
  241.          MOV       PSW,#RB0 
  242.          MOV       R7,#00    ; SET UP DELAY 
  243.          MOV       R6,#00    ; SET UP DELAY 
  244. T31:     DJNZ      R7,T31    ; GO BACK AGAIN
  245.          DJNZ      R6,T31    ; BACK AGAIN 
  246.          MOV       R1,#TAS   ; PTR TO THE SWITCH REGISTER 
  247.          MOVX      A,@R1     ; READ THE SWITCH REGISTER 
  248.          ANL       A,#3FH    ; GET RID OF LEADING BITS
  249.          LCALL     OUTCHAR   ; SEND TO THE USART
  250.          RET
  251. ;;
  252. SWTI:    NOP       ;SWITCH REGISTER SENT USING LOCAL USART PORT 
  253. ;;
  254.          MOV       IE,#00H   ; ALL INTS OFF 
  255.          MOV       R7,#00    ; SET UP DELAY 
  256.          MOV       TMOD,#21H ; COUNTER 1 FOR UART 
  257.          MOV       TH1,#0FEH ; 9600 BAUD
  258.          MOV       TL1,#0FEH ; 9600 BAUD
  259.          MOV       TCON,#40H ; START TIMER #1 
  260.          MOV       SCON,#52H ; REC &TRAN ENABLED, SET TRANS FLAG
  261.          MOV       R6,#00    ; SET UP DELAY 
  262. T31I:    DJNZ      R7,T31I   ; GO BACK AGAIN
  263.          DJNZ      R6,T31I   ; BACK AGAIN 
  264.          MOV       R1,#TAS   ; PTR TO THE SWITCH REGISTER 
  265.          MOVX      A,@R1     ; READ THE SWITCH REGISTER 
  266.          ANL       A,#3FH    ; GET RID OF LEADING BITS
  267.          MOV       SBUF,A    ; SEND TO THE LOCAL USART
  268.          CLR       TI        ; CLEAR THE TRANS FLAG 
  269.          RET
  270. ;;
  271. ECHO:    NOP       ; ACCEPT AN ASCII CHARACTER FROM THE HOST, 
  272. ;;                   RETURNS THE CHARACTER TO THE HOST
  273. ;;
  274.          MOV       IE,#00H   ; DISABLE ALL INTERRUPTS 
  275. EO1:     JNB       RI,EO1    ; WAIT FOR RECEIVER CHARACTER
  276.          MOV       A,SBUF    ; GET THE CHARACTER
  277. EO2:     JNB       TI,EO2    ; WAIT FOR TRANSMITTER FLAG
  278.          MOV       SBUF,A    ; TRANSMIT THE CHARACTER 
  279.          CLR       RI        ; CLEAR THE RECEIVER FLAG
  280.          CLR       TI        ; CLEAR THE TRANSMITTER FLAG 
  281.          SJMP      EO1       ; GO BACK AGAIN
  282. ;;
  283. BATCH:   NOP
  284. ;;
  285. ;;   THIS SECTION CONTAINS COMMANDS PREPROGRAMMED INTO THE
  286. ;;     PROGRAM ROM MEMORY 
  287. ;;
  288. BAUD:    NOP
  289. ;    THIS SECTION AUTOMATICALLY SETS THE BAUD RATE BY DETECTING A "{" 
  290.          MOV       R2,#0FEH  ; COUNTER CODE FOR 9600 BAUD 
  291.          CLR       RI        ; CLEAR THE RECEIVER INT BIT 
  292. SETBD:   JNB       RI,SETBD  ; WAIT FOR A CHARACTER 
  293.          MOV       A,SBUF    ; GET THE CHARACTER
  294.          CLR       RI        ; CLEAR THE RECEIVER INT 
  295.          CJNE      A,#"{",BD48; JUMP IF NOT A "{" 
  296.          SETB      SWD.2     ; SET THE PIP BIT
  297.          MOV       R4,#HCP   ; RESET THE HCP PTR
  298.          AJMP      BTCHLOOP  ; BAUD RATE CORRECT
  299. BD48:    CJNE      A,#9EH,BD24 ; CHECK FOR 4800 BAUD
  300.          CLR       TR1       ; STOP TIMER 
  301.          MOV       TL1,#0FCH ; CONST FOR 4800 BAUD
  302.          MOV       TH1,#0FCH ;
  303.          SETB      SWD.2     ; SET PIP BIT
  304.          MOV       R4,#HCP   ; RESET HCP PTR
  305.          MOV       R6,#04H   ; WAITING CONSTANT 
  306. WT1:     DJNZ      R6,WT1    ; WAIT FOR END OF CURRENT CHAR 
  307.          CLR       RI        ; CLEAR THE REC FLAG 
  308.          AJMP      BTCHLOOP  ; ENTER THE WAIT LOOP
  309. BD24:    NOP
  310. BD1:     CLR       TR1       ; STOP THE TIMER 
  311.          CLR       C         ; CLEAR THE CARRY BIT
  312.          MOV       A,R2      ; GET THE COUNT CONSTANT 
  313.          RLC       A         ; DIVIDE BY 2
  314.          MOV       R2,A      ; RESTORE A
  315.          MOV       TL1,A     ; RESTORE TL1
  316.          MOV       TH1,A     ; RESTORE TH1
  317.          MOV       R7,#80H
  318.          MOV       R6,#00H   ; INITIALIZE R6
  319. BD2:     DJNZ      R6,BD2    ; TIME DELAY 
  320.          DJNZ      R7,BD2 
  321.          SETB      TR1       ; START TIMER 1
  322.          CJNE      A,#080H,SETBD ; GO BACK AND TRY AGAIN
  323.          CLR       TR1       ; STOP TIMER 1 
  324.          MOV       TL1,#0FEH ; SET UP FOR 9600 BAUD 
  325.          MOV       TH1,#0FEH ;
  326.          MOV       R2,#0FEH  ; SET UP R2
  327.          SETB      TR1       ; START TIMER 1
  328.          AJMP      SETBD
  329. BTCHLOOP: NOP 
  330. ;;
  331. ;;   THESE COMMAND ARE EXECUTED BEFORE EVERY QUEUED TASK
  332. ;;
  333.          MOV       P2,#0FFH  ; SELECT THE I/O PORTS 
  334. OPWIND:  CLR       TR0       ; STOP TIMER 0
  335.          CLR       ET0       ; DISABLE TIMER INT
  336.          SETB      ES        ; ENABLE SERIAL INT
  337.          SETB      EA        ; ENABLE ALL INTS
  338.          NOP
  339.          NOP
  340. CLWIND:  CLR       EA        ; DISABLE THE INTERRUPTS 
  341.          CLR       TR0       ; STOP TIMER  
  342. ;;
  343. ;;   THIS SECTION CONTAINS COMMANDS WHICH ARE INCLUDED IN THE 
  344. ;;      TASK SERVICE LOOP 
  345. ;;
  346. ;;
  347. SOFKEY:  NOP
  348.          NOP
  349. ;;
  350. ;;   THIS SECTION CHECKS TO SEE IF A SOFTKEY HAS BEEN 
  351. ;;      DEPRESSED (NOT IMPLEMENTED) 
  352. ;;
  353. GTASK:   NOP                 ;
  354. ;;
  355. ;;   THIS SECTION GETS THE FIRST TASK ON THE QUEUE AND
  356. ;;     EXECUTES IT
  357. ;;
  358.          MOV       A,#BOQ    ;  GET BOQ POINTER 
  359.          XRL       A,R3      ;  COMPARE TO EOQ PTR
  360.          JZ        BTCHLOOP  ;  IF NO TASK, GO BACK 
  361. ;;
  362. ;;   CHECK TO SEE IF ACTION IS "PAUSED" 
  363. ;;
  364.          JB        SWD.1,BTCHLOOP  ; IF PAUSED, GO BACK 
  365. ;;
  366. ;;   SET UP RB0 REGISTERS 
  367. ;;
  368.          MOV       02H,#BOQ  ;  SET POINTER FOR R2 OF RB0 
  369.          MOV       03H,BOQ+2 ;  MOVE ARG #1 TO R3 OF RB0
  370.          MOV       04H,BOQ+3 ;  MOVE ARG #2 TO R4 OF RB0
  371.          MOV       05H,BOQ+4 ;  MOVE ARG #3 TO R5 OF RB0
  372.          MOV       06H,BOQ+5 ;  MOVE ARG #4 TO R6 OF RB0
  373.          MOV       07H,BOQ+6 ;  MOVE ARG #5 TO R7 OF RB0
  374. ;;
  375. ;;   SEE IF TASK READY TO RUN 
  376. ;;
  377.          MOV       R1,#STAT  ; SET PTR TO STATUS BYTE 
  378.          MOV       A,@R1     ; GET THE STATUS 
  379.          ANL       A,#80H    ; GET MSBIT
  380.          JZ        GK2       ; NO WAIT, A ";" COMMAND 
  381. ;;
  382. ;;    ADJUST STATUS TO "10" (WAITING) 
  383. ;;
  384.          MOV       A,@R1     ; GET STATUS BYTE
  385.          ANL       A,#30H    ; GET BITS 5,4 
  386.          XRL       A,#10H    ; CHECK IF BITS 0,1
  387.          JZ        GK2       ; GO ON, READY TO RUN
  388.          MOV       A,@R1     ; GET STATUS 
  389.          ANL       A,#0CFH   ; PUT 0,0 IN POS 5,4 
  390.          ORL       A,#20H    ; PUT IN BLOCKED CODE
  391.          MOV       @R1,A     ; PUT STATUS WORD BACK 
  392.          AJMP      BTCHLOOP  ; BLOCKED, GO BACK 
  393. ;;
  394. ;;    ADJUST STATUS TO "01" (BEGUN) 
  395. ;;
  396. GK2:     MOV       A,@R1     ; GET THE STATUS WORD
  397.          ANL       A,#0CFH   ; 0 BITS 5,4 
  398.          ORL       A,#10H    ; PUT 0,1 IN POS 5,4 
  399.          MOV       @R1,A     ; STORE STATUS 
  400. ;;
  401. ;;    ADJUST SYSTEM STATUS TO "TASK RUNNING"
  402. ;;
  403.          SETB      SWD.5     ; INDICATE A QUEUE TASK RUNNING
  404.          MOV       A,BOQ     ; GET THE TASK NUMBER
  405. ;;
  406. ;;     SERVICE THE QUEUED TASK
  407. ;;
  408.          LCALL     QVECTOR   ; SERVICE THE TASK 
  409. ;;
  410. ENTSK:   CLR       TR0       ; STOP TIMER 0 
  411. ;;
  412. ;;  THIS SECTION ADJUSTS THE STATUS WORD AND PTRS AT THE
  413. ;;    END OF A TASK 
  414. ;;
  415.          CLR       EA        ; DISABLE THE INTERRUPTS
  416.          CLR       ET0       ; CLEAR TIMER INTERRUPT 
  417.          MOV       P2,#0FFH  ; SELECT THE I/O PORT
  418.          MOV       PSW,#RB3  ; MAKE SURE WE'RE IN RB3 
  419. ;;
  420. ;;   ADJUST SYSTEM STATUS TO "TASK DONE"
  421. ;;
  422.          CLR       SWD.5     ; INDICATE QUEUE TASK NOT RUNNING
  423. ;;
  424. ;;  TRAP OUT THE CLEAR QUEUE CONDITION (FROM TASK1)
  425. ;;
  426.          CJNE      R3,#BOQ,EK0 ; IF PTR NOT RESET, GO ON
  427.          AJMP      BTCHLOOP  ; GO BACK TO IDLE LOOP
  428. ;;
  429. ;;   GET COUNT OF BYTES IN 1ST TASK 
  430. ;;
  431. EK0:     MOV       A,STAT    ; GET THE STATUS WORD
  432.          ANL       A,#07H    ; GET BYTE COUNT IN STAT 
  433.          ADD       A,#02H    ; ADJUST COUNT 
  434.          MOV       R6,A      ; STORE COUNT
  435. ;;
  436. ;;   ADVANCE BOQ PTR
  437. ;;
  438.          MOV       A,#BOQ    ; ORIGINAL BOQ 
  439.          ADD       A,R6      ; TEMP BOQ 
  440.          MOV       R2,A      ; STORE BOQ
  441. ;;
  442. ;;   SEE IF RE-QUEUEING IS NECESSARY
  443. ;;
  444.          MOV       R0,#STAT  ; SET PTR TO STAT REG
  445.          MOV       A,@R0     ; GET STATUS WORD
  446.          ANL       A,#40H    ; GET "RE-QUEUE" BIT 
  447.          JZ        EK2       ; NO RE-QUEUE NECESSARY
  448. ;;
  449. ;;   RESET STATUS REGISTER OF TASK TO BE REQUEUED 
  450. ;;
  451.          MOV       A,@R0     ; GET THE STATUS REGISTER
  452.          ANL       A,#0CFH   ; PUT 0,0 IN BITS 5,4
  453.          MOV       @R0,A     ; RESTORE THE STATUS 
  454. ;;
  455. ;;   DO THE REQUEUEING
  456. ;;
  457.          MOV       R0,#BOQ   ; SET UP SRCE PTR IN R0
  458.          MOV       A,R6      ; GET THE BYTE COUNT IN PACK 1 
  459.          MOV       R7,A      ; STORE BYTE COUNT IN R7 
  460.          MOV       A,R3      ; GET THE EOQ
  461.          MOV       R1,A      ; SET UP DEST PTR IN R1
  462. EK1:     MOV       A,@R0     ; GET THE DATA 
  463.          MOV       @R1,A     ; STORE ON QUEUE 
  464.          INC       R0        ; INC THE PTR
  465.          INC       R1        ; INC THE PTR
  466.          DJNZ      R7,EK1    ; GO BACK IF NOT DONE
  467. ;;
  468. ;;   ADJUST EOQ 
  469. ;;
  470.          MOV       A,R3      ; GET OLD EOQ
  471.          ADD       A,R6      ; COMPUTE NEW EOQ
  472.          MOV       R3,A      ; STORE TEMP EOQ 
  473. ;;
  474. ;;   CALCULATE NEW EOQ (AFTER SHIFT)
  475. ;;
  476. EK2:     MOV       A,R6      ; GET BYTE COUNT OF 1ST PACKET 
  477.          CPL       A         ; NEGATE 
  478.          INC       A         ;
  479.          ADD       A,R3      ; COMPUTE NEW EOQ
  480.          MOV       R3,A      ; STORE NEW EOQ
  481.          XRL       A,#BOQ    ; CHECK FOR NO QUEUE 
  482.          JNZ       EK6       ; SHIFT NECESSARY
  483.          AJMP      EK4       ; NO QUEUE TO SHIFT
  484. ;;
  485. ;;  CALCULATE NUMBER OF BYTES TO SHIFT
  486. ;;
  487. EK6:     MOV       A,#BOQ    ; ADDRESS OF BOQ 
  488.          CPL       A         ; NEGATE 
  489.          INC       A         ;
  490.          ADD       A,R3      ; THIS GIVES LENGTH OF QUEUE 
  491.          MOV       R7,A      ; STORE LENGTH OF QUEUE
  492. ;;
  493. ;;  SHIFT THE QUEUE 
  494. ;;
  495.          MOV       A,R2      ; TEMP BOQ PTR 
  496.          MOV       R0,A      ; SOURCE PTR 
  497.          MOV       R1,#BOQ   ; DEST PTR 
  498. EK3:     MOV       A,@R0     ; GET THE DATA 
  499.          MOV       @R1,A     ; STORE THE DATA 
  500.          INC       R0        ; INC THE PTR
  501.          INC       R1        ; INC THE PTR
  502.          DJNZ      R7,EK3    ; GO BACK TILL DONE
  503. ;;
  504. ;;   CLEAR THE UNUSED PART OF QUEUE (FOR DISPLAY PURPOSES)
  505. ;;
  506. EK4:     MOV       A,R3      ; GET EOQ PTR
  507.          MOV       R0,A      ; STORE THE PTR
  508. EK5:     MOV       @R0,#00H  ; CLEAR THE LOCATION 
  509.          INC       R0        ; INC THE PTR
  510.          DJNZ      R6,EK5    ; GO BACK TIL DONE 
  511.          MOV       R2,#BOQ   ; RESET THE BOQ PTR
  512.          AJMP      BTCHLOOP  ; GO BACK AGAIN
  513. ;;
  514. ;   THIS IS THE COMMON SECTION WHICH SERVICES ALL INTERRUPTS FROM 
  515. ;     THE SERIAL PORT 
  516. CHECK    ANL       A,#7FH    ; STRIP OFF LEADING BIT
  517.          MOV       R6,A      ; STORE THE CHAR 
  518. ;;
  519. ;;   CHECK FOR BEGINNING OF PACKET  "{" 
  520. ;;
  521.          CJNE      R6,#"{",SR0B   ; JUMP IF NOT "{" 
  522. ;;
  523. ;;   SET STATUS TO SHOW PACKET IN PROGRESS
  524. ;;
  525.          SETB      SWD.2     ; SHOW PACKET IN PROGRESS
  526.          MOV       R4,#HCP   ; RESET THE PACKET PTR 
  527.          POP       PSW
  528.          POP       ACC
  529.          SETB      EA        ; ENABLE INTERRUPTS  
  530.          RETI 
  531. ;;
  532. ;;   CHECK FOR PACKET IN PROGRESS 
  533. ;;
  534. SR0B:    JB        SWD.2,SR0A; JUMP IF PACKET IN PROGRESS 
  535. ;;
  536. ;;   CHECK IF LOCAL ASYNC PORT IS SENSITIZED
  537. ;;
  538. SR1:     JNB       SENSR.7,SR0C  ; JUMP IF SER PORT NOT SENSITIZED
  539. ;;
  540. ;;   SEND CHAR OUT ASYNC PORT (NO READY CHECK)
  541. ;;
  542.          MOV       A,R6      ; GET THE CHARACTER
  543.          MOV       R0,#UDRL  ; ADDRESS OF LOC ASYNC PORT
  544.          MOVX      @R0,A     ; SEND THE CHARACTER 
  545. ;;
  546. ;;  CHECK IF PARALLEL PORT IS SENSITIZED
  547. ;;
  548. SR0C:    JNB       SENSR.5,SR2  ; JUMP IF PAR PORT NOT SENSITIZED 
  549. ;;
  550. ;;   SEND CHAR OUT PAR PORT (NO READY CHECK)
  551. ;;
  552.          MOV       A,R6      ; GET THE CHARACTER
  553.          MOV       P1,A      ; SEND CHAR TO THE PORT
  554.          ANL       P2,#0DFH  ; SET THE STROBE 
  555.          ORL       P2,#20H   ; CLEAR THE STROBE 
  556. ;;
  557. ;;  RESTORE AC AND RETURN 
  558. ;;
  559. SR2:     POP       PSW
  560.          POP       ACC
  561.          SETB      EA        ; ENABLE ALL INTERRUPTS    
  562.          RETI 
  563. ;;
  564. ;;   CHECK FOR DATA LOCKOUT,  ADDRESS 00H 
  565. ;;
  566. ;SR0:    MOV       R0,#TAS   ; ADDRESS OF ADDRESS SWITCH
  567. ;        MOVX      A,@R0     ; GET DEVICE ADDRESS 
  568. ;        JNZ       SR0A      ; JUMP IF NOT 00 ADDRESS 
  569. ;        POP       PSW
  570. ;        POP       ACC       ; POP THE AC STACK 
  571. ;        SETB      EA        ; ENABLE THE INTERRUPT        ***
  572. ;        RETI 
  573. ;;
  574. ;;   CHECK FOR A BLANK AND IGNORE IT
  575. ;;
  576. SR0A:    CJNE      R6,#" ",SE0  ; JUMP IF NOT A BLANK 
  577.          POP       PSW
  578.          POP       ACC       ; POP THE AC STACK 
  579.          SETB      EA        ; ENABLE SER INT/TIMER0 INT
  580.          RETI 
  581. ;;
  582. ;;   CHECK FOR A "%" .  THIS IS A RESTART COMMAND 
  583. ;;
  584. SE0:     CJNE      R6,#"%",SE1 ;  JUMP IF NOT A "%" 
  585.          AJMP      START     ; A RESTART, GO TO BEGINNING 
  586. ;;
  587. ;;    CHECK FOR A "$".  THIS IS AN ADVANCE/SYNC COMMAND 
  588. ;;
  589. SE1:     CJNE      R6,#"$",SE2  ;  JUMP IF NOT A "$"
  590.          MOV       R4,#HCP   ; RESET POINTER
  591.          MOV       R1,#STAT  ; GET THE BOQ PTR
  592.          MOV       A,@R1     ; GET THE STATUS WORD
  593.          ANL       A,#0CFH   ; PUT 0,0 IN BITS 5,4
  594.          ORL       A,#10H    ; PUT 0,1 IN BITS 5,4
  595.          MOV       @R1,A     ; RESTORE THE STATUS WORD
  596.          POP       PSW
  597.          POP       ACC       ; RESTORE THE AC 
  598.          SETB      EA        ; ENABLE ALL INTERRUPTS     
  599.          RETI                ; GO BACK
  600. ;;
  601. ;;   CHECK FOR A "&".  THIS IS AN ABORT COMMAND 
  602. ;;
  603. SE2:     CJNE      R6,#"&",SE5C ; JUMP IF NOT A "&" 
  604.          LCALL     TASK2     ; ACALL THE ABORT TASK 
  605. ;;
  606. ;;   CHECK FOR A "/"  ACK ECHO REQUIRED 
  607. ;;
  608. SE5C:    CJNE      R6,#"/",SE4 ; JUMP IF NOT A "/"
  609.          SETB      SWD.7     ; SET ECHO BIT IN STATUS WORD
  610.          POP       PSW
  611.          POP       ACC       ; POP THE AC STACK 
  612.          SETB      EA        ; ENABLE ALL INTERRUPTS     
  613.          RETI 
  614. ;;
  615. ;;   CHECK FOR A "}". END OF PACK, NO ECHO
  616. ;;
  617. SE4:     MOV       A,R6      ; GET CHAR BACK AGAIN
  618.          XRL       A,#"}"    ; CHECK IF END OF A PACKET 
  619.          JZ        SE5       ; AJMP IF END OF PACKET
  620. ;;
  621. ;;   CHECK HERE FOR A VALID CHARACTER 0-9, A-F
  622. ;;
  623. ;;   CHECK FOR PACKET TOO LONG ERROR
  624. ;;
  625. SE3D:    MOV       A,#ICP    ; GET START ADDRESS OF ICP AREA
  626.          XRL       A,R4      ; SEE IF PTR TOO LARGE 
  627.          JNZ       SE3C      ; JUMP IF OK 
  628. SE3E:    SETB      SWD.3     ; SET STATUS WORD ERROR BIT
  629.          POP       PSW
  630.          POP       ACC       ; RESTORE THE AC 
  631.          SETB      EA        ; ENABLE ALL INTERRUPTS     
  632.          RETI 
  633. ;;
  634. ;;   THIS SECTION PUTS THE CHAR IN THE HCP AREA 
  635. ;;
  636. SE3C:    MOV       A,R4      ; GET THE HCP PTR
  637.          MOV       R1,A      ; SET UP THE PTR 
  638.          MOV       A,R6      ; GET CHAR BACK AGAIN
  639.          MOV       @R1,A     ; PUT CHAR IN HCP AREA 
  640.          INC       R4        ; ADVANCE THE HCP PTR
  641.          POP       PSW
  642.          POP       ACC       ; RESTORE THE AC 
  643.          SETB      EA        ; ENABLE ALL INTERRUPTS     
  644.          RETI                ; GO BACK TO QUEUE TASK SERVICE
  645. ;          HCP    20  ASCII MSB OF DEVICE ADDRESS 
  646. ;          HCP+1  21  ASCII LSB OF DEVICE ADDRESS 
  647. ;          HCP+2  22  ASCII PREFIX OF COMMAND 
  648. ;                  "!"  IMMEDIATE 
  649. ;                  ";"  PROCEED WHEN READY
  650. ;                  "?"  WAIT FOR PERMISSION 
  651. ;          HCP+3  23  ASCII MSB OF TASK NUMBER
  652. ;          HCP+4  24  ASCII LSB OF TASK NUMBER
  653. ;          HCP+5  25  ASCII SUFFIX OF COMMAND 
  654. ;                  "."  DO ONCE 
  655. ;                  "+"  REQUEUE 
  656. ;          HCP+6  26  ASCII MSB OF ARG1 
  657. ;          HCP+7  27  ASCII LSB OF ARG1 
  658. ;          HCP+8  28  ASCII MSB OF ARG2 
  659. ;          HCP+9  29  ASCII LSB OF ARG2 
  660. ;          HCP+A  2A  ASCII MSB OF ARG3 
  661. ;          HCP+B  2B  ASCII LSB OF ARG3 
  662. ;          HCP+C  2C  ASCII MSB OF ARG4 
  663. ;          HCP+D  2D  ASCII LSB OF ARG4 
  664. ;          HCP+E  2E  ASCII MSB OF ARG5 
  665. ;          HCP+F  2F  ASCII MSB OF ARG5 
  666. ;;
  667. ;;   AT THIS POINT A COMPLETE PACKET HAS BEEN RECEIVED. 
  668. ;;    IT IS NOW SERVICED. 
  669. ;;
  670. ;;
  671. ;;   CLEAR THE PACKET IN PROGRESS BIT 
  672. ;;
  673. SE5:     CLR       SWD.2     ; CLEAR PACKET IN PROGRESS BIT 
  674. ;;
  675. ;;   THIS SECTION TESTS THE ADDRESS FIELD OF THE PACKET 
  676. ;;
  677.          MOV       R1,#HCP   ; PTR TO MSB OF ADDRESS
  678.          MOV       A,@R1     ; GET PACKET ADDRESS 
  679.          ANL       A,#0FH    ; GET LOWER NIBBLE 
  680.          SWAP      A         ; SWAP NIBBLES 
  681.          MOV       R7,A      ; TEMP STORAGE 
  682.          INC       R1        ; PTR TO LSB OF ADDRESS
  683.          MOV       A,@R1     ; GET LSB OF ADDRESS 
  684.          JB        ACC.6,MS1 ; AJMP IF A-F
  685.          AJMP      MS2       ; AJMP IF 0-9
  686. MS1:     ADD       A,#09H    ; CORRECT A-F
  687. MS2:     ANL       A,#0FH    ; GET LOWER NIBBLE 
  688.          ORL       A,R7      ; FULL ADDRESS 
  689. ;;
  690. ;;   CHECK IF UNIVERSAL ADDRESS 
  691. ;;
  692.          JNZ       MS2A      ; AJMP IF NOT UNIVERSAL ADDRESS
  693.          AJMP       HJ0 
  694. MS2A:    MOV       R7,A      ; TEMP STORE 
  695. ;;
  696. ;;   COMPARE TO "MY ADDRESS"
  697. ;;
  698.          MOV       R1,#TAS   ; ADDRESS OF SWITCH REG
  699.          MOVX      A,@R1     ; GET DEVICE ADDRESS 
  700.          ANL       A,#3FH    ; GET LOWER 6 BITS 
  701.          XRL       A,R7      ; COMPARE TO PACKET ADDRESS
  702.          JZ        MS3       ; AJMP IF "MY ADDRESS" 
  703.          POP       PSW
  704.          POP       ACC       ; RESTORE THE AC 
  705.          SETB      EA        ; ENABLE ALL INTERRUPTS     
  706.          RETI                ; RETURN 
  707. ;;
  708. ;;   SEE IF AN "ECHO" OF PACKET IS NECESSARY
  709. ;;
  710. MS3:     JNB       SWD.7,HJ0 ; JUMP IF NO ECHO IS NEEDED
  711.          CLR       SWD.7     ; CLEAR THE ECHO BIT 
  712. ;;
  713. ;;   CONSTRUCT AND ECHO PACKET
  714. ;;
  715.          MOV       A,#"["    ; START OF PACKET CHAR 
  716.          ACALL     OUTCHAR   ; SEND FIRST CHAR
  717.          MOV       R1,#HCP   ; PTR TO FIRST ASCII CHAR
  718.          MOV       A,R4      ; PTR FOR HCP
  719.          SUBB      A,#30H    ; NUMBER OF BYTES ON HCP 
  720.          MOV       R7,A      ; SET UP COUNTER 
  721. MS4:     MOV       A,@R1     ; GET THE CHAR 
  722.          ACALL     OUTCHAR   ; SEND THE CHAR
  723.          INC       R1        ; INCREMENT THE COUNTER
  724.          DJNZ      R7,MS4    ; GO BACK IF NOT DONE
  725. MS5:     MOV       A,#"]"    ; LAST CHAR FOR PACKET 
  726.          ACALL     OUTCHAR   ; SEND LAST CHAR 
  727. ;;
  728. ;;   THIS SECTION ADJUSTS THE CODE IN THE HCP AREA SO THAT ALL
  729. ;;     NUMERICAL DATA ARE CONVERTED FROM ASCII 0-F TO HEX 0-F.
  730. ;;     !=1, :=A, ?=F IN LOC HCP+2 
  731. ;;     +=B, .=E IN LOC HCP+5
  732. ;;
  733. HJ0:     MOV       R7,#10H   ; SET R7 AS A COUNTER
  734.          MOV       R1,#HCP   ; SET UP R1 AS POINTER TO HCP
  735. HJ1:     MOV       A,@R1     ; GET VALUE FROM HCP AREA
  736.          JB        ACC.6,HJ1A; CHECK BIT 2
  737.          AJMP      HJ2       ; AJMP IF ALREADY 0-9 OR !,;,?,+,. 
  738. HJ1A:    ADD       A,#09H    ; CORRECT LOW NIBBLE IF A-F
  739. HJ2:     ANL       A,#0FH    ; GET LOW NIBBLE 
  740.          MOV       @R1,A     ; RESTORE THE BYTE 
  741.          INC       R1        ; INCREMENT THE POINTER
  742.          DJNZ      R7,HJ1    ; GO BACK IF NOT THROUGH 
  743. ;          HCP    20  HEX MSB OF DEVICE ADDRESS 
  744. ;          HCP+1  21  HEX LSB OF DEVICE ADDRESS 
  745. ;          HCP+2  22  HEX PREFIX OF COMMAND 
  746. ;                  "!"  IMMEDIATE 
  747. ;                  ":"  PROCEED WHEN READY
  748. ;                  "?"  WAIT FOR PERMISSION 
  749. ;          HCP+3  23  HEX MSB OF TASK NUMBER
  750. ;          HCP+4  24  HEX LSB OF TASK NUMBER
  751. ;          HCP+5  25  HEX SUFFIX OF COMMAND 
  752. ;                  "."  DO ONCE 
  753. ;                  "+"  REQUEUE 
  754. ;          HCP+6  26  HEX MSB OF ARG1 
  755. ;          HCP+7  27  HEX LSB OF ARG1 
  756. ;          HCP+8  28  HEX MSB OF ARG2 
  757. ;          HCP+9  29  HEX LSB OF ARG2 
  758. ;          HCP+A  2A  HEX MSB OF ARG3 
  759. ;          HCP+B  2B  HEX LSB OF ARG3 
  760. ;          HCP+C  2C  HEX MSB OF ARG4 
  761. ;          HCP+D  2D  HEX LSB OF ARG4 
  762. ;          HCP+E  2E  HEX MSB OF ARG5 
  763. ;          HCP+F  2F  HEX MSB OF ARG5 
  764. ;    THIS SECTION CONSTRUCTS THE ASSEMBLED COMMAND PACKET (ACP) 
  765. ;      AND STORES IT IN THE HCP AREA.  IT WILL BE TRANSFERED TO 
  766. ;      THE IMMEDIATE COMMAND PACKET (ICP) AREA OR TO THE QUEUE. 
  767. ;      LOCATION #HCP IS USED TO STORE THE PREFIX SO THAT A TEST 
  768. ;      FOR "IMMEDIATE" CAN BE MADE. 
  769. ;    STORE PREFIX FOR LATER USE TO DETERMINE IF IMMEDIATE 
  770. SE6E:    MOV       R0,#HCP   ; SET PTR FOR ACP
  771.          MOV       R1,#HCP+2 ; SET PTR TO PREFIX
  772.          MOV       A,@R1     ; GET PREFIX 
  773.          MOV       @R0,A     ; STORE PREFIX IN #HCP 
  774.          INC       R0        ; INCREMENT THE ACP PTR
  775. ;    CONSTRUCT FIRST BYTE OF ASSEMBLED PACKET, THE TASK NUM 
  776. SE6A:    MOV       R1,#HCP+3 ; SET PTR TO FIRST NIB OF TASK NUM 
  777.          MOV       A,@R1     ; GET THE FIRST NIBBLE 
  778.          SWAP      A         ; SWAP NIBBLES 
  779.          INC       R1        ; INCREMENT THE HCP POINTER
  780.          ORL       A,@R1     ; APPEND THE LOWER NIB OF TASK NUM 
  781.          MOV       @R0,A     ; STORE FIRST BYTE OF ACP
  782.          INC       R0        ; INCREMENT ACP PTR
  783. ;    THIS SECTION CONSTRUCTS THE STATUS WORD
  784.          MOV       R1,#HCP+2 ; SET PTR FOR FOR PREFIX 
  785.          MOV       A,@R1     ; GET PREFIX; ;=0, ?=1,!=1.  THE 
  786. ;                            ; IMMEDIATE CONDITION (!) WILL BE
  787. ;                            ; DETECTED LATER 
  788.          ANL       A,#01H    ; GET LS BIT 
  789.          RR        A         ; PUT LSB IN MSB POS 
  790.          MOV       R6,A      ; TEMP STORE OF STATUS WORD
  791.          MOV       R1,#HCP+5 ; SET PTR FOR SUFFIX 
  792.          MOV       A,@R1     ; GET THE SUFFIX 
  793.          ANL       A,#01     ; GET THE LSB +=1, .=0 
  794.          RR        A         ; ROTATE 
  795.          RR        A         ; ROTATE AGAIN 
  796.          XRL       A,R6      ; APPEND TO STATUS WORD
  797.          MOV       R6,A      ; STORE TEMP 
  798.          MOV       A,#HCP+6  ; GET VALUE OF START OF HCP ARGS 
  799.          CPL       A         ; CHANGE TO A NEG
  800.          INC       A         ; NUMBER 
  801.          ADD       A,R4      ; GIVES NUM OF ARG BYTES ON HCP
  802.          MOV       R4,#HCP   ; RESET COUNTER
  803.          CLR       C         ; CLEAR THE CARRY FLAG 
  804.          RRC       A         ; DIVIDE BY 2 FOR PACKING
  805.          XRL       A,R6      ; APPEND TO STATUS 
  806.          MOV       @R0,A     ; PUT STATUS BYTE IN ACP 
  807.          INC       R0        ; INC THE ACP PTR
  808. ;;
  809. ;;   PACK THE TASK ARGUMENTS
  810. ;;
  811. SE6B:    MOV       R1,#HCP+6 ; SET UP HCP PTR 
  812.          MOV       R7,#05H   ; SET UP COUNTER 
  813. SE7:     MOV       A,@R1     ; GET MS BYTE OF ARG 
  814.          SWAP      A         ; SWAP NIBBLES 
  815.          INC       R1        ; INC THE PTR
  816.          XRL       A,@R1     ; CONSTRUCT THE BYTE 
  817.          MOV       @R0,A     ; PUT ON ACP 
  818.          INC       R1        ; INC THE HCP PTR
  819.          INC       R0        ; INC THE ACP PTR
  820.          DJNZ      R7,SE7    ; DO UNTIL PACKET FINISHED 
  821. ;          HCP    30  HEX LSB OF PREFIX 
  822. ;          HCP+1  31  HEX TASK NUMBER 
  823. ;          HCP+2  32  HEX STATUS WORD 
  824. ;                  7         =0 PROCEED WHEN READY ":"
  825. ;                            =1 WAIT FOR PERMISSION "?" 
  826. ;                   6        =0 DO ONCE "." 
  827. ;                            =1 RE-QUEUE "+"
  828. ;                    54      =00  NOT YET BEGUN 
  829. ;                            =01  BEGUN 
  830. ;                            =10  WAITING FOR "$" SYNC SIGNAL 
  831. ;                            =11  FINISHED
  832. ;                       3210 = NUMBER OF ARGUMENTS (0 - 5)
  833. ;          HCP+3  33  HEX ARG1
  834. ;          HCP+4  34  HEX ARG2
  835. ;          HCP+5  35  HEX ARG3
  836. ;          HCP+6  36  HEX ARG4
  837. ;          HCP+7  37  HEX ARG5
  838. ;;
  839. ;;   AT THIS POINT THE PACKET SHOULD BE ASSEMBLED AND IN
  840. ;;     THE HCP AREA.  THE FIRST BYTE IS THE PREFIX. IT WILL 
  841. ;;     BE USED TO TEST FOR IMMEDIATE. 
  842. ;;
  843. ;;
  844. ;;   TEST IF IMMEDIATE
  845. ;;
  846. SE8:     MOV       A,HCP     ; GET THE PREFIX 
  847.          CJNE      A,#01H,QUEUE ; JUMP IF NOT IMMEDIATE 
  848. ;;
  849. ;;  TEST HERE TO SEE IF IMMEDIATE IS ALREADY RUNNING
  850. ;;
  851. SE20:    JNB       SWD.6,ST1 ; JUMP IF IMMED IS NOT RUNNING 
  852. ;;
  853. ;;  IGNORE THE IMMEDIATE COMMAND AND RETURN 
  854. ;;
  855.          POP       PSW       ; RESTORE THE PSW
  856.          POP       ACC
  857.          SETB      EA        ; ENABLE ALL INTERRUPTS    
  858.          RETI                ; GO BACK
  859. ;;
  860. ;;    STORE THE PACKET
  861. ;;
  862. ST1:     MOV       R0,#ICP   ; SET PTR FOR ICP AREA 
  863.          MOV       R1,#HCP+1 ; SET PTR FOR COM IN HCP 
  864.          MOV       R7,#07H   ; SET UP COUNT FOR TRANSFER
  865. ID1:     MOV       A,@R1     ; GET DATA FROM HCP
  866.          MOV       @R0,A     ; TRANSFER DATA TO ICP 
  867.          INC       R0        ; INC THE DEST PTR 
  868.          INC       R1        ; INC THE SOURCE PTR 
  869.          DJNZ      R7,ID1    ; REPEAT TIL PACKET TRANSFERED 
  870. ;;
  871. ;;     NOW PUT THE PTR TO THE HEAD OF QUEUE IN R2 OF RB1
  872. ;;
  873.          MOV       0AH,#ICP  ; SET START-OF-TASK POINTER
  874. ;      R1   ICP   09   TASK NUMBER
  875. ;      R2   ICP+1 0A   PTR TO TASK ARGS
  876. ;      R3   ICP+2 0B   ARG1 
  877. ;      R4   ICP+3 0C   ARG2 
  878. ;      R5   ICP+4 0D   ARG3 
  879. ;      R6   ICP+5 0E   ARG4 
  880. ;      R7   ICP+6 0F   ARG5 
  881. ;;
  882. ;;    ADJUST SYSTEM STATUS TO "IMMED TASK RUNNING"
  883. ;;
  884.          SETB      SWD.6     ; INDICATE A IMMED TASK RUNNING
  885. ;;
  886. ;;    SERVICE THE IMMEDIATE COMMAND 
  887. ;;
  888.          MOV       A,ICP     ; PUT TASK NUMBER IN AC
  889.          LCALL     IVECTOR   ; SERVICE THE TASK 
  890. ;;
  891. ;;   ADJUST SYSTEM STATUS TO "TASK DONE"
  892. ;;
  893.          CLR       SWD.6     ; CLEAR IMMED TASK RUN BIT 
  894.          SETB      TR0       ; START THE CLOCK AGAIN
  895. ;;
  896. ;;    PREPARE TO RETURN TO QUEUED TASK/IDLE LOOP
  897. ;;
  898.          POP       PSW
  899.          POP       ACC       ; RESTORE THE AC 
  900.          SETB      EA        ; ENABLE ALL INTERRUPTS    
  901.          RETI                ; GO BACK 
  902. ;;
  903. QUEUE:   NOP
  904. ;;
  905. ;;   THE QUEUE SUBROUTINE PLACES THE APPRORIATE DATA ON THE 
  906. ;;     TASK QUEUE 
  907. ;;
  908.          MOV       R0,#HCP+2 ; SET PTR TO STATUS WORD 
  909.          MOV       A,@R0     ; GET STATUS WORD
  910.          ANL       A,#07H    ; GET LOWEST 3 BITS
  911.          ADD       A,#02H    ; ACCOUNT FOR 1ST 2 BYTES
  912.          MOV       R6,A      ; STORE COUNT IN R6
  913.          MOV       A,R3      ; GET EOQ PTR
  914.          MOV       R0,A      ; PUT EOQ PTR IN R0
  915.          MOV       R1,#HCP+1 ; SET UP SOURCE PTR
  916. QE1:     MOV       A,R0      ; GET EOQ PTR
  917.          XRL       A,#EOQ+1  ; SEE IF AN OVERFLOW 
  918.          JNZ       QE2       ; JUMP IF QUEUE NOT FULL 
  919.          MOV       R0,#SWD   ; PTR TO OS STATUS REGISTER
  920.          MOV       A,@R0     ; GET THE OS STATUS REG
  921.          ORL       A,#09H    ; PUT 1 IN BIT 0,3,"QUE OVERFLOW"
  922.          MOV       @R0,A     ; RESTORE
  923.          AJMP      EXIT      ; GO BACK AGAIN 
  924. QE2:     MOV       A,@R1     ; GET DATA 
  925.          MOV       @R0,A     ; PUT ON QUEUE 
  926.          INC       R0        ; INC DEST PTR 
  927.          INC       R1        ; INC SOURCE PTR 
  928.          DJNZ      R6,QE1    ; GO BACK TIL DONE 
  929.          MOV       A,R0      ; GET DEST PTR 
  930.          MOV       R3,A      ; STORE AS NEW EOQ 
  931. ;;
  932. ;;    PREPARE TO RETURN TO MAIN PROGRAM 
  933. ;;
  934. EXIT:    CLR       SWD.0     ; CLEAR OVERFLOW ERROR BIT 
  935.          POP       PSW
  936.          POP       ACC       ; RESTORE THE AC 
  937.          SETB      EA        ; ENABLE ALL INTERRUPTS     
  938.          RETI                ; GO BACK TO IDLE LOOP 
  939. ;;
  940. ;;  OPERATING SYSTEM SUBROUTINES
  941. ;;
  942. ;;
  943. OUTCHAR: NOP       ; REDIRECT TO OUTCHRI, THE INTERNAL PORT 
  944. OUTCHRI: NOP       ;(A,R0,R6) 
  945. ;;
  946. ;;  THIS SUBROUTINE ACCEPTS A CHARACTER PASSED VIA THE AC 
  947. ;;     AND TRANSMITS IT VIA THE INTERNAL SERIAL PORT TO HOST
  948. ;;
  949. OI1:     JB        SENSR.2,OI2 ; CHECK THE READY FLAG 
  950.          JNB       TI,OI1    ; WAIT FOR TI FLAG 
  951. OI2:     MOV       SBUF,A    ; SEND THE DATA
  952.          CLR       TI        ; CLEAR THE TI FLAG
  953.          CLR       SENSR.2   ; CLEAR THE TRANS RDY FLAG 
  954. OI4:     RETI 
  955. ;;
  956. ;;
  957. ;;  COPYRIGHT MESSAGE FOR ROM 
  958. ;;
  959.          DB        "COPYRIGHT 1984, J.HERZOG, J EBNER"
  960.          RETI                 ; DUMMY RETURN
  961. ;;
  962. ;;
  963. GETCHAR: NOP                 ; REDIRECT FROM GETCHAR
  964. GETCHRI: NOP
  965. ;;  THIS SUBROUTINE GETS A CHARACTER FROM THE INTERNAL
  966. ;;  SERIAL PORT AND RETURNS IN IN THE AC
  967. ;;
  968.          MOV      A,SBUF     ; GET THE CHARACTER
  969.          CLR      RI         ; CLEAR THE INT FLAG 
  970.          RETI 
  971. ;;
  972. INIT:    NOP       ;RB1:(A,R0,R2,R3,R4,R7,F0,F1)
  973. ;;
  974. ;;   INITIALIZE THE RAM AND PORTS FOR THE OP SYS
  975. ;;
  976.          MOV       PSW,#RB3  ; SELECT REG BANK 3
  977.          MOV       IE,#00H   ; DISABLE THE INTERRUPTS 
  978.          CLR       A         ; CLEAR THE ACC
  979.          MOV       R0,#50H
  980.          MOV       R6,#30H
  981. T01:     MOV       @R0,A     ; CLEAR A MEMORY LOCATION
  982.          INC       R0        ; PT TO NEXT LOCATION
  983.          DJNZ      R6,T01    ; GO BACK TILL DONE
  984.          MOV       R2,#BOQ   ; SET UP BEGIN OF QUE PTR
  985.          MOV       R3,#BOQ   ; SET UP END OF QUE PTR
  986.          MOV       R4,#HCP   ; SET UP COMMAND PKT PTR 
  987.          MOV       R0,#LED   ; LED ADDRESS
  988.          MOV       A,#00H    ; PUT FF IN THE AC 
  989.          MOVX      @R0,A     ; TURN ON THE LED, OFF THE BUZZER
  990.          MOV       P1,#0FFH  ; PUT "FF" ON PORT 1 
  991.          MOV       P2,#0FFH  ; PUT "FF" ON PORT 2 
  992. ;;
  993. ;;   INITIALIZE TIMER 0 (TIMEOUT) TIMER 1 (SERIAL BAUD RATE)
  994. ;;   INITIALIZE INTERNAL SERIAL PORT
  995. ;;
  996.          MOV       TMOD,#21H ; CNTR 1 FOR UART/CNTR 0 FOR TIMEOUT
  997.          MOV       TH1,#0FEH ; 9600 BAUD
  998.          MOV       TL1,#0FEH ; 9600 BAUD
  999.          MOV       TCON,#40H ; START TIMER #1 
  1000.          MOV       TH0,#10H  ; PRESET TIMER CONSTANT
  1001.          MOV       TL0,#00H  ; PRESET TIMER CONSTANT
  1002.          MOV       SCON,#52H ; REC &TRAN ENABLED, SET TRANS FLAG
  1003.          CLR       TI        ; CLEAR THE TRANSMITTER FLAG 
  1004.          SETB      SENSR.2   ; SET TRAMSMIT RDY FLAG
  1005.          CLR       A         ; CLEAR THE ACC
  1006.          RETI 
  1007. ;;
  1008. ;;  DUMMY SUBROUTINE
  1009. ;;
  1010. DUMMY:   RETI                ; FOR CLEARING INTERRUPT 
  1011. ;;
  1012. ;;
  1013. HEXASC:  NOP       ;(A) 
  1014. ;;
  1015. ;;   CONVERTS A XEXADECIMAL CHARACTER TO ASCII
  1016. ;;
  1017.          ANL       A,#0FH    ; GET LS NIBBLE
  1018.          ORL       A,#30H    ; CREATE ASCII 
  1019.          JB        ACC.3,HC4 ; TEST FOR 8 - F 
  1020.          AJMP      HC6       ; JUMP IF NOT 8-F
  1021. HC4:     JB        ACC.2,HC5 ; CORRECTION NEEDED
  1022.          JB        ACC.1,HC5 ; CORRECTION NEEDED
  1023.          AJMP      HC6       ; 8 OR 9, NO CORRECTION
  1024. HC5:     ADD       A,#07     ; CORRECT FOR A-F
  1025. HC6:     RET                 ; ALL DONE 
  1026. ;;
  1027. SENDASC: NOP       ;(A,R0,R5,R6)
  1028. ;;
  1029. ;;
  1030. ;;       TAKES A HEXADECIMAL CHARACTER, CONVERTS IT TO TWO
  1031. ;;       ASCII CHARACTERS AND SENDS THEM TO THE HOST
  1032. ;;
  1033.          MOV       R5,A      ; TEMP STORE OF DATA 
  1034.          SWAP      A         ; GET MS NIBBLE
  1035.          ANL       A,#0FH    ; GET LS NIBBLE
  1036.          ORL       A,#30H    ; CREATE ASCII 
  1037.          JB        ACC.3,HA1 ; TEST FOR 8 - F 
  1038.          AJMP      HA3       ; JUMP IF NOT 8-F
  1039. HA1:     JB        ACC.2,HA2 ; CORRECTION NEEDED
  1040.          JB        ACC.1,HA2 ; CORRECTION NEEDED
  1041.          AJMP      HA3       ; 8 OR 9, NO CORRECTION
  1042. HA2:     ADD       A,#07     ; CORRECT FOR A-F
  1043. HA3:     ACALL     OUTCHAR   ; SEND FIRST CHAR, MSB 
  1044.          MOV       A,R5      ; GET DATA BACK
  1045.          ANL       A,#0FH    ; GET LS NIBBLE
  1046.          ORL       A,#30H    ; CREATE ASCII 
  1047.          JB        ACC.3,HA4 ; TEST FOR 8 - F 
  1048.          AJMP      HA6       ; JUMP IF NOT 8-F
  1049. HA4:     JB        ACC.2,HA5 ; CORRECTION NEEDED
  1050.          JB        ACC.1,HA5 ; CORRECTION NEEDED
  1051.          AJMP      HA6       ; 8 OR 9, NO CORRECTION
  1052. HA5:     ADD       A,#07     ; CORRECT FOR A-F
  1053. HA6:     ACALL     OUTCHAR   ; SEND LSB 
  1054.          RET
  1055. ;;
  1056. QVECTOR: NOP                 ;
  1057. ;;
  1058. ;;       THIS SERVICES A QUEUED TASK
  1059. ;;       THE QVECTOR SUBROUTINE CAUSES A JUMP TO THE
  1060. ;;       PROPER TASK.  IT ASSUMES THE TASK NUMBER IS IN 
  1061. ;;       THE ACCUMULATOR. 
  1062. ;;
  1063. ;;   SET UP THE TIMEOUT REGISTERS (IF USED) 
  1064. ;;
  1065. ;;
  1066.          JNB       SENSR.3,VR1   ; JUMP IF TIMEOUT NOT ACTIVE 
  1067.          PUSH      ACC       ; PUT ACC ON STACK 
  1068.          MOV       PSW,#RB2  ; USE RB2 FOR TIMER ACTIONS
  1069.          MOV       A,R5      ; GET HI BYTE OF CONSTANT 
  1070.          MOV       R2,A      ; SET UP HI BYTE OF COUNTER 
  1071.          MOV       A,R6      ; GET MID BYTE OF CONSTANT 
  1072.          MOV       R3,A      ; SET UP MID BYTE OF COUNTER 
  1073.          MOV       A,R7      ; GET LO BYTE OF CONSTANT
  1074.          MOV       R4,A      ; SET UP LO BYTE OF COUNTER
  1075.          POP       ACC       ; GET ACC BACK 
  1076.          MOV       PSW,#RB3  ; USE RB3
  1077. VR1:     ANL       A,#7FH    ; MAKE SURE LEADING BIT IS A 0 
  1078.          MOV       R7,A      ; TEMP STORE 
  1079.          RL        A         ; MULT BY 2
  1080.          ADD       A,R7      ; MULT BY 3
  1081.          MOV       PSW,#RB0  ; USE RB0 FOR QUEUED TASKS
  1082.          MOV       TH0,#10H  ; SET UP HIGH COUNT OF COUNTER 0
  1083.          MOV       TL0,#00H  ; CLEAR LOW COUNT OF COUNTER 0 
  1084.          SETB      TR0       ; START TIMER 0
  1085.          SETB      ET0       ; ENABLE TIMER 0 INTERRUPT
  1086.          SETB      ES        ; ENABLE SERIAL INTERRUPT
  1087.          MOV       DPTR,#TABT; DISPLACEMENT FOR TASK TABLE
  1088.          JMP       @A+DPTR   ; VECTOR TO TASK 
  1089. ;;
  1090. IVECTOR: NOP
  1091. ;;
  1092. ;;   VECTOR TO THE TASK (ENTRY POINT FOR AN IMMEDIATE TASK) 
  1093. ;;
  1094.          ANL       A,#7FH    ; MAKE SURE LEADING BIT IS A 0 
  1095.          MOV       R7,A      ; TEMP STORE 
  1096.          RL        A         ; MULT BY 2
  1097.          ADD       A,R7      ; MULT BY 3
  1098.          MOV       PSW,#RB1  ; USE RB1 FOR IMMED TASK
  1099.          SETB      ES        ; ENABLE SERIAL INTERRUPT 
  1100.          MOV       DPTR,#TABT; DISPLACEMENT FOR TASK TABLE
  1101.          JMP       @A+DPTR   ; VECTOR TO TASK 
  1102. ;;
  1103. ;;   MEMORY BANK 0 TASKS
  1104. ;;
  1105. ;;   VOLUME I:  QUEUE MANAGEMENT AND UTILITY TASKS
  1106. ;;
  1107. TABT:    LJMP       TASK0     ; RSET :RESET THE TASK-MASTER 
  1108.          LJMP       TASK1     ; CLRQ :CLEAR THE QUEUE 
  1109.          LJMP       TASK2     ; ABRT :ABORT THE CURRENT TASK
  1110.          LJMP       TASK3     ; SYNC :START A SYNC TASK FROM QUEUE
  1111.          LJMP       TASK4     ; PAUS :PAUSE IN THE CURRENT TASK 
  1112.          LJMP       TASK5     ; RESM :RESUME A PAUSED TASK
  1113.          LJMP       TASK6     ; TIME :SET THE TIMEOUT REGISTER
  1114.          LJMP       TASK7     ; NULL :NULL TASK 
  1115.          LJMP       TASK8     ; INFT :TASK WITH INFINITE LOOP 
  1116.          LJMP       TASK9     ; DUMP :CONTENTS OF TASK QUE TO HOST
  1117.          LJMP       TASKA     ; POLL :POLL THE UNITS
  1118.          LJMP       TASKB     ; HTOM :HOST TO DATA MEM TRANSFER 
  1119.          LJMP       TASKC     ; MTOH :DATA MEM TO HOST TRANSFER 
  1120.          LJMP       TASKD     ; HTOX :HOST TO EXTERNAL MEM
  1121.          LJMP       TASKE     ; XTOH :EXTERNAL MEM TO HOST
  1122.          LJMP       TASKF     ; SLAP :SENSTITZE ASYNC PORT
  1123.          LJMP       TASK10    ; DLAP :DESENSITIZE ASYNC PORT
  1124.          LJMP       TASK11    ; SLPP :SENSITIZE PARALLEL PORT 
  1125.          LJMP       TASK12    ; DLPP :DESENSITIZE PARALLEL PORT 
  1126.          LJMP       TASK13    ; DLAY :TIME DELAY
  1127.          LJMP       TASK14    ; BEEP :AUDIO SIGNAL
  1128.          LJMP       TASK15    ; BLNK :FRIENDLY BLINK OF LED 
  1129.          LJMP       TASK16    ; KLIK :CLICKING NOISE
  1130.          LJMP       TASK17    ; P1TH :PORT 1 TO HOST DATA TRANS 
  1131.          LJMP       TASK18    ; HTP1 :HOST TO PORT 1 DATA TRANS 
  1132.          LJMP       TASK19    ; P2TH :PORT 2 TO HOST DATA TRANS 
  1133.          LJMP       TASK1A    ; HTP2 :HOST TO PORT 2 DATA TRANS 
  1134.          LJMP       TASK1B    ; INT0 :T0 TO HOST TRANSFER 
  1135.          LJMP       TASK1C    ; INT1 :T1 TO HOST TRANSFER 
  1136.          LJMP       TASK1D    ; ASPT :ACTIVE STIM PROGRAM 
  1137.          LJMP       TASK1E    ; SPARE 
  1138.          LJMP       TASK1F    ; SPARE 
  1139. ;;
  1140. ;;    VOLUME II  :  INPUT/OUTPUT TASKS
  1141. ;;
  1142.          LJMP       TASK20    ; PARP :PARALLEL PORT 
  1143.          LJMP       TASK21    ; DPT1 ;8 BIT DATA PORT #1
  1144.          LJMP       TASK22    ; DPT2 :8 BIT DATA PORT #2
  1145.          LJMP       TASK23    ; DPT3 ;4 BIT DATA PORT #3
  1146.          LJMP       TASK24    ; DPT4 ;4 BIT DATA PORT #4
  1147.          LJMP       TASK25    ; SSPT :4 BIT SWITCH SENSE PORT 
  1148.          LJMP       TASK26    ; RLPT :4 BIT RELAY PORT
  1149.          LJMP       TASK27    ; HTOQ :HOST TO DATA QUEUE
  1150.          LJMP       TASK28    ; QTOH :DATA QUEUE TO HOST
  1151.          LJMP       TASK29    ; BEEP :BEEP (REPEAT) 
  1152.          LJMP       TASK2A    ; BLNK :BLINK (REPEAT)
  1153.          LJMP       TASK2B    ; SPARE 
  1154.          LJMP       TASK2C    ; SPARE 
  1155.          LJMP       TASK2D    ; LPTH :LOCAL ASYNC PORT TO HOST
  1156.          LJMP       TASK2E    ; SERP :SERIAL PORT 
  1157.          LJMP       TASK2F    ; DECP :DECREMENT LOC AND PAUSE ON 0
  1158.          LJMP       TASK30    ; PRAR :POLL,REPORT AND RESUME
  1159.          LJMP       TASK31    ;      :SPARE 
  1160.          LJMP       TASK32    ;      :SPARE 
  1161.          LJMP       TASK33    ;      :SPARE 
  1162.          LJMP       TASK34    ;      :SPARE 
  1163.          LJMP       TASK35    ;      :SPARE 
  1164.          LJMP       TASK36    ;      :SPARE 
  1165.          LJMP       TASK37    ;      :SPARE 
  1166. ;;
  1167. ;;    VOLUME III :  APPLICATION TASKS 
  1168. ;;
  1169.          LJMP       TASK38    ; EVNT :UPDATE THE EVENT REGISTER 
  1170.          LJMP       TASK39    ; WFEV :WAIT FOR EVENT, THEN ABORT
  1171.          LJMP       TASK3A    ;      :SPARE 
  1172.          LJMP       TASK3B    ;      :SPARE 
  1173.          LJMP       TASK3C    ;      :SPARE 
  1174.          LJMP       TASK3D    ;      :SPARE 
  1175.          LJMP       TASK3E    ;      :SPARE 
  1176.          LJMP       TASK3F    ;      :SPARE 
  1177. ;;    VOLUME IV  :  APPLICATION TASKS FOR SPECIALIZED HARDWARE
  1178. ;;
  1179.          LJMP       TASK40    ; TALK :DIGITALK SUPPORT
  1180.          LJMP       TASK41    ;      :SPARE 
  1181.          LJMP       TASK42    ;      :SPARE 
  1182.          LJMP       TASK43    ;      :SPARE 
  1183.          LJMP       TASK44    ;      :SPARE 
  1184.          LJMP       TASK45    ;      :SPARE 
  1185.          LJMP       TASK46    ;      :SPARE 
  1186.          LJMP       TASK47    ;      :SPARE 
  1187.          LJMP       TASK48    ;      :SPARE 
  1188.          LJMP       TASK49    ;      :SPARE 
  1189.          LJMP       TASK4A    ;      :SPARE 
  1190.          LJMP       TASK4B    ;      :SPARE 
  1191.          LJMP       TASK4C    ;      :SPARE 
  1192.          LJMP       TASK4D    ;      :SPARE 
  1193.          LJMP       TASK4E    ;      :SPARE 
  1194.          LJMP       TASK4F    ;      :SPARE 
  1195. ;;
  1196. ;;
  1197. TASK0:   CLR       EA        ; DISABLE THE INTERRUPTS
  1198. ;;
  1199. ;;   RSET   :SYSTEM RESET 
  1200. ;;
  1201.          MOV       R0,#SWD   ; ADDRESS OF STATUS WORD 
  1202.          MOV       @R0,#00H  ; CLEAR THE STATUS WORD
  1203.          CLR       TR0       ; STOP TIME-OUT CLOCK
  1204.          CLR       ET0       ; DISABLE TIME-OUT INTERRUPT
  1205.          LJMP      START     ; GO BACK TO STARTUP PROCEEDURE
  1206.          RETI                ; DUMMY SUBROUTINE RETURN
  1207. ;;
  1208. TASK1:   NOP
  1209. ;;
  1210. ;;    CLRQ  : 
  1211. ;;
  1212.          MOV       PSW,#RB3  ; USE OP SYSTEM REG BANK
  1213.          JB        SWD.5,T11 ; JUMP IF SOMETHING ON THE QUEUE
  1214.          RETI                ; RETURN IF NO TASK RUNNING 
  1215. T11:     MOV       SWD,#00H  ; CLEAR THE STATUS WORD 
  1216.          MOV       A,R3      ; GET EOQ
  1217.          SUBB      A,#BOQ    ; GET LENGTH OF QUEUE
  1218.          MOV       R3,A      ; SET UP A COUNTER
  1219.          MOV       A,#00H    ; CLEAR THE ACC
  1220.          MOV       R0,#BOQ   ; SET UP A PTR TO QUEUE
  1221. T12:     MOV       @R0,A     ; CLEAR A LOCATION
  1222.          INC       R0        ; INCREMENT THE POINTER
  1223.          DJNZ      R3,T12    ; GO BACK TIL DONE   
  1224.          MOV       R2,#BOQ   ; RESET START OF QUE
  1225.          MOV       R3,#BOQ   ; RESET END OF QUEUE
  1226.          MOV       R4,#HCP   ; RESET THE HCP POINTER 
  1227.          MOV       SP,#SOS+2 ; ALTER THE SP
  1228.          CLR       TR0       ; STOP TIME-OUT CLOCK
  1229.          CLR       ET0       ; DISABLE TIME-OUT INTERRUPT
  1230.          RETI                ; GO BACK 
  1231. ;;
  1232. TASK2:   NOP
  1233. ;;
  1234. ;;    ABRT  : AN ADDRESSED ABORT
  1235. ;;
  1236.          MOV       PSW,#RB3  ; USE REG BANK 3 
  1237.          JB        SWD.5,T101; JUMP IF QUEUED TASK IS RUNNING 
  1238.          RETI                ; RETURN 
  1239. T101:    CLR       SWD.5     ; CLEAR QUEUED TASK RUN BIT
  1240.          CLR       SWD.6     ; CLEAR IMMED TASK RUN BIT 
  1241.          MOV       R4,#HCP   ; RESET POINTER
  1242.          MOV       SP,#SOS+2 ; RESET THE SP
  1243.          CLR       TR0       ; STOP TIME-OUT CLOCK
  1244.          CLR       ET0       ; DISABLE TIME-OUT INTERRUPT
  1245.          RETI                ; GO BACK
  1246. ;;
  1247. TASK3:   NOP
  1248. ;;
  1249. ;;   SYNC  :ADVANCE/SYNCHRONIZE 
  1250. ;;
  1251.          MOV       PSW,#RB3  ; USE RB3
  1252.          MOV       A,R2      ; GET THE BOQ PTR
  1253.          INC       A         ; PT TO THE STATUS WORD
  1254.          MOV       R1,A      ; SET UP R1 AS PTR 
  1255.          MOV       A,@R1     ; GET THE STATUS WORD
  1256.          ANL       A,#0CFH   ; PUT 00 IN BITS 5,4 
  1257.          ORL       A,#10H    ; PUT 01 IN BITS 5,4 
  1258.          MOV       @R1,A     ; RESTORE THE STATUS WORD
  1259.          RETI                ; GO BACK
  1260. ;;
  1261. TASK4:   NOP
  1262. ;;
  1263. ;;   PAUS  :PAUSE THE TASK (IMMEDIATE ONLY) 
  1264. ;;
  1265.          SETB      SWD.1     ; SET THE PAUSE BIT
  1266.          RETI 
  1267. ;;
  1268. TASK5:   NOP
  1269. ;;
  1270. ;;   RESM  :RESUME THE TASK (IMMEDIATE ONLY)
  1271. ;;
  1272.          CLR       SWD.1     ; CLEAR THE PAUSE BIT
  1273.          RETI                ; GO BACK
  1274. TASK6:   NOP
  1275. ;;
  1276. ;;     TIME  :LOAD THE TIME OUT REGISTERS 
  1277. ;;
  1278.          CLR       TR0       ; STOP THE CLOCK
  1279.          MOV       A,R2      ; GET THE BOQ PTR
  1280.          ADD       A,#02H    ; POINT TO 1ST ARG (HI BYTE) 
  1281.          MOV       R0,A      ; SET UP THE POINTER 
  1282.          MOV       R1,#15H   ; POINTER TO HIGH TIME OUT CONSTANT 
  1283.          MOV       R6,#03H   ; SET UP COUNTER 
  1284.          CLR       SENSR.3   ; DISABLE TIMEOUT
  1285. TE1:     MOV       A,@R0     ; GET THE DATA 
  1286.          CJNE      A,#00H,TE3 ; CHECK IF NOT 0
  1287.          AJMP      TE4       ; 
  1288. TE3:     SETB      SENSR.3   ; THERE IS A NON ZERO VALUE
  1289. TE4:     CPL       A         ; COMPLEMENT THE COUNT 
  1290.          MOV       @R1,A     ; STORE THE DATA IN TOC
  1291.          INC       R0        ; INC THE POINTER
  1292.          INC       R1        ; INC THE POINTER
  1293.          DJNZ      R6,TE1    ; GO BACK IF NOT DONE
  1294.          RETI 
  1295. ;;
  1296. TASK7:   NOP
  1297. ;;
  1298. ;;    NULL  :NULL TASK
  1299. ;;
  1300.          NOP
  1301.          RETI 
  1302. ;;
  1303. TASK8:   NOP
  1304. ;;
  1305. ;;    INFT  : NON-TERMINIATING TASK 
  1306. ;;
  1307.          SETB      EA         ; ENABLE ALL INTERRUPTS
  1308. T81:     AJMP      T81        ; STAY IN JUMP LOOP 
  1309.          CLR       EA         ; DISABLE THE INTERRUPT 
  1310.          RETI 
  1311. ;;
  1312. TASK9:   NOP       ;(A,R1,R4,) [GETCHAR]
  1313. ;;
  1314. ;;   DUMP  :OUTPUT THE TASK QUEUE 
  1315. ;;
  1316.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1317.          MOV       A,#"["    ; START OF PACKET CHAR 
  1318.          LCALL     OUTCHAR   ; SEND IT
  1319.          MOV       R1,#50H   ; SET PTR TO START OF TASK QUEUE 
  1320.          MOV       R7,#30H   ; SET UP COUNTER 
  1321. T82:     MOV       A,@R1     ; GET THE DATA 
  1322.          LCALL     SENDASC   ; SEND TO THE HOST IN ASCII
  1323.          INC       R1        ; INCREMENT THE POINTER
  1324.          DJNZ      R7,T82    ; LOOP BACK TILL DONE
  1325.          MOV       A,#"]"    ; END OF PACKET CHARACTER
  1326.          LCALL     OUTCHAR   ; SEND TO HOST 
  1327.          CLR       EA        ; DISABLE INTERRUPTS
  1328.          RETI                ; GO BACK
  1329. ;;
  1330. TASKA:   NOP
  1331. ;;
  1332. ;;    POLL  : IDENTIFY UNIT TO HOST 
  1333. ;;
  1334.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1335.          MOV       A,#"["    ; FIRST CHAR FOR PACKET
  1336.          LCALL     OUTCHAR   ; SEND "[" 
  1337.          MOV       R1,#TAS   ; PTR TO ADDRESS 
  1338.          MOVX      A,@R1     ; GET THE ADDRESS
  1339.          LCALL     SENDASC   ; SEND THE TWO ASCII CHARACTERS
  1340.          MOV       A,#" "    ; BLANK CHARACTER FOR DELIMITER
  1341.          LCALL     OUTCHAR   ; SEND " " 
  1342.          MOV       R1,#EVENT ; PTR TO EVENT REGISTER
  1343.          MOV       A,@R1     ; GET EVENT REGISTER 
  1344.          LCALL     SENDASC   ; SEND THE TWO ASCII CHARACTERS
  1345.          MOV       A,#"]"    ; END OF PACKET CHAR 
  1346.          LCALL     OUTCHAR   ; SEND "]" 
  1347.          CLR       EA        ; DISABLE INTERRUPTS
  1348.          RETI 
  1349. ;;
  1350. ;;
  1351. TASKB:   NOP       ; (A,R0,P1)
  1352. ;;
  1353. ;;    HTOM : HOST DATA TO MEMORY: ARG 1 = ADDRESS, ARG 2 = DATA 
  1354. ;;
  1355. ;;
  1356.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1357.          MOV       A,R2      ; GET QUEUE PTR
  1358.          ADD       A,#02H    ; GET PTR TO DATA DEST PTR 
  1359.          MOV       R0,A      ; SET UP PTR TO DATA DEST PTR
  1360.          MOV       A,@R0     ; GET DEST PTR 
  1361.          MOV       R1,A      ; SET UP PTR TO DATA DEST
  1362.          INC       R0        ; SET UP PTR TO DATA 
  1363.          MOV       A,@R0     ; GET THE DATA 
  1364.          MOV       @R1,A     ; WRITE TO DATA MEMORY 
  1365.          CLR       EA        
  1366.          RETI                ; ALL DONE 
  1367. ;;
  1368. ;;
  1369. TASKC:   NOP       ; (A,R0,P1)
  1370. ;;
  1371. ;;    MTOH: MEMORY DATA TO HOST, ARG1 = ADDRESS 
  1372. ;;
  1373.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1374.          MOV       A,#"["    ; START OF PACKET CHARACTER
  1375.          LCALL     OUTCHAR   ; SEND "[" 
  1376.          MOV       A,R2      ; GET  QUEUE PTR 
  1377.          ADD       A,#02     ; GET ADDRESS OF PTR 
  1378.          MOV       R0,A      ; SET UP PTR TO DATA PTR 
  1379.          MOV       A,@R0     ; GET THE PTR TO DATA
  1380.          MOV       R0,A      ; SET UP PTR TO DATA 
  1381.          MOV       A,@R0     ; GET THE DATA 
  1382.          LCALL     SENDASC   ; SEND TO THE HOST 
  1383.          MOV       A,#"]"    ; END OF PACKET CHARACTER
  1384.          LCALL     OUTCHAR   ; SEND "]" 
  1385.          CLR       EA      
  1386.          RETI                ; ALL DONE 
  1387. ;;
  1388. TASKD:   NOP       ; (A,R0,R1,P1) 
  1389. ;;
  1390. ;;    HTOX : WRITE DATA TO EXTERNAL ADDRESS SPACE,
  1391. ;;           ARG 1 = ADDRESS, ARG 2 = DATA
  1392. ;;
  1393.          SETB      EA        ; ENABLE ALL INTERRUPTS       
  1394.          MOV       PSW,#RB0  ; SELECT RB0 
  1395.          MOV       A,R2      ; GET QUEUE PTR
  1396.          ADD       A,#02H    ; GET PTR TO DATA DEST PTR 
  1397.          MOV       R0,A      ; SET UP PTR TO DATA DEST PTR
  1398.          MOV       A,@R0     ; GET DEST PTR 
  1399.          MOV       R1,A      ; SET UP PTR TO DATA DEST
  1400.          MOV       A,R0      ; SET UP PTR TO DATA 
  1401.          INC       A
  1402.          ANL       A,#0DFH   ; ADJUST FOR OVERFLOW
  1403.          MOV       R0,A 
  1404.          MOV       A,@R0     ; GET THE DATA 
  1405.          MOVX      @R1,A     ; WRITE TO EXT ADD SPACE 
  1406.          CLR       EA      
  1407.          RETI                ; ALL DONE 
  1408. ;;
  1409. TASKE:   NOP                 ;
  1410. ;;
  1411. ;;    XTOH : EXTERNAL ADDRESS SPACE TO HOST; ARG 1 = ADDRESS
  1412. ;;
  1413.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1414.          MOV       A,#"["    ; START OF PACKET CHARACTER
  1415.          ACALL     OUTCHAR   ; SEND "["
  1416.          MOV       A,R2      ; GET  QUEUE PTR 
  1417.          ADD       A,#02     ; GET ADDRESS OF PTR 
  1418.          MOV       R0,A      ; SET UP PTR TO DATA PTR 
  1419.          MOV       A,@R0     ; GET THE PTR TO DATA
  1420.          MOV       R0,A      ; SET UP PTR TO DATA 
  1421.          MOVX      A,@R0     ; GET THE DATA 
  1422.          ACALL     SENDASC   ; SEND TO THE HOST
  1423.          MOV       A,#"]"    ; END OF PACKET CHARACTER
  1424.          ACALL     OUTCHAR   ; SEND "]"
  1425.          CLR       EA       
  1426.          RETI                ; ALL DONE 
  1427. ;;
  1428. TASKF:   NOP
  1429. ;;
  1430. ;;   SLAP  :  SENSITIZE THE SYSTEM SO THAT INFORMATION NOT
  1431. ;;         :  WITHIN {  } IS SENT TO THE ASYNC OUTPUT PORT
  1432. ;;
  1433.          MOV       R0,#SENSR ; ADDRESS OF SENS REG
  1434.          MOV       A,@R0     ; GET THE STATUS 
  1435.          ORL       A,#80H    ; SET THE SENSITIZE BIT
  1436.          MOV       @R0,A     ; RESTORE THE STATUS 
  1437.          CLR       EA     
  1438.          RETI 
  1439. ;;
  1440. TASK10:  NOP                 ; WHY DOES THIS GET DELETED
  1441. ;;
  1442. ;;   DLAP  :  DESENSITIZE THE LOCAL ASYNC PORT SO THAT IT 
  1443. ;;         :  NO LONGER ACCEPTS DATA
  1444. ;;
  1445.          MOV       IE,#00H   ;
  1446.          MOV       R0,#SENSR ; ADDRESS OF SENS REG
  1447.          MOV       A,@R0     ; GET THE STATUS 
  1448.          ANL       A,#07FH   ; CLEAR THE SENSITIZE BIT
  1449.          MOV       @R0,A     ; RESTORE THE STATUS 
  1450.          MOV       IE,#00H
  1451.          RETI 
  1452. ;;
  1453. TASK11:  NOP       ;
  1454. ;;
  1455. ;;   SLPP  :  SENSITIZE THE PARALLEL PRINTER PORT 
  1456. ;;
  1457.          MOV       R0,#SENSR ; ADDRESS OF SENS REG
  1458.          MOV       A,@R0     ; GET THE STATUS 
  1459.          ORL       A,#20H    ; SET THE SENSITIZE BIT
  1460.          MOV       @R0,A     ; RESTORE THE STATUS 
  1461.          MOV       IE,#00H
  1462.          RETI 
  1463. ;;
  1464. TASK12:  NOP       ;
  1465. ;;
  1466. ;;   DLPP  :  DESENSITIZE THE PARALLEL PRINTER PORT 
  1467. ;;
  1468.          MOV       R0,#SENSR ; ADDRESS OF SENS REG
  1469.          MOV       A,@R0     ; GET THE STATUS 
  1470.          ANL       A,#0DFH   ; CLEAR THE SENSITIZE BIT
  1471.          MOV       @R0,A     ; RESTORE THE STATUS 
  1472.          RETI 
  1473. ;;
  1474. TASK13:  MOV       PSW,#RB0  ; (A,R0,R5,R6,R7)
  1475. ;;
  1476. ;;    DLAY  :TIME DELAY 
  1477. ;;
  1478.          MOV       IE,#92H   ;ENABLE THE INTERRUPT
  1479.          MOV       R6,#00    ; SET COUNT IN R6
  1480.          MOV       R7,#00    ; SET COUNT IN R7
  1481.          MOV       A,R2      ; GET QUEUE PTR
  1482.          ADD       A,#02H    ; GET ADDR OF 1ST ARG
  1483.          MOV       R0,A      ; SET PTR TO 1ST ARG 
  1484.          MOV       A,@R0     ; GET 1ST ARG
  1485.          MOV       R5,A      ; STORE REPITITION NUMBER
  1486. T111:    DJNZ      R7,T111   ; COUNT DOWN R7
  1487.          DJNZ      R6,T111   ; COUNT DOWN R6
  1488.          DJNZ      R5,T111   ; COUNT DOWN R5
  1489.          MOV       IE,#00H
  1490.          RETI                ; ALL DONE 
  1491. ;;
  1492. TASK14:  NOP       ;RB0:(A,R0,R6,R7,P1,P2,LED)
  1493. ;;
  1494. ;;   BEEP   :BEEP THE BUZZER
  1495. ;;
  1496.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1497.          MOV       PSW,#RB0  ; SELECT RB 0
  1498.          MOV       R0,#LED   ; ADDRESS OF THE LED 
  1499.          MOV       R5,#20H   ; NUMBER OF BEEPS
  1500.          MOV       A,#00H    ; BEEP CHARACTER 
  1501. TFQ:     MOVX      @R0,A     ; BEEP BUY DON'T BLINK 
  1502.          MOV       R6,#30H   ; SET UP DELAY COUNTER 
  1503.          MOV       R7,#00H   ; SET UP DELAY COUNTER 
  1504. TF2:     DJNZ      R7,TF2    ; STAY TILL 0
  1505.          DJNZ      R6,TF2    ; GO BACK TILL 0 
  1506.          XRL       A,#02H    ; TOGGLE THE BEEP CHARACTER
  1507.          DJNZ      R5,TFQ 
  1508.          MOV       IE,#00H
  1509.          RETI                ; ALL DONE 
  1510. ;;
  1511. TASK15:  NOP       ;RB0:(A,R0,R6,R7,P1,P2,LED)
  1512. ;;
  1513. ;;   BLNK   :BLINK THE LED
  1514. ;;
  1515. BLNKN    EQU       10H       ; THE NUMBER OF BLINKS 
  1516.          SETB      EA        ; ENABLE ALL INTERRUPTS
  1517.          MOV       R0,#LED   ; ADDRESS OF THE LED 
  1518.          MOV       A,#BLNKN  ; GET THE BLINK NUMBER 
  1519.          JZ        TA3       ; GO BACK IF NO BLINKS 
  1520.          MOV       R5,A      ; NUMBER OF BLINKS 
  1521.          MOV       A,#03H    ; BLINK CHARACTER
  1522. TA1:     MOVX      @R0,A     ; BLINK BUT DON'T BEEP 
  1523.          MOV       R6,#50H   ; SET UP DELAY COUNTER 
  1524.          MOV       R7,#00H   ; SET UP DELAY COUNTER 
  1525. TA2:     DJNZ      R7,TA2    ; STAY TILL 0
  1526.          DJNZ      R6,TA2    ; GO BACK TILL 0 
  1527.          XRL       A,#01H    ; TOGGLE THE BLINK CHARACTER 
  1528.          DJNZ      R5,TA1 
  1529. TA3:     CLR       EA        ; DISABLE THE INTERRUPTS 
  1530.          RETI                ; ALL DONE 
  1531. ;;
  1532. TASK16:  NOP
  1533. ;;
  1534. ;;   KLIK :   SHORT CLICKING SOUND
  1535. ;;
  1536.          MOV       IE,#90H   ;ENABLE THE INTERRUPT
  1537.          MOV       R0,#LED   ; ADDRESS OF THE LED 
  1538.          MOV       A,#00H    ; BEEP CHARACTER 
  1539.          MOVX      @R0,A     ; BEEP BUT DON'T BLINK 
  1540.          MOV       R6,#50H   ; SET UP DELAY COUNTER 
  1541.          MOV       R7,#00H   ; SET UP DELAY COUNTER 
  1542. T161:    DJNZ      R7,T161   ; STAY TILL 0
  1543.          DJNZ      R6,T161   ; GO BACK TILL 0 
  1544.          XRL       A,#02H    ; TOGGLE THE BEEP CHARACTER
  1545.          MOVX      @R0,A     ; TURN OFF BEEP
  1546.          MOV       IE,#00H
  1547.          RETI                ; ALL DONE 
  1548. ;;
  1549. TASK17:  NOP
  1550. ;;
  1551. ;;  P1TH   :  PORT 1 TO HOST
  1552. ;;
  1553.          MOV       IE,#90H   ;ENABLE THE INTERRUPT
  1554.          MOV       A,#"["    ; START BRACKET
  1555.          ACALL     OUTCHAR   ; SEND BRACKET 
  1556.          MOV       A,P1      ; GET THE PORT DATA
  1557.          ACALL     SENDASC   ; SEND DATA TO THE HOST
  1558.          MOV       A,#"]"    ; ENDING BRACKET 
  1559.          ACALL     OUTCHAR   ; SEND END BRACKET 
  1560.          MOV       IE,#00H
  1561.          RETI                ; ALL DONE 
  1562. ;;
  1563. TASK18:  NOP
  1564. ;;
  1565. ;;   HTP1  : HOST TO P1 
  1566. ;;
  1567. ;;
  1568.          MOV       IE,#90H         ;ENABLE THE INTERRUPT
  1569.          MOV       A,R2      ; GET QUEUE PTR
  1570.          ADD       A,#02H    ; PT TO ARG 1
  1571.          MOV       R0,A      ; SET UP R0 PTR
  1572.          MOV       A,@R0     ; GET THE DATA BYTE
  1573.          MOV       P1,A      ; LATCH DATA BYTE TO PORT
  1574.          MOV       IE,#00H
  1575.          RETI                ; ALL DONE 
  1576. ;;
  1577. TASK19:  NOP
  1578. ;;
  1579. ;;  P2TH   :  PORT 2 TO HOST
  1580. ;;
  1581.          MOV       IE,#90H         ;ENABLE THE INTERRUPT
  1582.          MOV       A,#"["    ; START BRACKET
  1583.          ACALL     OUTCHAR   ; SEND START BRACKET 
  1584.          MOV       A,P2      ; GET THE PORT DATA
  1585.          ACALL     SENDASC   ; SEND DATA TO HOST
  1586.          MOV       A,#"]"    ; END BRACKET
  1587.          ACALL     OUTCHAR   ; SEND END BRACKET 
  1588.          MOV       IE,#00H
  1589.          RETI                ; ALL DONE 
  1590. ;;
  1591. TASK1A:  NOP
  1592. ;;
  1593. ;;   HTP2  : HOST TO P2 
  1594. ;;
  1595. ;;
  1596.          MOV       IE,#90H         ;ENABLE THE INTERRUPT
  1597.          MOV       A,R2      ; GET QUEUE PTR
  1598.          ADD       A,#02H    ; PT TO ARG 1
  1599.          MOV       R0,A      ; SET UP R0 PTR
  1600.          MOV       A,@R0     ; GET THE DATA BYTE
  1601.          MOV       P2,A      ; LATCH DATA BYTE TO PORT
  1602.          MOV       IE,#00H
  1603.          RETI                ; ALL DONE 
  1604. ;;
  1605. TASK1B:  NOP
  1606. ;;
  1607. ;;    INT0 : VALUE OF T0 TO HOST
  1608. ;;
  1609.          MOV       IE,#90H   ;ENABLE THE INTERRUPT
  1610.          CLR       A         ; CLEAR THE AC 
  1611.          JNB       TCON.1,T241 ; SKIP IF NOT T0 
  1612.          INC       A         ; INC AC IF T0=1 
  1613. T241:    MOV       R7,A      ; STORE THE VALUE
  1614.          MOV       A,#"["    ; AC GETS "["
  1615.          ACALL      OUTCHAR  ; SEND "[" TO HOST 
  1616.          MOV       A,R7      ; GET THE DATA BACK
  1617.          ACALL      SENDASC  ; SEND DATA TO HOST
  1618.          MOV       A,#"]"    ; AC GETS "]"
  1619.          ACALL      OUTCHAR  ; SEND "]" TO HOST 
  1620.          MOV       IE,#00H
  1621.          RETI 
  1622. ;;
  1623. TASK1C:  NOP
  1624. ;;
  1625. ;;    INT1 : VALUE OF T1 TO HOST
  1626. ;;
  1627.          MOV       IE,#90H         ;ENABLE THE INTERRUPT
  1628.          CLR       A
  1629.          JNB       TCON.3,T251 ; SKIP IF NOT T1 
  1630.          INC       A         ; INC IF T1=1
  1631. T251:    MOV       R7,A      ; STORE THE VALUE
  1632.          MOV       A,#"["    ; AC GETS "["
  1633.          ACALL      OUTCHAR  ; SEND "[" TO HOST 
  1634.          MOV       A,R7      ; GET THE DATA BACK
  1635.          ACALL      SENDASC  ; SEND DATA TO HOST
  1636.          MOV       A,#"]"    ; AC GETS "]"
  1637.          ACALL      OUTCHAR   ; SEND "]" TO HOST
  1638.          MOV       IE,#00H
  1639.          RETI 
  1640. TASK1D:  RETI 
  1641. TASK1E:  NOP
  1642. ;    TMOF    : TIMEOUT OFF
  1643.          CLR       SENSR.3   ; TURN OFF TIMEOUT BIT 
  1644.          RETI 
  1645. TASK1F:  NOP
  1646. ;    TMON    : TIMEOUT ON 
  1647.          SETB      SENSR.3   ; TURN ON THE TIMEOUT BIT
  1648.          RETI 
  1649. TASK20   RETI 
  1650. TASK21   RETI 
  1651. TASK22   RETI 
  1652. TASK23   RETI 
  1653. TASK24   RETI 
  1654. TASK25   RETI 
  1655. TASK26   RETI 
  1656. TASK27   RETI 
  1657. TASK28   RETI 
  1658. TASK29   RETI 
  1659. TASK2A   RETI 
  1660. TASK2B   RETI 
  1661. TASK2C   RETI 
  1662. TASK2D   RETI 
  1663. TASK2E   RETI 
  1664. TASK2F   RETI 
  1665. TASK30   RETI 
  1666. TASK31   RETI 
  1667. TASK32   RETI 
  1668. TASK33   RETI 
  1669. TASK34   RETI 
  1670. TASK35   RETI 
  1671. TASK36   RETI 
  1672. TASK37   RETI 
  1673. TASK38   RETI 
  1674. TASK39   RETI 
  1675. TASK3A   RETI 
  1676. TASK3B   RETI 
  1677. TASK3C   RETI 
  1678. TASK3D   RETI 
  1679. TASK3E   RETI 
  1680. TASK3F   RETI 
  1681. TASK40   RETI 
  1682. TASK41   RETI 
  1683. TASK42   RETI 
  1684. TASK43   RETI 
  1685. TASK44   RETI 
  1686. TASK45   RETI 
  1687. TASK46   RETI 
  1688. TASK47   RETI 
  1689. TASK48   RETI 
  1690. TASK49   RETI 
  1691. TASK4A   RETI 
  1692. TASK4B   RETI 
  1693. TASK4C   RETI 
  1694. TASK4D   RETI 
  1695. TASK4E   RETI 
  1696. TASK4F   RETI 
  1697.          END
  1698.