


       NAM MPURLT
       OPT L,P,O,NOG
*MPUTEKIS A REALTIME OPERATING SYSTEM DESIGNED
*TO    RUN ON THE MOTOROLA M6800 MICROPROCESSOR
*WITH  AT LEAST 2K OF MEMORY.  ITS TABLES ARE
*CURRENTLYSET UP TO HANDLE NINETEEN TASKS.
       SPC 1
*WRITTENBY: STEVE B. KITTLESON  RM563  962-2607
*DATE:  8/25/75
       SPC 2
       SPC 2
*      TO RUN EXEC:
*         SET REGISTERS AS FOLLOWS:
*           CC  BR  AR  XR    PC
*           FF  00  00  0000  0100
*         SET SWITCH (ADDED BY USER) ON EVAL. MODULE TO
*             "MPU ECHO INPUT"
*         TYPE G ON TTY
       SPC 2
SFREGA EQU $2D SPECIAL FUNCTION REG ADR
ITRAD1 EQU $41 INTERRUPT REG ADR FOR STA 1
ITRAD2 EQU $B1 INTERRUPT REG ADR FOR STA 2
       SPC 2
       ORG $8004
PIA1AD RMB 1 PIA1 A SIDE DATA
PIA1AC RMB 1 PIA1 A SIDE CONTROL
PIA1BD RMB 1 PIA1 B SIDE DATA
PIA1BC RMB 1 PIA1 B SIDE CONTROL
       ORG $8008
PIA2AD RMB 1 PIA2 A SIDE DATA
PIA2AC RMB 1 PIA2 A SIDE CONTROL
PIA2BD RMB 1 PIA2 B SIDE DATA
PIA2BC RMB 1 PIA2 B SIDE CONTROL
PIA2   EQU PIA2AD
ADRBUS EQU PIA2BD
DATBUS EQU PIA2AD
       SPC 2
       ORG $0
       SPC 1
*THIS  TABLE MUST BE PATCHED WITH TASK ADDRESS
       SPC 1
*          TASK START ADDRESS TABLE 
*          FIRST 8 ITEMS ARE FOR INTERUPT HANDLERS
TSA    FDB TURNOF    0-
       FDB TURNOF 1-
       FDB TURNOF 2-
       FDB TURNOF 3-
       FDB TURNOF 4-
       FDB TURNOF    5-
       FDB TURNOF    6-
       FDB TURNOF    7-
       FDB TURNOF 8-
       FDB ECHO 9- ECHO INPUT TASK
       FDB CTRLA 10- CTRL+A TASK (EXAMPLE)
       FDB TURNOF 11-
       FDB TURNOF 12-
       FDB TURNOF 13-
       FDB TURNOF 14-
       FDB TURNOF 15-
       FDB TURNOF 16-
       FDB TURNOF 17-
       FDB TURNOF 18-
       FDB TURNOF 19- FILLER  DO NOT USE
       SPC 2
*      TASK STATUS TABLE      B7-B0
*          INIT:00010000 INDX BY: TASK #
       SPC 1
*          BIT          FUNCTION
*          ---          --------
*
*           7           NOT USED =0
*           6           NOT USED =0
*           5           WAITING FOR CRT INPUT FLAG =1
*           4           TASK INACTIVE FLAG =1
*           3           XFER IN PROGRESS (TAPE OR CRT)=1
*           2           WAITING FOR CRT HANDLER FLAG =1
*           1           WAITING FOR TAPE HANDLER FLAG =1
*           0           SUSPEND FLAG =1
       SPC 1
TS     RMB 20 TASK STATUS TABLE
       SPC 2
*      STATIONS WAITING FOR SERVICE TABLE  B7-B0
*          INIT: 11111111  INDX BY: TASK #
       SPC 1
*          BIT         FUNCTION
*          ---         --------
*
*           7          NOT USED =1
*           6          NOT USED =1
*           5          NOT USED =1
*           4          NOT USED =1
*           3          STATION 4 WAITING =0
*           2          STATION 3 WAITING =0
*           1          STATION 2 WAITING =0
*           0          STATION 1 WAITING =0
       SPC 1
