1000 REMark JobDets_BAS
1010 :
1020 REMark Display a menu of all jobs running in the QL
1030 :
1035 REMark $$asmb=win2_jobdets_cde,4,82
1037 REMark $$asmb=wzz1_dev_djtk_djtoolkit_bin,0,12
1038 REMark $$asmb=wzz1_qlib_qlib_ext,0,12
1039 :
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           action = MSTAT%(#menu, -4 TO available%)
1110     = REMAINDER : check_hit(action): REMark menu element
1120   END SELect 
1130 END REPeat loop
1140 MCLEAR #menu
1150 CLOSE #3
1160 :
1170 :
1180 DEFine PROCedure initialise
1190   available% = 0
1200   selected% = 1
1210   unavailable%= -1
1220   :
1230   OPEN #3,'con_'
1240   MDRAW #3,'jobs', 50, 25
1250   menu = MWDEF(#3)
1260   initialise_menu
1270 END DEFine initialise
1280 :
1290 :
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
2560 :
2570 :
2580 DEFine PROCedure iw_print(ch%, iw%, t$)
2590   :
2600   REMark Print some text to the given info window
2610   :
2620   MWINDOW #ch%, iw% ! \0
2630   INK #ch%, 0
2640   PRINT #ch%, t$;
2650   CLS #ch%, 4
2660 END DEFine iw_print
2670 :
2680 :
2690 DEFine PROCedure check_hit(act)
2700   LOCal header, item, temp, col%, row%
2710   LOCal loop, action
2720   :
2730   REMark Check to see if a HIT or DO was on a menu element
2740   :
2750   temp = act
2760   item = MAWNUM(#menu, temp, col%, row%)
2770   IF item
2780      item = item -1
2790      OPEN #4, 'con_'
2800      MDRAW #4, 'header'
2810      header = MWDEF(#4)
2820      REPeat loop
2830        IF INKEY$(#4) = CHR$(27) THEN EXIT loop: END IF 
2840        header_info row%
2850      END REPeat loop
2860      MCLEAR #4
2870      CLOSE #4
2880      item = MSTAT%(#menu, act TO available%)
2890   END IF 
2900 END DEFine check_hit
2910 :
2920 :
2930 DEFine PROCedure header_info(r%)
2940   LOCal job_base, register
2950   :
2960   REMark Fill up all the info windows on the
2970   REMark HEADER menu with data from the job's
2980   REMark header area.
2990   :
3000   IF job_name$(0, r%) = '' THEN RETurn : END IF 
3010   iw_print 4, 4, job_name$(0, r%): REMark ID
3020   iw_print 4, 5, job_name$(2, r%): REMark START
3030   job_base = HEX(job_name$(2,r%))
3040   iw_print 4, 6, HEX$(PEEK_L(job_base + 8),32): REMark OWNER
3050   iw_print 4, 7, HEX$(PEEK_L(job_base + 12), 32): REMark HOLD
3060   iw_print 4, 8, PEEK(job_base + 18): REMark PRIORITY
3070   iw_print 4, 9, PEEK(job_base + 19): REMark PRINC
3080   iw_print 4, 10, HEX$(PEEK_W(job_base + 20), 16): REMark STAT
3090   iw_print 4, 11, PEEK(job_base + 22): REMark REL A6
3100   iw_print 4, 12, PEEK(job_base + 23): REMark WFLAG
3110   iw_print 4, 13, HEX$(PEEK_L(job_base + 24), 32): REMark WJOB
3120   iw_print 4, 14, HEX$(PEEK_L(job_base + 28), 32): REMark TRAPV
3130   :
3140   REMark Now do all the registers up to A7
3150   :
3160   FOR register = 0 TO 15
3170     iw_print 4, register + 15, HEX$(PEEK_L(job_base + 4 * register + 32), 32)
3180   END FOR register
3190   :
3200   iw_print 4, 31, HEX$(PEEK_L(job_base + 98), 32):REMark PC
3210   iw_print 4, 32, HEX$(PEEK_W(job_base + 96), 16): REMark SR
3220 END DEFine header_info
30000 :
30010 :
32000 REMark $$off
32010 DEFine PROCedure sa
32020   QSAVE 'win2_JobDets'
32030   QSAVE 'ram1_JobDets'
32040   SAVE 'win2_JobDets_bas'
32050 END DEFine 
32060 REMark $$on
