* MTK16-TEST - 5 TEST PROGRAMS TO SHOW MTK16 OPERATION * ******************************* * RING-2, THE PROGRAM TASKS * ******************************* SUBR PRTC TASK 1 START ADDRESS SUBR TOD BINARY 'TIME OF THE DAY' (3 WORDS) SUBR ATOD GENERATE ASCII REPRESENTATION OF THE TOD SUBR PTTY TASK 2 START ADDRESS SUBR TSK3 TASK 3 START ADDRESS SUBR TSK4 TASK 4 START ADDRESS SUBR TSK5 TASK 5 START ADDRESS ORG '2000 * VERSION 3: ATTENTION HANDLER IGNORES LINEFEEDS * * A NUMBER OF TASKS IS DEFINED TO TEST THE FUNCTIONALITY OF THE MULTITASKING * MECHANISM. * * TASKS EXISTING IN RING-2 (THREADS) RUN WITH THE INTERRUPT ENABLED. * THEY USE SERVICES PROVIDED BY THE RING-1 PRIMITIVES (TIMER, TTY I/O, ETC.). * * IN GENERAL, WITHOUT TAKING SPECIAL MEASURES, THE TASKS CAN NOT SHARE * SUBROUTINES WHICH USE RING-1 PRIMITIVES, BECAUSE SUCH SUBROUTINES, WHEN * WORKING IN ONE TASK, CAN BE BLOCKED/INTERRUPTED AND THEN CALLED BY ANOTHER * TASK, WITH AS CONSEQUENCE THAT THE RETURN ADDRESS IS OVERWRITTEN. * SUBROUTINES CAN BE SHARED BY TASKS HOWEVER IF THEY ARE MADE REENTRANT ALSO * WITH RESPECT TO THE SUBR CALLING/RETURN MECHANISM, WHICH IS COMPLICATED IN AN * INTERRUPT ENABLED ENVIRONMENT ON THIS MACHINE. * SUBROUTINES CAN ALSO BE SHARED IF THEY ARE PROTECTED BY A BINARY SEMAPHORE, * SO THAT ONLY ONE TASK AT A TIME CAN ENTER THE SUBROUTINE EXCLUSIVELY. RING-1 * PRIMITIVES ARE PROVIDED TO SUPPORT THIS MEACHANISM. * * * TASK 1 THE REAL TIME CLOCK TASK ********************************* * THIS TASK PRINTS EACH SECOND AN * (IF THE TTY IS AVAILABLE). * THE TASK ALSO MAINTAINS A 'TIME OF THE DAY' CLOCK, WHICH USES 3 WORDS: * WORD1 = HH (HOURS) 0..23 * WORD2 = MM (MINUTES) 0..59 * WORD3 = SS (SECONDS) 0..59 * THE TOD DATASTRUCTURE CAN BE ACCESSED VIA THE VARIABLE: TOD. * * ASCII REPRESENTATION OF THE TIME OF THE DAY CAN BE CALLED BY MEANS OF * THE SUBROUTINE: * CALL ATOD * DAC TIME, WHERE TIME IS A 3 WORD BUFFER FOR STORING THE ASCII * STRING HHMMSS, REPRESENTING THE CURRENT TIME. * ********** **** TASK ENTRY POINT ********** PRTC CALL SLEEP AND WAIT FOR DUE DEC 10 SET TIMER TO 10 TICKS (1 SECOND) * UPDATE THE TOD CLOCK IRS SS SEC + 1 LDA SS OVERFLOW? SUB =60 SPL JMP RDY NO * SECOND COUNTER IS 60 CRA STA SS RESET SECOND COUNTER IRS MM LDA MM OVERFLOW? SUB =60 SPL JMP RDY NO * MINUTE COUNTER IS 60 CRA STA MM RESET MINUTE COUNTER IRS HH LDA HH OVERFLOW? SUB =24 SPL JMP RDY NO * HOUR COUNTER IS 24 CRA STA HH * RDY CALL ATT TIMER READY, CLAIM TTY OCT 1 JMP PRTC NOT SUCCEEDED, LOOP FOR ANOTHER SECOND LDA AST TTY AVAILABLE, CALL ASRO PRINT * CALL REL RELEASE THE TTY OCT 1 AND REINSTALL ATTENTION HANDLER JMP PRTC AND LOOP FOR ANOTHER SECOND * **** ENTRY POINT **** GENERATE ASCII REPRESENTATION OF THE TOD: HHMMSS * ATOD DAC ** LDA* ATOD GET BUFFER POINTER STA TPTR LDA HH JST C10 HH TO DECIMAL ASCII LDA MM JST C10 LDA SS JST C10 IRS ATOD JMP* ATOD * CONVERT A TO A 2-DIGIT ASCII DECIMAL AND STORE RESULT C10 DAC ** IAB SAVE A IN B CRA STA T10 IAB RESTORE A N10 SUB =10 SPL JMP L10 IRS T10 JMP N10 L10 ADD =10 ICA ADD T10 ICA ADD NN STA* TPTR IRS TPTR JMP* C10 * AST BCI 1, * NN BCI 1,00 TPTR OCT 0 T10 OCT 0 * **** ENTRY POINT **** THE TIME OF THE DAY CLOCK TOD EQU * HH OCT 0 HOURS 0..23 MM OCT 0 MINUTES 0..59 SS OCT 0 SECONDS 0..59 FIN LITERALS TASK 1 EJCT * * TASK 2 TTY ATTENTION HANDLER ****************************** * STARTS WITH AN ESC ON THE TTY * INPUTS/EXECUTES A COMMAND * STOPS WITH ESC ON THE TTY * ********** **** TASK ENTRY POINT ********** PTTY CALL ATTW SET ATTENTION HANDLER DAC *+1 * ACTIVATED AS TTY ATTENTION HANDLER (TTY ATTACHED IMPLICITLY) JST PSTR PRINT STRING DAC S1 * INPUT A COMMAND * K (KILL PRINTING THE TIME) => KILLS TASK 3 * S (SET TIME OF THE DAY) * P (PRINT TIME OF THE DAY) => ACTIVATES TASK 3 * E (ECHO STRING) NL JST NLCR JST PSTR DAC SC CALL ASRI SUB ='212 SNZ JMP *-3 IGNORE LINEFEEDS ADD ='212 STA COM SUB CS SET TIME OF THE DAY? SNZ JMP SETT LDA COM SUB CP PRINT TIME OF THE DAY? SNZ JMP PRTT LDA COM SUB CK KILL PRINTING THE TIME? SNZ JMP KILP LDA COM SUB CE ECHO STRING? SNZ JMP ECHO LDA COM SUB ESC1 EXIT? SNZ JMP STOP JMP NL COM OCT 0 REQUESTED COMMAND * * ECHO STRING ECHO LDX =-20 CLEAR INPUT BUFFER CRA TEL STA BUF+20,1 IRS 0 JMP TEL LDX =-20 JST NLCR NEXT CALL ASRI INPUT NEXT CHARACTER CAS CR LINE END? SKP JMP PRIN YES, PRINT INPUT STA BUF+20,1 STORE IRS 0 BUFFER COMPLETE? JMP NEXT NO, INPUT NEXT CHARACTER PRIN JST NLCR PR JST PSTR PRINT COLLECTED CHARACTERS DAC BUF JMP NL * * SET TIME OF THE DAY SETT JST PSTR DAC S13 JST IT INPUT HOUR BCI 1,HH STA TM1 AND SAVE JST IT INPUT MINUTE BCI 1,MM STA TM2 AND SAVE JST IT INPUT SECOND BCI 1,SS STA TOD+2 AND SET SECOND COUNTER LDA TM2 STA TOD+1 SET MINUTE COUNTER LDA TM1 STA TOD SET HOUR COUNTER JMP NL TM1 OCT 0 HOUR TM2 OCT 0 MINUTE NUM OCT 0 DIG OCT 0 IT DAC ** INPUT A 2 DIGIT DECIMAL JST NLCR LDA* IT ICA CALL ASRO ICA CALL ASRO LDA ='240 CALL ASRO CRA STA NUM CALL ASRI INPUT 1ST DIGIT SUB ='260 STA DIG SPL JMP IT+1 LESS THEN 0, ERROR, RETRY SUB =10 SMI JMP IT+1 BIGGER THEN 9, ERROR, RETRY LDA DIG LGL 3 *8 ADD DIG *9 ADD DIG *10 STA NUM CALL ASRI INPUT 2ND DIGIT SUB ='260 STA DIG SPL JMP IT+1 LESS THEN 0, ERROR, RETRY SUB =10 SMI JMP IT+1 BIGGER THEN 9, ERROR, RETRY LDA DIG ADD NUM RESULT IRS IT JMP* IT * * START TASK WHICH PRINTS TIME OF THE DAY PRTT LDA* SP3 STATE TASK 3 ? SNZ JMP STR JST PSTR DAC S10 JMP NL STR JST PSTR DAC S11 CALL EXE SP3 XAC P3 JMP NL * * KILL PRINTING TIME OF THE DAY KILP JST PSTR DAC S12 CALL KILL XAC P3 JMP NL * * STOP ATTENTION HANDLER STOP JST PSTR DAC S2 JST NLCR CALL REL OCT 0 RELEASE THE 'ATTENTION' TTY JMP PTTY * * PRINT NEWLINE NLCR DAC ** LDA LF CALL ASRO LDA CR CALL ASRO JMP* NLCR * * PRINT STRING (NULL TERMINATED) PSTR DAC ** LDA* PSTR POINTER TO STRING STA PTR N LDA* PTR GET 2 CHARS SNZ JMP END STRING END ICA PRINT BYTE 1 CALL ASRO ICA PRINT BYTE 2 CALL ASRO IRS PTR JMP N END IRS PSTR RETURN JMP* PSTR PTR OCT 0 * * PRINT REG A OCTAL (A NOT CHANGED) POCT DAC ** STA PSA IAB LDA =-6 STA CNT LDA ='240 CALL ASRO CRA LLL 1 JMP CONV OKT LLL 3 CONV ADD ='260 CALL ASRO CRA IRS CNT JMP OKT LDA PSA JMP* POCT CNT OCT 0 PSA OCT 0 * * CONSTANTS/VARIABLES TASK 2 ESC1 OCT 233 CK OCT 313 K (KILL) CS OCT 323 S (SET) CP OCT 320 P (PRINT) CE OCT 305 E (ECHO) * S1 EQU * CR OCT 215 LF OCT 212 BCI 14,ATTENTION HANDLER ACTIVATED OCT 0 S2 EQU * BCI 13,ATTENTION HANDLER STOPPED OCT 0 SC EQU * BCI 13,INPUT COMMAND (S, P, K, E) OCT 215 OCT 212 BCI 1,# OCT 0 S10 EQU * BCI 13,TASK 3 IS ALREADY STARTED OCT 215 OCT 212 OCT 0 S11 EQU * BCI 6,START TASK 3 OCT 215 OCT 212 OCT 0 S12 EQU * BCI 6,STOP TASK 3 OCT 215 OCT 212 OCT 0 S13 EQU * BCI 4,SET TIME OCT 0 BUF BSS 21 OCT 0 FIN LITERALS TASK 2 EJCT * * TASK3 PRINTS THE TIME OF THE DAY ********************************** * WHEN STARTED, TASK 3, AWAKENS EACH 30 SECONDS AND PRINTS A SMALL MESSAGE * ON THE TTY INCLUDING THE TIME OF THE DAY * ********** **** TASK ENTRY POINT ********** TSK3 CALL ATTW ATTACH TTY OCT 1 LDA S3 STA PTR3 POINTER TO STRING T3N LDA* PTR3 2 BYTES SNZ JMP PT JST T3P IRS PTR3 JMP T3N * STRING END PT LDA ='240 CALL ASRO CALL ATOD GET TIME OF THE DAY DAC TIME LDA TIME AND PRINT JST T3P LDA CH CALL ASRO LDA TIME+1 JST T3P LDA CH CALL ASRO LDA TIME+2 JST T3P LDA M3 PRINT NLCR CALL ASRO LDA M3+1 CALL ASRO CALL REL RELEASE TTY OCT 1 CALL SLEEP DEC 300 30 SEC JMP TSK3 * PRINT 2 BYTES T3P DAC ** ICA CALL ASRO ICA CALL ASRO JMP* T3P * PTR3 OCT 0 S3 DAC *+1 M3 OCT 215 OCT 212 BCI 3,TASK 3 OCT 0 CH BCI 1, : TIME EQU * OCT 0 H OCT 0 M OCT 0 S FIN * * TASK 4 ******** * AWAKENS EACH 8 SECONDS AND PRINTS A SMALL MESSAGE ON THE TTY ********** **** TASK ENTRY POINT ********** TSK4 CALL ATTW ATTACH TTY OCT 1 LDA S4 STA PTR4 POINTER TO STRING T4N LDA* PTR4 2 BYTES SZE JMP T4P * STRING END CALL REL RELEASE TTY OCT 1 CALL SLEEP DEC 80 8 SEC JMP TSK4 * PRINT 2 BYTES T4P ICA CALL ASRO ICA CALL ASRO IRS PTR4 JMP T4N PTR4 OCT 0 S4 DAC *+1 M4 OCT 215 OCT 212 BCI 3,TASK 4 OCT 215 OCT 212 OCT 0 FIN * * TASK 5 ******** * TASK 5 IS JUST AN ENDLESS LOOP AND WOULD CONSUME ALL CPU TIME (SO DISABLE * MULTITASKING) IN CASE NO PREEMPTION SCHEDULING IS CONFIGURED. THIS TASK * SHOWS THAT PREEMTTION SCHEDULING AS SUPPORTED BY MTK16 IS WORKING ********** **** TASK ENTRY POINT ********** TSK5 NOP JMP *-1 END