SWFS   RMB 20 STATIONS WAITING FOR SERVICE
NOTSKS EQU SWFS-TS NUMBER OF TASKS
       SPC 2
*      STATION IN SERVICE TABLE  B7-B0
*            INIT: 00000000  INDX BY: TASK #
       SPC 1
*          BIT         FUNCTION
*          ---         --------
*
*           7          NOT USED =0
*           6          NOT USED =0
*           5          NOT USED =0
*           4          NOT USED =0
*           3          STATION 4 IN SERVICE =1
*           2          STATION 3 IN SERVICE =1
*           1          STATION 2 IN SERVICE =1
*           0          STATION 1 IN SERVICE =1
       SPC 1
SIS    RMB 20 STATION IN SERVICE
       SPC 2
*BIT   MAP TABLE
       SPC 1
B7     EQU  %10000000
B6     EQU  %01000000
B5     EQU  %00100000
B4     EQU  %00010000
B3     EQU  %00001000
B2     EQU  %00000100
B1     EQU  %00000010
B0     EQU  %00000001
       SPC 1
TRA    RMB 40 TASK RESTART ADDRESS
CTP    RMB 2 CURRENT TASK POINTER
DSF    RMB 1 DID SOMETHING FLAG
SPCFNC RMB 1 SPECIAL FUNCTIONS VALUE
SAVX   RMB 2
STAMSK RMB 1 STATION NO. MASK
MSGADR RMB 2 ADR OF OUTPUT MESSAGE
MSGTSK RMB 2 TASK NO. REQUESTING MSG
BITCNT RMB 1 CHAR BIT COUNT
OUTCHR RMB 1 OUTPUT CHAR
NUCHRF RMB 1 NEW CHAR FLAG
INCHAR RMB 1 INPUT CHAR
TSKBUF RMB 2 TASK CHAR BUFFER ADR
CHRBF  RMB 1 CHAR BUF FLAG 1=FULL 0=EMPTY
TSKWOI RMB 2 TASK WAITING ON INPUT
HLDBUF RMB 1 CHAR HOLDING BUFFER
INXTMP RMB 2 INDEX TEMPORARY
OUTPIP RMB 1 OUTPUT IN PROGRESS FLAG 1=N0 0=YES
INPTIP RMB 1 INPUT IN PROGRESS FLAG  DITTO
ECOSRG RMB 1 ECHO STRING
       FCB $07,$04 TONE AND EOM
SAVB   RMB 1
SAVA   RMB 1
       RMB 30 STACK AREA
STACK  RMB 1 1ST LOC OF STACK
       PAGE

*        NAM  INIT
       SPC 1
       ORG $100
       SPC 2
*      HERE TO INITIALIZE AFTER LOADING
       SPC 2
*      SETUP STACK POINTER
       SPC 1
INIT   LDS #STACK
       LDX #PIA1AD X-REG = ADR PIA1A
       LDA A 0,X CLEAR CA1 BIT
       CLR 1,X CLEAR PIA1A CONTROL
       LDA A #%00000001 SET PIA1A DATA DIR
       STA A 0,X
       LDA A #%00000101 SET PIA1A CONTROL
       STA A 1,X
       CLR 3,X CLEAR PIA1B CONTROL
       LDA A #%00000101 SET PIA1B DIR
       STA A 2,X
       LDA A #%00110100 SET PIA1B CONTROL
       STA A 3,X
       LDA A #4 SET BIT TIMER FOR FULL TIME
       STA A 2,X
       LDX #PIA2AD X-REG= PIA2 ADR
       COM 0,X SET A SIDE DDR AS OUTPUTS
       LDA A #%00011111 SET PIA2 A SIDE CONTROL
       STA A 1,X
       COM 2,X SET B SIDE DDR AS OUTPUTS
       LDA A #%00101100 SET PIA2 B SIDE CONTROL
       STA A 3,X
       SPC 1
       SPC 1
