1000 REMark TUTOR8_BAS
1010 :
1020 REMark Display a menu of all jobs running in the QL
1030 :
1040 initialise
1050 REPeat loop
1060   action = MCALL(#menu; \0)
1070   SELect ON action
1080     = 0: EXIT loop: REMark ESC
1090     = -4: initialise_menu: REMark WAKE
1100   END SELect 
1110   SELect ON action
1120     = -4: action = MSTAT%(#menu, action TO available%)
1130   END SELect 
1140 END REPeat loop
1145 MCLEAR #menu
1150 CLOSE #3
1160 :
1165 :
1170 DEFine PROCedure initialise
1180   available% = 0
1190   selected% = 1
1200   unavailable%= -1
1210   :
1220   OPEN #3,'con_'
1230   MDRAW #3,'win2_jobs_men', 50, 25
1240   menu = MWDEF(#3)
1250   initialise_menu
1260 END DEFine initialise
1270 :
1280 :
2000 DEFine PROCedure initialise_menu
2010   LOCal x, sv_jbbas, sv_jbmax, sv_jbtop
2020   LOCal job_base, tag
2030   :
2040   REMark Create an array to hold job names, find all jobs
2050   REMark and fill in the array. Remove any menu from the
2060   REMark main screen and set up a new menu using our array.
2070   :
2080   sv_jbmax = PEEK_W(SYSTEM_VARIABLES + 98)
2090   sv_jbbas = PEEK_L(SYSTEM_VARIABLES + 104)
2100   sv_jbtop = PEEK_L(SYSTEM_VARIABLES + 108)
2110   :
2120   REMark There is always at least one job running so
2130   REMark I don't need to check for zero jobs here.
2140   :
2150   DIM job_name$(2, sv_jbmax, 30)
2160   DIM x_width%(2)
2170   :
2180   REMark Now scan the job table and find the base
2190   REMark address of each job, if active. From there
2200   REMark we can find and extract the job name for our
2210   REMark menu. Job 0 is always SuperBasic.
2220   :
2230   job_name$(0, 0) = '00000000'
2240   job_name$(1, 0) = 'SuperBasic'
2250   job_name$(2, 0) = HEX$(PEEK_L(sv_jbbas), 32)
2260   :
2270   FOR x = 1 TO sv_jbmax
2280     job_base = PEEK_L(sv_jbbas + (x * 4))
2290     IF PEEK(sv_jbbas + (x * 4)) = 255
2300        job_name$(1, x) = 'Dead Job'
2310     ELSE 
2320        tag = PEEK_W(job_base + 16)
2330        job_name$(0, x) = HEX$(tag, 16) & HEX$(x, 16)
2340        job_name$(2, x) = HEX$(job_base, 32)
2350        size = PEEK_W(job_base + 104 + 8)
2360        IF (size > 30) OR (size < 0)
2370           job_name$(1, x) = 'Unknown name'
2380        ELSE 
2390           job_name$(1, x) = PEEK_STRING(job_base + 104 + 10, size)
2400        END IF 
2410     END IF 
2420   END FOR x
2430   :
2440   REMark Now set up the widths of each column in the menu
2450   :
2460   RESTORE 2500
2470   FOR x = 0 TO 2
2480     READ x_width%(x)
2490   END FOR x
2500   :
2510   DATA 52, 142, 52
2520   :
2530   MAWCLEAR #menu, 1
2540   MAWDRAW #menu, 1, job_name$, 0, 0,,x_width%
2550 END DEFine initialise_menu
30000 :
30010 :
32000 REMark $$off
32010 DEFine PROCedure sa
32020   QSAVE 'win2_TUTOR8'
32030   QSAVE 'ram1_TUTOR8'
32040   SAVE 'win2_TUTOR8_bas'
32050 END DEFine 
32060 REMark $$on
