home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / apl / sharp / music.asm < prev    next >
Assembly Source File  |  1988-03-21  |  18KB  |  578 lines

  1. ; 1854339PC360:MUSIC:MUSIC.IPSA.ASM.60.31677. */
  2.   TITLE MUSIC  MUSIC AUXILIARY PROCESSOR.
  3. ; IF SINGLE VOICE SQUARE WAVES CAN BE CALLED MUSIC.
  4.  DATA SEGMENT
  5. ;
  6. INCLUDE  APDEFNA.PCC
  7. ;
  8. ; VARIOUS HARDWARE-RELATED EQUATES.
  9. ;
  10. SPKRGATE EQU   061H                ; TIMER GATE ADDRESS
  11. SPKRMODE EQU   043H                ; TIMER MODE ADDRESS
  12. SPKRSQU  EQU   03H                 ; TIMER MODE OF SQUARE WAVE.
  13. SPKRRATE EQU   042H                ; COUNTER VALUE FOR TIMER.
  14. TYPC     EQU   4                   ; SHARP APL CHARACTER TYPE.
  15. ;
  16. ;
  17. ; PERCMD FOR MUSIC AP.
  18. ;
  19. MYCMD PERCMD <SVPON,0,0,0,0>       ; COMMAND CODE.
  20. ;
  21. ; PERPCV FOR MUSIC AP.
  22. ;
  23. PROCID   EQU   440                 ; MY PROCESSOR ID.
  24. MYPCV PERPCV <PROCID,0,0,0,0,0,0>
  25. ; PROCESSOR ID,CLONEID,POSTCODES   ; PROCESSOR ID
  26. ;                        IP:CS VALUE CLONEID
  27. ;                             STACK GETS SETUP LATER.
  28. ;                               DX:DS VALUE, BP VALUE.
  29. ;
  30. ;        END OF PERPCV.
  31. ;
  32. SVDAT    DB    (4000) DUP (0)      ; LAST VALUE FROM APL.
  33. ;
  34. MYSCV    PERSCV <0,0,PROCID,0,0,0,0,0,0,MAXPSN>
  35. ;                COUNT
  36. ;                  SCVSOS
  37. ;                    ID,NID
  38. ;                          AVLUE,CHRON,SCVPO,OTHER,NOTHR
  39. ;                                    ID LENGTH,ANYID.
  40. ;
  41. MYSCVL   EQU   $-MYSCV             ; BYTE COUNT OF PERSCV
  42. THEPSP   DD    0                   ; SI:CS OF PROGRAM SEGMENT PREFIX.
  43. ASVDAT   DD    0                   ; MSADR OF SVDAT.
  44. AMYSCV   DD    0                   ; MSADR OF MY PERSCV.
  45. AMYCMD   DD    0                   ; MSADR OF MY PERCMD.
  46. TICKINT  EQU   4*01CH              ; THE TIMER TICK INTERRUPT.
  47. ;
  48. NOTETIME DB    0                   ; NUMBER OF TICKS LEFT IN THIS NOTE.
  49. NOTEINDEX DW   0                   ; BYTE INDEX OF CURR NOTE IN SVDAT
  50. NOTELIM  DW    0                   ; INDEX OF 1+LAST BYTE OF SVDAT
  51. TICKWORK DB    0                   ; WORK AT CLOCK TIME TIME.
  52. TICKENAB EQU   01H                 ; ENABLE MUSIC.
  53. TICKDEC  EQU   02H                 ; DECREMENT REMAINING NOTE TIME.
  54. ;       UNUSED 0FCH                ; UNUSED BITS.
  55. SHARING  DB    0                   ; DEGREE OF COUPLING.
  56. PPI      DW    0                   ; THE PERPROC INDEX OF AP440.
  57. VECTOR   EQU   4                   ; ORANK VALUE FOR VECTOR.
  58. OKTEXT   DB    TYPC,0,0,VECTOR     ; CHARACTER VECTOR RESULT.
  59.          DB    0,0,0,2             ; NUMBER OF CHARACTERS IN RESULT.
  60.          DB    QO,QK,QBLANK,QBLANK ; THE RESULT.
  61. OKTEXTZ  EQU   $
  62. ;
  63. BADTEXT  DB    TYPC,0,0,VECTOR
  64.          DB    0,0,0,3
  65.          DB    QB,QA,QD,QBLANK
  66. BADTEXTZ EQU   $
  67. ;
  68. TXHIMSG  DB  'SHARP APL Music Auxiliary Processor'
  69.          DB  0DH,0AH,'Copyright 1984 by I.P. Sharp Associates Limited.'
  70.          DB  0DH,0AH,24H
  71. ;
  72. NOSVPMSG DB 'SVP NOT RUNNING.',0DH,0AH,24H
  73. SVPFAILMSG  DB 'SVP SIGNON FAILED',0DH,0AH,24H
  74. ;
  75. DATA ENDS;
  76. ;
  77. STAK     SEGMENT STACK             ; MUSIC'S STACK SEGMENT.
  78.          DB    300 DUP (0)         ; MAYBE BIG ENOUGH.
  79. STAK     ENDS;
  80. ;
  81. MUSIC SEGMENT BYTE PUBLIC
  82. ;
  83.          ASSUME CS:MUSIC,SS:STAK   ; WE RUN ON LIMITED RESOURCES.
  84. ;
  85. MYDS     DW    0                   ; DS VALUE DURING INTERRUPT RTN.
  86. TICKNEXT DD    0                   ; THE NEXT TIMER TICK INTERRUPT RTN.
  87. ;
  88. MYTICKINT PROC NEAR
  89. ;
  90. ; THIS ROUTINE GETS CONTROL AT 18.2HZ, WHEN THE TIMER TICK INTERRUPT
  91. ; GOES OFF.
  92. ;
  93.          PUSH  AX
  94.          PUSH  BX
  95.          PUSH  SI
  96.          PUSH  DS
  97.          MOV   DS,MYDS             ; FIND OUR DATA.
  98.          ASSUME DS:DATA            ; TELL THE ASSEMBLER ABOUT IT.
  99.          TEST  TICKWORK,TICKDEC+TICKENAB ; ANY WORK TO DO?
  100.          JNZ   DOWORK              ; YES.
  101. ;
  102. TICKZ:   POP   DS
  103.          POP   SI
  104.          POP   BX
  105.          POP   AX
  106.          ASSUME DS:NOTHING
  107.          JMP   TICKNEXT            ; ON TO NEXT INTERRUPT GRABBER.
  108. ;
  109. ;        WE HAVE SOMETHING USEFUL TO DO DURING THIS CLOCK TICK.
  110. ;
  111.          ASSUME DS:DATA            ; TELL THE ASSEMBLER ABOUT IT.
  112. DOWORK:  TEST  TICKWORK,TICKENAB   ; CLOCK ENABLE TO DO?
  113.          JZ    DOTICK              ; NO. ASSUME DECREMENT ONLY.
  114.          AND   TICKWORK,255-TICKENAB
  115.          CALL  MON                 ; YES. ENABLE SPEAKER.
  116.          OR    TICKWORK,TICKDEC    ; START DECREMENTING.
  117. ;
  118. DOTICK:  TEST  TICKWORK,TICKDEC    ; DECREMENT NOTE TIME?
  119.          JZ    TICKZ               ; NO. WE'RE DONE.
  120. ;
  121. ;        DECREMENT TIME REMAINING ON THIS NOTE.
  122. ;
  123.          DEC   NOTETIME            ; PICK UP TIME REMAINING ON NOTE.
  124.          JZ    NEWNOTE             ; EXPIRED. PICK UP NEXT NOTE.
  125.          JMP   TICKZ
  126. ;
  127. ;        NOTE TIME EXPIRED. PICK UP NEXT NOTE, IF ANY.
  128. ;
  129. NEWNOTE: MOV   AX,NOTEINDEX        ; INCREMENT TO NEXT NOTE.
  130.          ADD   AX,3
  131.          CMP   AX,NOTELIM          ; END OF ARRAY OF NOTES?
  132.          JNB   NOTEZ               ; YES
  133.          MOV   NOTEINDEX,AX        ; NO. GET NEXT NOTE.
  134.          MOV   SI,AX
  135.          MOV   AX,WORD PTR SVDAT[SI]; GET FREQUENCY OF NEXT NOTE.SORTA
  136.          XCHG  AL,AH
  137.          OUT   SPKRRATE,AL         ; TELL FREQUNCY COUNTER ABOUT IT.
  138.          XCHG  AL,AH
  139.          OUT   SPKRRATE,AL
  140.          MOV   AL,BYTE PTR SVDAT[SI+2] ; GET NOTE DURATION.
  141.          MOV   NOTETIME,AL             ; IN 18.2HZ UNITS.
  142.          JMP   TICKZ               ; WE IS DONE.
  143. ;
  144. ; END OF CURRENT MUSIC STRING.
  145. ;
  146. NOTEZ:   CALL  MOFF                ; DISABLE THE MUSIC.
  147.          MOV   TICKWORK,0          ; NO MORE WORK TO DO.
  148. ;
  149. ; POST THE ROUND-ROBIN TASK SO IT CAN TELL APL WE'RE DONE WITH
  150. ; THIS STRING OF MUSIC.
  151. ;
  152.          MOV   BX,PPI              ; THE PERPROC INDEX OF THE AP.
  153.          MOV   AX,PERPAP0          ; WHY WE'RE POSTING THE AP.
  154.          INT   INTPOST
  155.          JMP   TICKZ
  156. ;
  157. MYTICKINT ENDP;
  158. ;
  159. ;        FUNCTION TO TURN OFF MUSIC.
  160. ;
  161. MOFF     PROC  NEAR
  162.          CLI                       ; AVOID RACE CONDITIONS.
  163.          IN    AL,SPKRGATE
  164.          AND   AL,0FDH             ; DEGATE THE SPEAKER.
  165.          OUT   SPKRGATE,AL
  166.          STI                       ; AVOID RACE CONDITIONS.
  167.          RET
  168. MOFF     ENDP
  169. ;
  170. ;        FUNCTION TO TURN ON MUSIC.
  171. ;
  172. MON      PROC  NEAR
  173.          CLI                       ; AVOID RACE CONDITIONS.
  174.          IN    AL,SPKRGATE
  175.          OR    AL,03H              ; GATE THE SPEAKER.
  176.          OUT   SPKRGATE,AL
  177.          STI                       ; AVOID RACE CONDITIONS.
  178.          RET
  179. MON      ENDP
  180.          ASSUME CS:NOTHING,DS:NOTHING ; END OF INTERRUPT HANDLER.
  181. ;
  182. ; THE FOLLOWING ROUTINES ARE CALLED WHEN WE ARE UNDER CONTROL
  183. ; OF THE TASK DISPATCHER.
  184. ;
  185.          ASSUME CS:MUSIC,DS:DATA,SS:STAK
  186. ;
  187. ; MESSAGE WRITER.
  188. ;
  189. WRMSG PROC NEAR
  190. ; DS:[DX] IS 1ST BYTE  $ (024H)TERMINATES
  191.   MOV AH,9 ;PRINT STRING.
  192.   INT 21H
  193.   RET
  194. WRMSG ENDP
  195. ;
  196. GOSVP    PROC  NEAR;               ; INVOKE SVP.
  197.          MOV   AX,WORD PTR AMYCMD
  198.          MOV   BX,WORD PTR AMYCMD+2
  199.          INT   INTSVP
  200.          RET   ;
  201. GOSVP    ENDP  ;
  202. ;
  203. ;
  204. GRABTIMER PROC NEAR
  205. ;
  206. ; STEAL THE TIMER TICK INTERRUPT IN SUCH A MANNER THAT WE CAN GIVE
  207. ; IT BACK AT SHUTDOWN TIME.
  208. ;
  209.          XOR   AX,AX
  210.          MOV   ES,AX
  211.          CLI                       ; NO INTERRUPTS NOW,PLEASE.
  212.          MOV   AX,WORD PTR ES:[TICKINT] ; OFFSET.
  213.          MOV   WORD PTR TICKNEXT,AX
  214.          MOV   AX,WORD PTR ES:[TICKINT+2];SEGMENT.
  215.          MOV   WORD PTR TICKNEXT+2,AX   ;WE'VE STOLEN IT.
  216.          MOV   AX,OFFSET MYTICKINT ; MY TIMER TICK ROUTINE.
  217.          MOV   WORD PTR ES:[TICKINT],AX
  218.          MOV   AX,CS
  219.          MOV   WORD PTR ES:[TICKINT+2],AX
  220.          STI
  221.          RET
  222. GRABTIMER ENDP;
  223. ;
  224. ;
  225. UNGRABTIMER PROC NEAR
  226. ;
  227. ; RESTORE THE TIMER TICK INTERRUPT AT SHUTDOWN TIME.
  228. ;
  229.          XOR   AX,AX
  230.          MOV   ES,AX
  231.          CLI                       ; NO INTERRUPTS NOW,PLEASE.
  232.          MOV   AX,WORD PTR TICKNEXT;THE STOLEN VALUE.
  233.          MOV   WORD PTR ES:[TICKINT],AX
  234.          MOV   AX,WORD PTR TICKNEXT+2
  235.          MOV   WORD PTR ES:[TICKINT+2],AX
  236.          STI
  237.          RET
  238. UNGRABTIMER ENDP;
  239. ;
  240. ;
  241. ;
  242. ;        FUNCTION TO TURN ES:SI INTO MSADR IN AX,BX IN JRGS FORMAT.
  243. ;
  244. SEGTOMS PROC NEAR;
  245.          MOV   AX,ES
  246.          XOR   BX,BX
  247.          MOV   CX,4
  248. L1:      SAL   AX,1
  249.          RCL   BX,1
  250.          LOOP  L1
  251.          ADD   AX,SI
  252.          ADC   BX,0
  253. ;        RESULT FORMAT IN AX,BX IS: 2 3  0 1
  254. ;        THIS WILL STORE INTO MAINSTORE AS 3 2 1 0.
  255. ;
  256.          RET
  257. SEGTOMS ENDP;
  258. ;
  259. ; THE FOLLOWING PROCEDURE IS CALLED WHEN THE AP DETECTS SOME SORT
  260. ; OF ERROR.
  261. ;
  262. BEEP     PROC  NEAR
  263.          MOV   AX,OFFSET BADTEXT
  264.          MOV   BX,BADTEXTZ-BADTEXT
  265.          CALL  GOREPLY
  266.          RET
  267. BEEP     ENDP
  268. ;
  269. ; THE FOLLOWING PROCEDURES ARE CALLED WHEN WE GET DISPATCHED, AND
  270. ; THE RELEVANT BIT SETTINGS IN THE PERPCV ARE ON.
  271. ;
  272. ;
  273. ;        THIS FUNCTION GETS CONTROL WHEN WE OBSERVE A SET BY THE
  274. ;        PARTNER.
  275. ;
  276. GOSET    PROC  NEAR
  277. ;        OTHER SIDE MAY HAVE SET. ATTEMPT TO OBTAIN A VALUE.
  278. ;
  279.          MOV   MYCMD.PCCMD,SVPUIS
  280.          MOV   AX,WORD PTR MYSCV.SCVPO
  281.          MOV   WORD PTR MYCMD.PCP1,AX
  282.          MOV   AX,WORD PTR MYSCV.SCVPO+2
  283.          MOV   WORD PTR MYCMD.PCP1+2,AX
  284.          CALL  GOSVP
  285. ;
  286.          AND   AL,255-SVZNOS       ;IGNORE SHARE VS OFFER.
  287.          CMP   AL,SVZNE            ; IS THERE A VALUE?
  288.          JE    GETVAL              ; YES.
  289. NOGOT:   CALL  BEEP                ; NO. STRANGE.
  290.          RET
  291. ;
  292. GETVAL:  CMP   WORD PTR MYCMD.PCP2+2,0 ; IS VALUE VERY LARGE?
  293.          JE    GETVAL1
  294.          CALL  BEEP
  295. GETVAL1: MOV   WORD PTR MYCMD.PCP3+2,0
  296.          MOV   AX,WORD PTR MYCMD.PCP2
  297.          CMP   AX,LENGTH SVDAT
  298.          JNA   GETVAL2
  299.          CALL  BEEP
  300.          MOV   AX,LENGTH SVDAT
  301. GETVAL2: MOV   WORD PTR MYCMD.PCP3,AX ; GET VALUE OF VARIABLE.
  302.          MOV   MYCMD.PCCMD,SVPUDT
  303.          MOV   AX,WORD PTR ASVDAT  ; ADDRESS OF OUR BUFFER.
  304.          MOV   WORD PTR MYCMD.PCP2,AX
  305.          MOV   AX,WORD PTR ASVDAT+2
  306.          MOV   WORD PTR MYCMD.PCP2+2,AX
  307.          CALL  GOSVP
  308.          AND   AL,255-SVZNOS
  309.          CMP   AL,SVZNE
  310.          JNE   NOGOT
  311. ;
  312. ;        WE GOT THE VALUE INTO SVSTORE. CHECK THE VALUE, AND
  313. ;        SETUP FOR PLAYING.
  314. ;
  315.          CMP   BYTE PTR SVDAT+3,8  ;RANK MUST BE MATRIX.
  316.          JNE   NOGOT
  317.          CMP   BYTE PTR SVDAT,TYPC
  318.          JNE   NOGOT
  319. ;
  320. ;        THE NEW VALUE IS GOOD.
  321. ;
  322.          CALL  MOFF
  323.          CLI
  324.          MOV   AX,12-3             ; OFFSET OF FIRST DATA BYTE,
  325.          MOV   NOTEINDEX,AX        ; LESS PREINCREMENT.
  326.          MOV   AX,WORD PTR SVDAT+6 ; BYTE COUNT.
  327.          OR    AX,AX               ; DID USER SET EMPTY ARRAY?
  328.          JZ    GONONE              ; YES. IGNORE THE SET.
  329.          XCHG  AL,AH
  330.          ADD   AX,12               ; PLUS OFFSET OF FIRST ELEMENT.
  331.          MOV   NOTELIM,AX
  332.          MOV   TICKWORK,TICKENAB   ; ENABLE CLOCK AT NEXT TICK.
  333.          MOV   NOTETIME,1          ; FORCE REFETCH ON NEXT TICK.
  334. GONONE:  STI                       ; ALLOW CLOCK TICKING.
  335.          RET
  336. GOSET    ENDP;
  337. ;
  338. ;
  339. GOREPLY  PROC  NEAR
  340. ;
  341. ;        THIS FUNCTION GETS CONTROL WHEN WE WISH TO SEND A REPLY
  342. ;        TO OUR PARTNER.
  343. ;
  344. ;        AX IS THE OFFSET OF THE REPLY.
  345. ;        BX IS THE BYTE COUNT OF THE REPLY.
  346. ;
  347.          PUSH  AX
  348.          PUSH  BX
  349. ;        INTERLOCK THE VARIABLE.
  350.          MOV   MYCMD.PCCMD,SVPSIS
  351.          MOV   AX,WORD PTR MYSCV.SCVPO
  352.          MOV   WORD PTR MYCMD.PCP1,AX
  353.          MOV   AX,WORD PTR MYSCV.SCVPO+2
  354.          MOV   WORD PTR MYCMD.PCP1+2,AX
  355.          CALL  GOSVP
  356. ;
  357.          MOV   MYCMD.PCCMD,SVPSDT  ; ASSUME WE HAVE VARIABLE NOW.
  358.          POP   AX                  ; TRANSFER THE DATA.
  359.          MOV   WORD PTR MYCMD.PCP3,AX ; BYTE COUNT.
  360.          XOR   AX,AX
  361.          MOV   WORD PTR MYCMD.PCP3+2,AX
  362.          POP   SI                  ; OFFSET OF VALUE.
  363.          PUSH  DS
  364.          POP   ES
  365.          CALL  SEGTOMS
  366.          MOV   WORD PTR MYCMD.PCP2,AX
  367.          MOV   WORD PTR MYCMD.PCP2+2,BX
  368.          CALL  GOSVP
  369.          RET                       ; A SERIOUS USER WOULD CHECK FOR
  370.                                    ; ERRORS IN THESE FUNCTIONS.
  371. ;
  372. GOREPLY  ENDP;
  373. ;
  374. ;        THIS FUNCTION GETS CONTROL WHEN WE RECEIVE AN OFFER.
  375. ;
  376. GOOFFER  PROC  NEAR
  377. ;
  378. ;        FIRST OF ALL, IGNORE THE OFFER IF WE'RE ALREADY SHARING.
  379. ;
  380.          CMP   SHARING,2
  381.          JE    GOOFERZ
  382. ;
  383. ;        WE'RE NOT SHARING. LET'S MAKE AN OFFER. CLEAR THE PERSCV.
  384. ;
  385.          MOV   CX,MYSCVL
  386.          XOR   AL,AL
  387.          PUSH  DS
  388.          POP   ES
  389.          MOV   DI,OFFSET MYSCV
  390.          REP   STOSB
  391.          MOV   WORD PTR MYSCV.SCVID,PROCID    ; REFRESH PROCID.
  392.          MOV   BYTE PTR MYSCV.SCVNAMEL,MAXPSN ; LONGEST NAME LENGTH.
  393.          MOV   MYCMD.PCCMD,SVPSVQ       ;SCAN TO FIND THE OFFER
  394.          MOV   BYTE PTR MYSCV.SCVNAME,0 ; ACCEPT ANY NAME.
  395.          MOV   AX,WORD PTR AMYSCV
  396.          MOV   WORD PTR MYCMD.PCP1,AX
  397.          MOV   AX,WORD PTR AMYSCV+2
  398.          MOV   WORD PTR MYCMD.PCP1+2,AX
  399.          CALL  GOSVP
  400.          AND   AL,0FEH             ;IGNORE SVZNOS.
  401.          CMP   AL,SVZNE
  402.          JNE   GOOFNO              ; COULDN'T FIND OFFER.
  403. ;        FOUND OFFER. SHARE WITH IT.
  404.          MOV   MYCMD.PCCMD,SVPSVO  ; SHARE.
  405.          CALL  GOSVP
  406.          MOV   SHARING,2           ; WE'RE SHARING(MAYBE)
  407.          CMP   AL,SVZNE
  408.          JE    GOOFEROK            ; SHARE WORKED. SEE IF WE GOT DATA.
  409. GOOFNO:  CALL  BEEP                ; SHARE FAILED. TELL SOMEONE.
  410. ;        NO SHARE OBTAINED. RETRACT OUR OFFER.
  411. GORETR:  MOV   MYCMD.PCCMD,SVPSVR
  412.          MOV   AX,WORD PTR MYSCV.SCVPO
  413.          MOV   WORD PTR MYCMD.PCP1,AX
  414.          MOV   AX,WORD PTR MYSCV.SCVPO+2
  415.          MOV   WORD PTR MYCMD.PCP1+2,AX
  416.          CALL  GOSVP
  417.          MOV   SHARING,0           ; WE'RE NOT SHARING.
  418. GOOFERZ: RET
  419. ;
  420. ;        SHARE WORKED. SEE IF A VALUE IS AVAILABLE.
  421. ;
  422. GOOFEROK:CALL  GOSET; SEE IF A VALUE IS AVAILABLE.
  423.          RET;
  424. GOOFFER  ENDP
  425. ;
  426. ; SHUTDOWN ROUTINE FOR MUSIC AP.
  427. ;
  428. GOSHUT   PROC  NEAR
  429.          CALL  UNGRABTIMER         ; GIVE BACK TIMER TICK ROUTINE.
  430.          CALL  MOFF                ; STOP THE BUBBLE MACHINE.
  431.          RET                       ; AND RETURN TO THE TASK DISPATCHER.
  432. GOSHUT   ENDP
  433. ;
  434. ; THIS FUNCTION GETS CONTROL WHEN WE ARE POSTED BY THE TASK DISPATCHER
  435. ; AS THE RESULT OF A SHARED VARIABLE ARRIVING FROM APL, OR AT SHUTDOWN
  436. ; TIME.
  437. ;
  438. PLAY     PROC  FAR
  439. ;
  440. ; WE'VE BEEN POSTED BY THE TASK DISPATCHER. FIND OUT WHY.
  441. ;
  442.          TEST  MYPCV.PCVPOST,PERPSET ; OTHER SIDE DID A SET.
  443.          JZ    NOTSET
  444.          CALL  GOSET
  445. ;
  446. NOTSET:  TEST  MYPCV.PCVPOST,PERPOFFR; SOMEONE OFFERED TO US.
  447.          JZ    NOTOFFER
  448.          CALL  GOOFFER
  449. ;
  450. NOTOFFER:TEST  MYPCV.PCVPOST,PERPRETR; OTHER SIDE RETRACTED.
  451.          JZ    NOTRETR
  452.          CALL  GORETR
  453. ;
  454. ;
  455. NOTRETR: TEST  MYPCV.PCVPOST,PERPSHUT
  456.          JZ    NOTSHUT
  457.          CALL  GOSHUT
  458. ;
  459. ;        CHECK FOR POST BY TIMER INTERRUPT ROUTINE.
  460. ;
  461. NOTSHUT: TEST  MYPCV.PCVPOST,PERPAP0 ; END OF TUNE?
  462.          JZ    PLAYZ               ; NOPE.
  463.          MOV   AX,OFFSET OKTEXT    ; YES. TELL PARTNER WE'RE DONE.
  464.          MOV   BX,OKTEXTZ-OKTEXT
  465.          CALL  GOREPLY
  466. ;
  467. ;        POSTED FOR OTHER REASON. WE'LL IGNORE IT.
  468. ;
  469. PLAYZ:   RET                       ; RETURN TO TASK DISPATCHER.
  470. PLAY     ENDP;
  471. ;
  472. ;
  473. ; MUSIC AP FOR SHARP APL/PC: ENTRY POINT.
  474. ;
  475. MUSICEP  PROC FAR
  476. ;
  477. ;        SETUP DS
  478. ;
  479.          ASSUME DS:NOTHING
  480.          PUSH  DS                  ;SAVE PSP ADDRESS.
  481.          MOV   SI,DATA
  482.          MOV   DS,SI
  483.          ASSUME DS:DATA
  484.          POP   SI                  ; ADDRESS OF PSP.
  485.          MOV   WORD PTR THEPSP,SI
  486.          MOV   WORD PTR THEPSP+2,CS
  487. ;
  488. ;        SETUP THE PERPCV ENTRY.
  489. ;
  490. SPVAL    EQU   320              ;SIZE OF STACK, USED HERE AND AT TASR
  491.          MOV   WORD PTR MYPCV.PCVTSS+2,SS
  492.          MOV   WORD PTR MYPCV.PCVTSS,SPVAL ;SPACE FOR STACK
  493.          MOV   WORD PTR MYPCV.PCVTDS+2,DS
  494.          MOV   WORD PTR MYPCV.PCVTCS+2,CS
  495.          MOV   WORD PTR MYPCV.PCVTCS,OFFSET PLAY
  496. ;
  497. ;        SETUP VARIOUS NUMBERS WE'LL NEED
  498. ;        FROM TIME TO TIME.
  499. ;
  500.          MOV   MYDS,DS
  501.          PUSH  DS                  ;SETUP ADDRESSES OF PERCMD,PERSCV
  502.          POP   ES
  503.          MOV   SI,OFFSET MYCMD
  504.          CALL  SEGTOMS
  505.          MOV   WORD PTR AMYCMD,AX
  506.          MOV   WORD PTR AMYCMD+2,BX
  507. ;
  508.          MOV   SI,OFFSET SVDAT
  509.          CALL  SEGTOMS
  510.          MOV   WORD PTR ASVDAT,AX
  511.          MOV   WORD PTR ASVDAT+2,BX
  512. ;
  513.          MOV   SI,OFFSET MYSCV
  514.          CALL  SEGTOMS
  515.          MOV   WORD PTR AMYSCV,AX
  516.          MOV   WORD PTR AMYSCV+2,BX
  517. ;
  518. ; ATTEMPT TO SIGNON TO THE SVP.
  519. ;
  520.          XOR   AX,AX
  521.          MOV   ES,AX
  522.          MOV   AX,ES:WORD PTR[2+INTSVP*4]
  523.          OR    AX,ES:WORD PTR[INTSVP*4];ASSUME SVP ISN'T IN SEGMENT 0.
  524.          JZ    NOSVP               ; NO SVP. TOO BAD.
  525. ;
  526. ; SVP APPEARS TO EXIST. ATTEMPT THE SIGNON.
  527. ;
  528. ; PASS ADDRESS OF PCV IN PCP1.
  529. ;
  530.          PUSH  DS
  531.          POP   ES
  532.          MOV   SI,OFFSET MYPCV.PCVID
  533.          CALL  SEGTOMS
  534.          MOV   WORD PTR MYCMD.PCP1,AX
  535.          MOV   WORD PTR MYCMD.PCP1+2,BX
  536. ;
  537. ;        ATTEMPT SIGNON TO SVP.
  538. ;
  539.          CALL  GOSVP
  540. ;
  541. ;        IF THE SIGNON FAILED, FORGET IT.
  542. ;
  543.          CMP   AX,SVZNE
  544.          JNE   SVPFAIL
  545. ;
  546. ;        SIGNON TO SVP WORKED.
  547. ;
  548.          MOV   AX,MYCMD.PCP2       ;PRESERVE THE TASK IDENTIFIER.
  549.          MOV   PPI,AX
  550.          CALL  GRABTIMER           ; START BORROWING TIMER INTERRUPTS.
  551.          MOV   DX,OFFSET TXHIMSG   ;POINT TO MESSAGE TEXT.
  552.          CALL  WRMSG;
  553. ;
  554. ;        NOW TERMINATE AND STAY RESIDENT.
  555. ;
  556.          MOV   DX,SS
  557.          PUSH  DS                 ;OUR DATA SEGMENT IS FIRST
  558.          POP   AX
  559.          SUB   DX,AX              ;SS-DS
  560.          ADD   DX,16              ;ROOM FOR PSP
  561.          MOV   CL,4               ; TIMES 16
  562.          SHL   DX,CL              ;SPACE NEEDED AS BYTES
  563.          ADD   DX,SPVAL           ;SPACE FOR STACK
  564.          INT   27H
  565. ;        NOW WE ONLY GET DISPATCHED BY SVP AND TASK DISPATCHER.
  566. ;
  567. NOSVP:   MOV   DX,OFFSET NOSVPMSG
  568.          CALL  WRMSG
  569.          JMP   TERMINATE
  570. ;
  571. SVPFAIL: MOV   DX,OFFSET SVPFAILMSG
  572.          CALL  WRMSG
  573. TERMINATE: JMP THEPSP         ; TERMINATE THIS AP.
  574. ;
  575. MUSICEP  ENDP
  576. MUSIC ENDS;
  577.   END MUSICEP
  578.