*      SET UP INITIAL TASK STATION TABLE
       SPC 1
       LDX #TS
       LDA A #%00010000
       LDA B #20
       BSR SETUP
       SPC 2
*      SET UP INITIAL STATIONS WAITING FOR SERVICE TABLE
       SPC 1
       LDX #SWFS
       LDA A #%11111111
       LDA B #20
       BSR SETUP
       SPC 2
*      CLEAR OTHER TABLES AND FLAGS
       SPC 1
       LDX #SIS
       CLR A
       LDA B #OUTPIP-SIS
       BSR SETUP
       SPC 2
*      INITIALIZE I/O FLAGS
       SPC 1
       INC A
       STA A OUTPIP
       STA A INPTIP
       SPC 2
       SPC 2
*SETUP INTERRUPT ADR
       SPC 1
       LDX #NTRUPT
       STX $A000
       CLI
       JMP QUSRCH
       SPC 2
*      ROUTINE TO SET MEMORY LOCATIONS
*          XR - 1ST ADR
*          BR - NO. OF ITEMS
*          AR - SETUP VALUE
       SPC 1
SETUP  STA A 0,X
       INX
       DEC B
       BGT SETUP
       RTS
       SPC 2
*        NAM QUSRCH
       SPC 1
       ORG $180
QUSRCH JMP Q1
TSKRTN JMP Q2
       SPC 1
Q1     LDX CTP X-REG = CURRENT TASK POINTER
QULOOP LDA A TS,X FETCH CURRENT TASK STATUS
       BEQ XTASK IF CLEAR - RUN IT
NXTTSK INX IF NOT- CHECK NEXT TASK
       CPX #NOTSKS   ALL TASKS CHECKED?
       BNE QULOOP NO- CONTINUE CHECKING
       CLR CTP+1 YES-CLEAR CURRENT TASK PTR
       LDA A DSF BEEN BUSY?
       BNE CLRDSF YES- CHECK FOR MORE
       WAI OTHERWISE, WAIT FOR INTR
CLRDSF CLR DSF
       BRA QUSRCH SEARCH QUEUE AGAIN
       SPC 2
*      HERE TO START OR RESTART A TASK
       SPC 2
XTASK  INC DSF SET DID SOMETHING FLAG
       STX CTP SET CURRENT TASK POINTER
       STX INXTMP DOUBLE TASK POINTER
       ASL INXTMP+1 IN INXTMP
       LDA A SIS,X IS THIS A RESTART
       BNE RESTRT   YES
       CLR A  A-REG=0
       SEC  SET CARRY
       ROL A MOVE IT INTO A-REG
STALOP BITA SWFS,X AND AGAINST STA WAI FLAG
       BEQ SETSTA FOUND A WAI STA
       ASL A CHECK NEXT STATION
       BRA STALOP
SETSTA STA A SIS,X SET STATION IN SERVICE
       LDX INXTMP XR= POINTER TO TSA
       LDX TSA,X XR = TASK START ADR
       JMP 0,X RUN TASK
RESTRT LDX INXTMP  X-REG=POINTER TO RES ADR
       LDX TRA,X X-REG=RESTART ADR
       JMP 0,X LET TASK DO ITS THING
Q2     CLI
        LDX CTP X-REG=CURRENT TASK POINTER
       BRA NXTTSK CONTINUE QUEUE SEARCH
       PAGE
*        NAM  TURNON
       SPC 1
       ORG $200
       SPC 1
*      HERE TO TURN ON A TASK
       SPC 2
*          CALLING SEQ   LDX TSK#
*                        LDA B STA# MASK 11111101 = STA 2
*                        JSR TURNON
       SPC 2
TURNON LDA A TS,X FETCH TASK STATUS
       BIT A #%00010000 IF TASK IS ALREADY ON...
       BEQ TRN2 SET SWFS BIT
       AND A #$EF CLEAR INACTIVE BIT
       STA A TS,X STORE TASK STATUS
