;IN ALL MACROS ADDRESSES ARE EXPECTED AS ARGS EXCEPT FOR LUN ARG ;IN QTRAN, WHICH SHOULD BE A LITERAL, AND NAM AND RA IN RESUME AND REQUEST WHICH ;ARE RAD50 NAME AND ACTUAL RESUME ADDR RESPECTIVELY. ;EVTAB IS THE ADDRESS OF A 0 TERMINATED WORD TABLE OF ADDRESSES OF ;EVENT VARIABLE WORDS TO WAIT ON (UNTIL ONE OR MORE IS NONZERO) .MACRO $DIR$ CODE .IF DF,TP$ALL TRAP 375 .WORD CODE .IFF TRAP CODE .ENDC .ENDM .IF NDF,$$DOS ;RSX VERSIONS OF MSX .MACRO QRUN NUMBER MOV #>,R0 ;POINTER TASK TCB CLR -(SP) ;FAKE PSW JSR PC,MX.RQU ;FAST REQUEST .ENDM .MACRO WAIT. EV MOV EV,-(SP);PUSH ADDR JSR PC,MX.SV2 .WORD 00 .ENDM .MACRO ORWAIT EVTAB MOV EVTAB,-(SP) JSR PC,MX.SV2 .WORD 4 .ENDM .MACRO SUSPEND JSR PC,MX.SV2 .WORD 6 .ENDM .MACRO RESUME NAM,RA,EV MOV EV,-(SP) .IF NB,RA MOV RA,-(SP) .IFF CLR -(SP) .ENDC MOV NAM,-(SP) JSR PC,MX.SV2 .WORD 8. .ENDM .MACRO REQUEST NAM,PRI,EV MOV EV,-(SP) .IF NB,PRI MOV PRI,-(SP) .IFF CLR -(SP) .ENDC MOV NAM,-(SP) JSR PC,MX.SV2 .WORD 10. .ENDM .MACRO PRIREQ NAM,PRI,EV MOV EV,-(SP) .IF NB,PRI MOV PRI,-(SP) .IFF CLR -(SP) .ENDC MOV NAM,-(SP) CLR -(SP) ;FAKE PS JSR PC,MX.PRR ;CALL PRIO REQ. ROUTINE .ENDM .MACRO EXIT EV .IF NB,EV MOV EV,-(SP) .IFF CLR -(SP) .ENDC CLR -(SP) JSR PC,MX.PRX ;SPECIAL FASTER EXIT .ENDM .MACRO DECLARE JSR PC,MX.SV2 .WORD 14. .ENDM .MACRO QTRAN LUN,DPB,IOSB .IF NB,IOSB MOV IOSB,-(SP) .IFF CLR -(SP) .ENDC MOV DPB,-(SP) .IF NB,LUN MOV LUN,-(SP) .IFF CLR -(SP) .ENDC JSR PC,MX.SV2 .WORD 16. .ENDM .ENDC ; ;IN ALL MACROS ADDRESSES ARE EXPECTED AS ARGS EXCEPT FOR LUN ARG ;IN QTRAN, WHICH SHOULD BE A LITERAL, AND NAM AND RA IN RESUME AND REQUEST WHICH ;ARE RAD50 NAME AND ACTUAL RESUME ADDR RESPECTIVELY. ;EVTAB IS THE ADDRESS OF A 0 TERMINATED WORD TABLE OF ADDRESSES OF ;EVENT VARIABLE WORDS TO WAIT ON (UNTIL ONE OR MORE IS NONZERO) .MACRO $DIR$ CODE .IF DF,TP$ALL TRAP 375 .WORD CODE .IFF TRAP CODE .ENDC .ENDM .IF DF,$$DOS ;DOS AND STANDALONE MSX BASIC MACROS .MACRO QRUN NUMBER SEC ;SET FAST REQUEST EMT NUMBER .ENDM .MACRO WAIT. EV MOV EV,-(SP);PUSH ADDRESS $DIR$ 0 ;WAIT .ENDM .MACRO ORWAIT EVTAB MOV EVTAB,-(SP) $DIR$ 2 .ENDM .MACRO SUSPEND $DIR$ 3 .ENDM .MACRO RESUME NAM,RA,EV MOV EV,-(SP) .IF NB,RA MOV RA,-(SP) .IFF CLR -(SP) .ENDC MOV NAM,-(SP) $DIR$ 4 .ENDM .MACRO REQUEST NAM,PRI,EV MOV EV,-(SP) .IF NB,PRI MOV PRI,-(SP) .IFF CLR -(SP) .ENDC MOV NAM,-(SP) $DIR$ 5 .ENDM .MACRO PRIREQ NAM,PRI,EV MOV EV,-(SP) .IF NB,PRI MOV PRI,-(SP) .IFF CLR -(SP) .ENDC MOV NAM,-(SP) CLR -(SP) ;FAKE PS $DIR$ 1 .ENDM .MACRO EXIT EV .IF NB,EV MOV EV,-(SP) .IFF CLR -(SP) .ENDC $DIR$ 6 ;MSX EXIT... .ENDM .MACRO QXIT ;QUICK EXIT, NO EV EMT 376 ;JUST USE EMT WITH LARGE CODE .ENDM .MACRO DECLARE $DIR$ 7 ;DECLARE SIG EVENT .ENDM .MACRO QTRAN LUN,DPB,IOSB .IF NB,IOSB MOV IOSB,-(SP) .IFF CLR -(SP) .ENDC MOV DPB,-(SP) .IF NB,LUN MOV LUN,-(SP) .IFF CLR -(SP) .ENDC $DIR$ 10 ;I/O TRANSFER .ENDM .ENDC ;; ; ;MSX-11 MACROS ADDED FOR MULTI-CPU CAPABILITY .MACRO SPAWN TSKNAM,XITEVA,CALEVA MOV CALEVA,-(SP) MOV XITEVA,-(SP) MOV TSKNAM,-(SP) $DIR$ 11 .ENDM .MACRO MSGOUT MSGHDR MOV MSGHDR,-(SP) $DIR$ 12 .ENDM .MACRO MSGIN MSGLEN,MSGADR,MSGSTT MOV MSGSTT,-(SP) MOV MSGADR,-(SP) MOV MSGLEN,-(SP) $DIR$ 13 .ENDM .MACRO WSIG $DIR$ 14 .ENDM .MACRO ABORT TASKNM MOV TASKNM,-(SP) $DIR$ 15 .ENDM .MACRO ALTGBL EVA,TASKNM,VALUE .IF NB,VALUE MOV VALUE,-(SP) .IFF CLR -(SP) .ENDC MOV TASKNM,-(SP) MOV EVA,-(SP) $DIR$ 16 .ENDM .MACRO MODSTT CODE,VALADR,ID2,ID1,TASKNM .IF B,TASKNM MOV #-1,-(SP) .IFF MOV TASKNM,-(SP) .ENDC MOV ID1,-(SP) MOV ID2,-(SP) MOV VALADR,-(SP) .IF B,CODE CLR -(SP) .IFF MOV CODE,-(SP) .ENDC $DIR$ 17 .ENDM .MACRO LOCK $DIR$ 20 .ENDM .MACRO UNLOCK $DIR$ 21 .ENDM .MACRO PWAIT EVADR MOV EVADR,-(SP) $DIR$ 22 .ENDM .MACRO ASTXIT $DIR$ 23 .ENDM .MACRO KWAIT EVADR MOV EVADR,-(SP) $DIR$ 24 .ENDM .MACRO MSGFRE MSGLEN,MSGADR MOV MSGADR,-(SP) MOV MSGLEN,-(SP) $DIR$ 25 .ENDM .MACRO XASTX $DIR$ 26 .ENDM .MACRO ALTP NEWPRI,TSKNAM MOV TSKNAM,-(SP) MOV NEWPRI,-(SP) $DIR$ 27 .ENDM .MACRO KPWAIT VALUE,EVADR .IF B,EVADR CLR -(SP) .IFF MOV EVADR,-(SP) .ENDC .IF B,VALUE .PRINT ;**WARNING ** KPWAIT NUMBER ARG BLANK...DEFAULT -1 MOV #-1,-(SP) .IFF MOV VALUE,-(SP) $DIR$ 30 .ENDM .MACRO ORGWAT EVTAB MOV EVTAB,-(SP) $DIR$ 31 .ENDM .MACRO TWAIT TBLADR MOV TBLADR,-(SP) $DIR$ 32 .ENDM ;MACRO LIBRARY FOR MSX0 ; THIS SET OF ROUTINES IS CONDITIONED BY THE FOLLOWING: ; ; $$DOS IF UNDEFINED, GIVES RSX11 (M) VERSION ; NODOS IF DEFINED, GIVES STAND-ALONE DUAL MODE MSX IF $$DOS DEFINED. ; IF ONLY $$DOS DEFINED, MSX MACROS FOR DOS-11 BASED MSX ARE GENERATED. ; ; NOTE: PRESENT VERSIONS OF APR ALTERING COMMANDS ARE FOR RSX11M. ; RSX11D/IAS VERSIONS ARE POSSIBLE BUT NOT AVAILABLE HERE. ; .NLIST ;OMIT MACRO DEFS FROM LISTINGS. EXPANSIONS MAY OR MAY NOT LIST AS ;SELECTED BY ASSEMBLY TIME OPTIONS. ; ; WAIT FOR EVENT VARIABLE ; EFFECT: ; WAIT. CAUSES THE ISSUING TASK TO STOP EXECUTING UNTIL ; THE SPECIFIED EVENT VARIABLE BECOMES NONZERO. IF IT IS NONZERO AT ; THE TIME OF THE WAIT., THE TASK MAY RESUME IMMEDIATELY (IF IT IS ; THE HIGHEST PRIORITY TASK) ; EV IS ADDRESS OF EVENT VARIABLE, ANYWHERE IN THE TASK'S SPACE .MACRO WAIT. EV MOV EV,-(SP) .IF DF,$$DOS $DIR$ 0 .IFF JSR PC,MX.SV2 .WORD 0 .ENDC .ENDM WAIT. ; ; WAIT FOR LIST OF EVENT VARIABLES ; EFFECT: ; ORWAT. CAUSES THE ISSUING TASK TO BE SUSPENDED FROM ; EXECUTION UNTIL ANY OF THE EVENT VARIABLES ON THE LIST WHOSE ADDRESS ; IS PASSED TO IT BECOME NONZERO. THE LIST IS TERMINATED BY A ZERO ; WORD; ITS ADDRESS IS PUSHED. THE LIST OF EV ADDRESSES AND THE ; EVENT VARIABLES MAY BE ANYWHERE IN THE TASK'S SPACE. .MACRO ORWAT. EVTAB MOV EVTAB,-(SP) .IF DF,$$DOS $DIR$ 2 .IFF JSR PC,MX.SV2 .WORD 4 .ENDC .ENDM ORWAT. ; ; SUSPN. SUSPEND TASK EXECUTION UNTIL RESUME ; EFFECT: ; SUSPN. SUSPENDS THE EXECUTION OF THE CURRENT TASK UNTIL ; A RESUME IS ISSUED FOR IT BY ANOTHER TASK. .MACRO SUSPN. .IF DF,$$DOS $DIR$ 3 .IFF JSR PC,MX.SV2 .WORD 6 .ENDC .ENDM SUSPN. ; ; RESUME TASK THAT WAS SUSPENDED ; EFFECT: ; RESUM. CAUSES THE TASK RESUMED TO BE MADE ELIGIBLE ; FOR EXECUTION AND ITS ADDRESS TO BECOME THAT OF THE RESUME ; OR ITS LAST ADDRESS AFTER A SUSPN. DEPENDING ON WHETHER ; THE RESUME ADDRESS IS GIVEN. THE TASK NAME OR NUMBER IS ; PUSHED; THE RESUME ADDRESS (IN THE RESUMED TASK'S SPACE), ; ; .MACRO RESUM. TSKNAM,RESADR,EVADR .IF NB,EVADR MOV EVADR,-(SP) .IFF CLR -(SP) .ENDC .IF NB,RESADR MOV RESADR,-(SP) .IFF CLR -(SP) .ENDC MOV TSKNAM,-(SP) .IF DF,$$DOS $DIR$ 4 .IFF JSR PC,MX.SV2 .WORD 4+4 .ENDC .ENDM RESUM. ; ; REQUEST TASK ; EFFECT: ; RQST. WILL REQUEST THAT A TASK BE MADE ELIGIBLE ; TO RUN. THE TASK NAME MAY BE EITHER THE RAD50 NAME IN THE ; STL OR THE TASK NUMBER (0,1,2,3,4,...) FROM THE START OF ; THE STL. THE PRI ARGUMENT IS UNUSED IN MSX REQUESTS AND ; NOT REQUIRED HERE. .MACRO RQST. TSKNAM,EVADR .IF NB,EVADR MOV EVADR,-(SP) .IFF CLR -(SP) .ENDC CLR -(SP) MOV TSKNAM,-(SP) .IF DF,$$DOS $DIR$ 5 .IFF JSR PC,MX.SV2 .WORD 5+5 .ENDC .ENDM RQST. ; ; REQUEST TASK WITH PARTIAL PRIO ARBITRATION ; EFFECT: ; PRIRQ. REQUESTS A TASK TO BE ELIGIBLE TO RUN ; BUT ONLY COMPARES THE TASK'S (FIXED) PRIO WITH THE MAX ; OUTSTANDING TASK PRIORITY; IT MAY NOT CAUSE A FULL ; SCAN. .MACRO PRIRQ. TSKNAM,EVADR .IF NB,EVADR MOV EVADR,-(SP) .IFF CLR -(SP) .ENDC CLR -(SP) MOV TSKNAM,-(SP) .IF DF,$$DOS $DIR$ 1 .IFF JSR PC,MX.SV2 .WORD 1+1 .ENDC .ENDM PRIRQ. ; ; EXIT FROM TASK WITH OPTIONAL EV SIGNAL ; EFFECT: ; EXIT. WILL CAUSE A TASK TO STOP EXECUTING AND RETURN TO ; THE READY-TO-BE-REQUESTED STATE. IT WILL SIGNAL BY INCREMENTING ; THE EVENT VARIABLE IF SPECIFIED (STD ALONE MOVES 1 TO EV). ; .MACRO EXIT. EVADR .IF NB,EVADR MOV EVADR,-(SP) .IFF CLR -(SP) .ENDC .IF DF,$$DOS $DIR$ 6 .IFF CLR -(SP) ;FAKE PSW JSR PC,MX.PRX .ENDC .ENDM EXIT. ; ; DECLARE SIGNIFICANT EVENT ; EFFECT: ; DECLR. DECLARES A SIGNIFICANT EVENT AND CAUSES A ; MSX ATL SCAN WHICH MAY ACTIVATE OTHER TASKS. ; .MACRO DECLR. .IF DF,$$DOS $DIR$ 7 .IFF JSR PC,MX.SV2 .WORD 7+7 .ENDC .ENDM DECLR. ; ; FAST RUN OF TASK WITHOUT ARGUMENTS OR PRIO ARB ; EFFECT: ; QRUN WILL RUN THE TASK NUMBERED IN THE ARGUMENT ; WITHOUT PRIORITY ARBITRATION. THIS IS THE FASTEST FORM ; OF TASK CONTROL SWAP AND MAY BE DONE FROM KERNEL IN STANDALONE ; SYSTEM OR INT LEVEL IN RSX VERSION. NOTE THAT IF THE OPTIONAL ; ARGUMENT ARB IS USED IN THE STANDALONE VERSION, PRIO ARBITRATION ; WILL TAKE PLACE A LA PRIREQ ; .MACRO QRUN TSKNBR,ARB .IF DF,$$DOS .IF NDF,NODOS CLR -(SP) CLR -(SP) MOV #TSKNBR,-(SP) $DIR$ 5 .IFF .IF B,ARB SEC .IFF CLC .ENDC EMT TSKNBR .IFF MOV #>,R0 CLR -(SP) JSR PC,MX.RQU .ENDC .ENDM QRUN ; ; QUICK EXIT (STANDALONE VERSION) ; EFFECT: ; QXIT WILL EXIT THE TASK WITH NO EV SIGNALS. IN THE ; RSX VERSION IT EXPANDS TO A NORMAL EXIT ; .MACRO QXIT .IF DF,$$DOS .IF NDF,NODOS CLR -(SP) $DIR$ 6 .ENDC .IFF CLR -(SP) CLR -(SP) JSR PC,MX.PRX .ENDC .IF DF,$$DOS .IF DF,NODOS EMT 376 .ENDC .ENDC .ENDM QXIT ; ; ; READ DATA ; EFFECT: ; READ. READS DATA USING MSX FACILITIES ; NOTE THAT THE READ. MACRO GENERATES A Q BLOCK ON THE ; STACK. EV ADDRESSES AND LUNS ARE EXPECTED EXTERNALLY. ; .MACRO READ. LUN,EVADR,STADD,SIZE,BLKNBR QTRN. 4,LUN,EVADR,STADD,SIZE,BLKNBR .ENDM READ. ; ; WRITE DATA ; EFFECT: ; WRITES DATA, AS READ READS IT. ; .MACRO WRITE. LUN,EVADR,STADD,SIZE,BLKNBR QTRN. 2,LUN,EVADR,STADD,SIZE,BLKNBR .ENDM WRITE. ; ; DATA TRANSFER ; .MACRO QTRN. FNC,LUN,EVADR,STADD,NBYTES,BLKNBR,?LBL,?LBL2 .IF NDF,$$DOS .MCALL QIO$ BR LBL .IF IDN,FNC,2 LBL2: QIO$ IO.WVB,LUN,LUN,,EVADR,, .IFF LBL2: QIO$ IO.RVB,LUN,LUN,,EVADR,, .ENDC LBL: .IF NB,EVADR MOV EVADR,-(SP) .IFF CLR -(SP) .ENDC MOV #LBL2,-(SP) MOV #LUN,-(SP) JSR PC,MX.SV2 .WORD 8.+8. .IFF BR LBL LBL2: .WORD BLKNBR .WORD STADD .IF DF,IO$WDS .WORD /2 .IFF .WORD NBYTES .ENDC .WORD FNC .WORD 0 LBL: .IF NB,EVADR MOV EVADR,-(SP) .IFF CLR -(SP) .ENDC MOV #LBL2,-(SP) MOV #LUN,-(SP) $DIR$ 10 .ENDC .ENDM QTRN. ; ; I/O TRANSFER WITH PREDEFINED DPB'S (QTRAN BLOCKS OR QIO$ DPB) ; EFFECT: ; TRAN. STARTS A DATA TRANSFER (OR QUEUES ONE) USING ITS ; INPUT ARGUMENTS, ONE OF WHICH MUST BE A DPB ADDRESS FOR THE ; APPROPRIATE SYSTEM. ; ; MACRO GENDPB WILL GENERATE A DPB FOR THE APPROPRIATE ; FUNCTION (READ/WRITE) ON THE LUN FOR THE SYSTEM IN USE ; AND LABEL IT WITH THE GIVEN LABEL .MACRO GENDPB FUNCT,LUN,EVADR,STADD,NBYTES,BLKNBR .IF NDF,$$DOS ;RSX .MCALL QIO$ .IF IDN,FUNCT,READ ;READ QIO$ IO.RVB,LUN,LUN,,EVADR,, .IFF QIO$ IO.WVB,LUN,LUN,,EVADR,, .ENDC .IFF .WORD BLKNBR .WORD STADD .IF DF,IO$WDS .WORD /2 .IFF .WORD NBYTES .ENDC .IF IDN,FUNCT,READ .WORD 4 .IFF .WORD 2 ;WRITE .ENDC .WORD 0 .ENDC .ENDM GENDPB ; .MACRO TRAN. EVADR,DPBADR,LUNNO .IF B,EVADR CLR -(SP) .IFF MOV EVADR,-(SP) .ENDC MOV DPBADR,-(SP) .IF NB,LUNNO MOV LUNNO,-(SP) .IFF CLR -(SP) .ENDC .IF DF,$$DOS $DIR$ 10 .IFF JSR PC,MX.SV2 .WORD 10+10 .ENDC .ENDM TRAN. ; ; GENERATE AND USE A DPB ON STACK FOR READ/WRITE ; (USES MSX. WAIT. AFTER I/O TO ALLOW PROPER ACCESS. ; SAVES AND RESTORES REGS USED.) .MACRO QIOW.S FUNCT,LUN,EVADR,STADD,NBYTES,BLKNO .IF NDF,$$DOS MOV R0,-(SP) MOV R1,-(SP) CLR -(SP) CLR -(SP) MOV SP,R0 ;IOSB CLR -(SP) CLR -(SP) CLR -(SP) .IF NB,BLKNO MOV BLKNO,-(SP) .IFF CLR -(SP) .ENDC CLR -(SP) CLR -(SP) MOV NBYTES,-(SP) MOV STADD,-(SP) CLR -(SP) MOV R0,-(SP) MOV LUN,-(SP) MOV (SP),-(SP) .IF IDN,FUNCT,READ MOV #IO.RVB,-(SP) .IFF MOV #IO.WVB,-(SP) .ENDC MOV (PC)+,-(SP) .BYTE 1,12. MOV SP,R1 ;DPB .IFF MOV R0,-(SP) MOV R1,-(SP) CLR -(SP) CLR -(SP) MOV SP,R0 CLR -(SP) ;IOSB=EV CLR -(SP) .IF IDN,FUNCT,READ MOV #4,-(SP) .IFF MOV #2,-(SP) .ENDC MOV NBYTES,-(SP) ; .IF DF,IO$WDS INC @SP ;MAKE WC ASR @SP ;FROM BC .ENDC .IF NB,BLKNO MOV BLKNO,-(SP) .IFF CLR -(SP) .ENDC MOV SP,R1 ;DPB .ENDC ;DO THE QTRAN. MOV R0,-(SP) MOV R1,-(SP) MOV LUN,-(SP) .IF DF,$$DOS $DIR$ 10 .IFF JSR PC,MX.SV2 .WORD 20 .ENDC MOV R0,-(SP) ;WAIT. .IF DF,$$DOS $DIR$ 0 .IFF JSR PC,MX.SV2 .WORD 0 .ENDC .IF DF,$$DOS ADD #16.,SP ;PASS DPB .IFF ADD #40,SP ;PASS DPB & EV .ENDC MOV (SP)+,R1 MOV (SP)+,R0 .ENDM .LIST