TRN2   AND B SWFS,X SET STATION WAI FOR SERVICE
       STA B SWFS,X STORE STA WAI FLAG
       RTS RETURN

       SPC 2
*        NAM TURNOF
       SPC 1
       ORG $240
       SPC 1
*      HERE TO TURN OFF A TASK
*      TASKA TURNS ITSELF OFF
       SPC 2
*          CALLING SEQ   JMP TURNOF
       SPC 2
TURNOF SEI
       LDX CTP X-REG=TASK#
       LDA A SWFS,X FETCH STA WAI FLAG
       ORA A SIS,X SET STA DONE
       STA A SWFS,X STORE STA WAI FLAG
       CLR SIS,X CLEAR STA IN SERVICE FLAG
       COM A CHECK FOR OTHER STA WAI
       BNE TOUT YES - RETURN TO EXEC
       LDA A TS,X NO-FETCH TASK STATUS WORD
       ORA A #$10 SET INACTIVE BIT
       STA A TS,X STORE TASK STATUS
TOUT   JMP TSKRTN BACK TO EXEC
       SPC 2
*       NAM TRNOFF
       ORG $25A
*      HERE FOR TASKA TO TURN OFF TASKB
*      RETURN TO TASKA
       SPC 1
*           JSR TRNOFF
*           XR=TASK TO TURN OFF
       SPC 1
TRNOFF SEI
       LDA A SWFS,X
       ORA A SIS,X
       STA A SWFS,X
GIVEUP PULA FETCH HI RESTART ADR
       PULB FETCH LO RESTART ADR
       LDX CTP X-REG=TASK#
       STX INXTMP
       ASL INXTMP+1
       LDX INXTMP
       STA A TRA,X STORE RESTART ADR
       STA B TRA+1,X
       JMP TSKRTN BACK TO EXEC

       SPC 2
*        NAM  NTRUPT
       SPC 1
       ORG $2C0
       SPC 1
*      HERE IN RESPONSE TO INTERRUPT
       SPC 2
*          I/O GETS IMMEDIATE ATTENTION
*          OTHERS GET FLAG SET IN EXEC TABLE
       SPC 2
NTRUPT LDA A PIA1AC CHECK FOR CRT INPUT
       BIT A #%10000000 START BIT DETECTED?
       BEQ NOTIN NO-CHECK IO TIMER
       BIT A #%00000001 YES-INPUT ALLOWED?
       BNE VEC1  YES-GO GET IT
NOTIN  LDA A PIA1BC FETCH B SIDE CTRL
       BIT A #%00000011 IO TIMER ALLOWED?
       BEQ NOTIO NO - CHECK OTHER INTRS
       BIT A #%10000000 YES - IS IT IO TIMER
       BNE VEC2
       BRA NOTIO
       SPC 2
*      VECTORS TO I/O ROUTINES
       SPC 1
VEC1   JMP CRTIN
VEC2   JMP BITTMR
       SPC 2
*      HERE IF INTERRUPT NOT CRT I/O
       SPC 2
*********************************************************
*      USER'S INTERRUPT HANDLER GOES HERE
NOTIO  NOP
***********************************************************
       SPC 2
*      HERE TO DECODE INTERRUPTS
*      TURN ON INTR HANDLER TASKS
       SPC 2
*          A-REG HAS INTR REG CONTENTS
       SPC 2
       LDX #0 SET TASK# PTR
       LDA B STAMSK
       COM B STA MASK EX: STA 2 = 11111101
DECOD3 ROL A
       BCC FLGTSK CHECK FOR SERVICE REQUEST
DECOD2 INX NEXT TASK
       CPX #8 8 POSSIBLE CHECKED YET?
       BNE DECOD3 NO - CHECK ANOTHER
       RTI
       SPC 2
FLGTSK PSH A GO TURN ON A TASK
       PSH B
       STX SAVX
       JSR TURNON
       PUL B
       PUL A
       LDX SAVX
       BRA DECOD2

       SPC 2
*        NAM MSGREG
       SPC 1
       ORG $380
MSGREQ JMP MSG1
MSGOUT JMP MSG2
       SPC 1
*      HERE TO PROCESS CRT OUTPUT
*           JSR MSGREQ
*          LOAD ADR OF MSG IN X-REG
*          JSR MSGOUT
       SPC 2
MSG1   SEI
       LDA A OUTPIP FETCH OUTPUT IN PROGRESS FLAG
       AND A INPTIP AND WITH INPUT IN PRGS FLAG
       BEQ NOTAVL BUSY-RESET TO COME BACK LATER
       RTS
NOTAVL LDX CTP X-REG=TASK#
       LDA A TS,X FETCH TASK STATUS
       ORA A #%00000100 SET WAITING FOR CRT FLAG
       STA A TS,X
*      TRY AGAIN LATER WITH MSGREQ
       TSX SP+1->XR
       LDA A 0,X GET HI RTN ADR
       LDA B 1,X GET LO RTN ADR
       SUB B #3 DEC RTN ADR BY 3
       SBC A #0
       STA A 0,X STORE RTN ADR->STACK
       STA B 1,X
       JMP GIVEUP GIVE UP CTRL TO EXEC
*                RETURN WILL BE TO TASK THAT
*                 MADE CRT MSG REQUEST AT JSR MSGREQ
       SPC 1
*      HERE TO OUTPUT A MSG ON CRT
       SPC 2
*          ADR OF MSG IN X-REG
       SPC 2
MSG2   STX MSGAT TIMER
       DEC 2,X
       LDA A 2,X CLEAR CB1 FLAG
       LDA A #$37 ENABLE CB1 INTR
       STA A 3,X
       JSR GIVEUP BACK TO EXEC
       SPC 2
*      EXEC RETURNS HERE AFTER MSG IS COMPLETE
       SPC 2
*          LOOK FOR ANOTHER TASK WAITING FOR CRT
       SPC 2
       LDX MSGTSK
       INX
MSGSRH LDA A TS,X
       BIT A #%00000100
       BNE RESWAI FOUND A TASK WAITING
       CPX MSGTSK
       BEQ COMPLT
       INX
       CPX #NOTSKS
       BNE MSGSRH
       LDX #0
       BRA MSGSRH
RESWAI AND A #%11111011 RESET WAITING ON CRT
       STA A TS,X
COMPLT INC OUTPIP RESET OUTPIP
       RTS RETURN TO CALLING TASK

       SPC 2
*       NAM  BITTMR
       SPC 1
       ORG $400
       SPC 1
*      HERE ON CB1 - BIT TIMER - INTERRUPT
       SUNT
       BLE MRKOUT BRANCH TO MARK OUTPUT AT END OF CHAR
       LDA A OUTCHR FETCH CHAR
       STA A 0,X SEND LSB TO DATA LINE
       ROR A  SHIFT NEXT BIT INTO LSB
       STA A OUTCHR SAVE CHAR FOR NEXT TIME
DECCNT DEC B DECREMENT BIT COUNT
       STA B BITCNT
       RTI
       SPC 1
MRKOUT LDA A #$01 MARK COM LINE
       STA A 0,X
       TST B CHECK COUNT
       BEQ DECCNT OUTPUT 1 MORE MARK
       STA A NUCHRF RESET NEW CHAR FLAG
       RTI
       SPC 1
NUCHR  LDX MSGADR FETCH CHAR ADR
       LDA A 0,X FETCH CHAR
       INX INC CHAR ADR
       STX MSGADR
CHKEOM CMP A #$04 CHDB DOR END OF MESSAGE
       BEQ THTSAL BRANCH ON EOM
       CLR PIA1AD SPACE COM LINE
       STA A OUTCHR STORE CHAR
       LDA A #8 RESET BIT COUNT
       STA A BITCNT
       CLR NUCHRF RESET NEW CHAR FLAG
       RTI
       SPC 1
THTSAL LDX MSGTSK FETCH TASK NO.
       LDA A TS,X FETCH TASK STATUS
       AND A #%11110111 RESET XFER INPROCESS FLAG
       STA A TS,X
       LDX #PIA1AD
       LDA A #%00110100 DISABLE CB1 INTR
       STA A 3,X
       RTI
       SPC 1
BITINP JMP BITIN

       SPC 2
*        NAM  CRTIN
       SPC 1
       ORG $480
       SPC 1
*      HERE TO SERVICE CA1 - CRT INPUT - INTERRUPT
       SPC 2
CRTIN  CLR INPTIP SET INPUT IN PROCESS BUSY
       LDA A #%00000100 DISABLE CA1 INTR
       STA A PIA1AC
       LDX #PIA1AD
       CLR 2,X SET TIMER FOR HALF BIT TIME
       INC 2,X RESET TIMER
       DEC 2,X
       LDA A 2,X CLEAR CB1 INTR FLAG
       LDA A #$37
       STA A 3,X ENABLE CB1 INTR
       INC NUCHRF
       LDA A OUTPIP CHECK FOR OUTPUT IN PROGRESS
       BNE X1 BRANCH IF NOT
       SEC MARK COM OUT LINE
       ROL 0,X
       LDX MSGTSK
       LDA A TS,X RESET XFER IN PROGRESS
       AND A #%11110111
       STA A TS,X
X1     RTI

       SPC 2
*        NAM  BITIN
       SPC 1
       ORG $4C0
       SPC 1
*      HERE TO SERVICE BIT TIMER DURING CRT INPUT
       SPC 2
BITIN  LDX #PIA1AD
       LDA A NUCHRF FETCH NEW CHAR FLAG
       BEQ BITIN2 NOT NEW CHAR
       LDA A #4 SET TIMER FOR FULL BIT TIME
       STA A 2,X
       INC 2,X RESET TIMER
       DEC 2,X
       LDA A 2,X CLEAR CB1 INTR FLAG
       LDA A #8 SET BITCNT
       STA A BITCNT
       CLR INCHAR CLEAR INPUT CHAR
       CLR NUCHRF RESET NEW CHAR FLAG
       RTI
       SPC 1
*      HERE TO BUILD BIT INTO CHAR
       SPC 1
BITIN2 LDA A BITCNT
       BLE BITIN3 BRANCH FOR MARKS
       SEC MARK OUTPUT
       ROL 0,X SHIFT INPUT BIT INTO CARRY
       LDA B INCHAR FETCH INCHAR
       ROR B SHIFT BIT INTO INCHAR
       STA B INCHAR
BITIN4 DEC BITCNT DECREMENT BITCNT
       RTI
       SPC 1
BITIN3 BEQ BITIN4 RETURN - IGNORE STOP BIT
       LDX #09 ECHO TASK# TO XR
       LDA B #$FE STA1 FOR INPUT ECHO
       JSR TURNON TURN ON ECHO TASK
       LDX #PIA1AD
       LDA A 0,X CLEAR CA1 INTR FLAG
       LDA A #$05 ENABLE CA1 INTR
       STA A 1,X
       LDA A #$34 DISABLE CB1 INTR (TIMER)
       STA A 3,X
       INC INPTIP CLEAR INPUT IN PROGRESS
       RTI

       SPC 2
*        NAM  WAITFI
       SPC 1
       ORG $540
       SPC 1
*      HERE TO GIVE UP CONTROL AND WAIT FOR INPUT
       SPC 2
*          X-REG= CHAR BUFFER ADR
*          BSR WAITFI
       SPC 2
WAITFI LDA A CHRBF FETCH CHAR BUFFER FLAG
       BEQ EMPTY
       CLR CHRBF
       LDA A HLDBUF PUT CHAR IN USERS BUFFER
       STA A 0,X
       RTS
EMPTY  STX TSKBUF SAVE BUFFER ADR
       LDX CTP
       STX TSKWOI SAVE TASK NO.
       LDA A TS,X
       ORA A #%00100000 SET WAIT ON INPUT FLAG
       STA A TS,X
       JMP GIVEUP

       SPC 2
*        NAM ECHO
       SPC 1
       ORG $580
       SPC 1
*      TASK 9 - ECHO AND DECODE CRT INPUT
       SPC 2
ECHO   JSR MSGREQ GET MSG HANDLER
       LDA A INCHAR FETCH CHAR
       STA A ECOSRG STORE IN ECHO STRING
       LDX #ECOSRG OUTPUT MSG
       JSR MSGOUT
       LDA A INCHAR
       AND A #$7F
       STA A INCHAR
       BRA ECHO2
       SPC 2
*      HERE IF A TASK IS WAITING FOR INPUT
       SPC 2
ECHO1  LDX TSKBUF FETCH TASK BUFFER ADR
       LDA A INCHAR
       STA A 0,X STORE CHAR IN TASK BUF
       CLR CHRBF CLEAR BUFFER FULL FLAG
       LDX TSKWOI
       LDA A TS,X RESET TASK WAITING FOR INPUT FLAG
       AND A #%11011111
       STA A TS,X
       BRA EXTECO
       SPC 2
       SPC 2
ECHO2  LDA A INCHAR CHECK CONTROL BLOCK
       CMP A #%01
       BLT ECHO3
       CMP A #$06
       BGT ECHO3
       SPC 2
*      HERE IF IT IS A CONTROL CHAR
*      TURN OFF ANY TASK WFI
       SPC 1
       LDX TSKWOI
       CPX #$0000
       BEQ CC
       LDA A TS,X
       AND A #%11011111 RESET TASK WAITING FOR INPUT FLAG
       STA A TS,X
       JSR TRNOFF
CC     LDA A INCHAR
       ADD A #09 MAKE POINTER TO CONTROL TASK
       STA A TSKWOI+1
       LDX TSKWOI
       CLR TSKWOI
       CLR TSKWOI+1
       LDA B #$FE STA1 MASK
       JSR TURNON
       BRA EXTECO
       SPC 2
*      HERE TO SAVE CHAR UNTIL SOMEBODY WANTS IT
       SPC 2
ECHO3  LDA A TSKWOI+1 CHECK FOR TASK WOI
       BNE ECHO1
       LDA A INCHAR
       STA A HLDBUF SAVE CHAR
       INC CHRBF  SET FLAG
EXTECO JMP TURNOF

       SPC 2
*      EXAMPLE CONTROL TASK - TASK #10
       SPC 1
*      THIS TASK IS STARTED BY THE EXEC IN RESPONSE
*      TO A CTRL A TYPED ON THE TTY.  IT PRINTS A
*      MESSAGE TO THE OPERATOR.
       SPC 1
       ORG $0600
       SPC 1
CTRLA  JSR MSGREQ REQUEST MESSAGE HANDLER
       SPC 1
*      CONTROL RETURNS HERE WHEN MSG HANDLER READY
       LDX #MSG XR=ADR OF MSG
       JSR MSGOUT OUTPUT MESSAGE
       SPC 1
*      CONTROL RETURNS HERE AFTER MSG COMPLETE
*      OTHER TASKS MAY RUN WHILE MSG IS TYPED
       JMP TURNOF TURN OFF THIS TASK - BACK TO EXEC
       SPC 1
MSG    FCB $0D,$0A CR-LF
       FCC /THIS IS A REAL-TIME RESPONSE /
       FCC /TO A CONTROL CHARACTER/
       FCB $0D,$0A CR-LF
       FCC /OTHER TASKS CAN RUN /
       FCC /WHILE THIS MESSAGE IS PRINTING/
       FCB $0D,$0A,$04 $04 TERMINATES MSG
       END
