home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 3 / PDCD_3.iso / pocketbk / developmen / s3frame / FRAMELIB.OPL next >
Text File  |  1993-01-17  |  14KB  |  302 lines

  1. REM APPLICATION FRAMEWORK FOR PSION SERIES 3.
  2. REM =========================================
  3. REM By: John Hind. (Full documentation in FRAMELIB.TXT)
  4.  
  5. PROC fVer%:          REM Returns the version number of the library
  6.                      REM -----------------------------------------
  7.  RETURN 202
  8. ENDP
  9.  
  10. PROC fLock:          REM Used in application callbacks prior to DIALOG or ALERT use
  11.                      REM ----------------------------------------------------------
  12.  BUSY OFF
  13.  LOCK ON
  14. ENDP
  15.  
  16. PROC fUnlock:        REM Used in application callbacks after DIALOG or ALERT use
  17.                      REM -------------------------------------------------------
  18.  BUSY "busy....",1,2
  19.  LOCK OFF
  20. ENDP
  21.  
  22. PROC fMenu%:         REM Used in application callbacks in place of MENU routine
  23.                      REM ------------------------------------------------------
  24.  LOCAL r%
  25.  BUSY OFF
  26.  LOCK ON
  27.  USR(ADDR(fPt1&(1)),ADDR(fPt3&(1)),0,0,0)
  28.  r%=MENU
  29.  USR(ADDR(fPt2&(1)),ADDR(fPt3&(1)),0,0,0)
  30.  BUSY "busy....",1,2
  31.  LOCK OFF
  32.  RETURN(r%)
  33. ENDP
  34.  
  35. PROC fAutoOff:       REM Used in application initialisations to enable auto-off
  36.                      REM ------------------------------------------------------
  37.  CALL($138B,0,0,0,0,0)
  38. ENDP
  39.  
  40. PROC fRun:(mesMsk%,hkMsk$,sysE%)  REM Main Application Framework routine
  41.                                   REM ----------------------------------
  42.  GLOBAL fParm%       REM Message Parameter
  43.  GLOBAL fParm$(128)  REM Message Parameter
  44.  GLOBAL fKmod%       REM Key modifier status at last key message
  45.  GLOBAL fPt1&(7)     REM Machine code storage for menu routine fix
  46.  GLOBAL fPt2&(7)     REM ""
  47.  GLOBAL fPt3&(8)     REM ""
  48.  LOCAL t%,j&,t&      REM These declarations must be in this order on their own.
  49.  REM   t%            REM Ticks (1/32ths of second)
  50.  REM   j&            REM Unknown (just a place-holder)
  51.  REM   t&            REM Time in seconds since the year dot
  52.  LOCAL fFopen%       REM True if a file is currently open
  53.  LOCAL fCStat%       REM Command/key status (-46=pending, 0=ready)
  54.  LOCAL fTStat%       REM Timer status (-46=pending, 0=ready)
  55.  LOCAL fTCB%         REM Handle for timer control block
  56.  LOCAL fS&           REM Elapsed seconds at last timer message
  57.  LOCAL fMask%        REM Message mask set (bits)
  58.  LOCAL fHkMsk$(30)   REM Hotkey mask set (characters in string)
  59.  LOCAL fSys%         REM System error handling enabled
  60.  LOCAL k%(2)         REM Parameters from command/key request
  61.  LOCAL m%            REM Current message
  62.  LOCAL mn%           REM Next message
  63.  LOCAL a%(6)         REM Used for parsing filenames
  64.  LOCAL init%         REM True during processing of initialisation messages
  65.  LOCAL wait%         REM True when waiting for events
  66.  LOCAL x&,x%,y&      REM Working variables
  67.  
  68.  BUSY "busy....",1,2                    REM Not responsive to user input until initialised
  69.  
  70.  fPt1&(1)=&8BF88BFC                     REM Machine code for menu fix from
  71.  fPt1&(2)=&8B00121E                     REM PSION application note MENPAT.TXT
  72.  fPt1&(3)=&778B205F
  73.  fPt1&(4)=&E42AAC0C
  74.  fPt1&(5)=&A5ABC88B
  75.  fPt1&(6)=&75C084AC
  76.  fPt1&(7)=&CBF8E2FB
  77.  fPt2&(1)=&00B4F08B
  78.  fPt2&(2)=&FC808BCD
  79.  fPt2&(3)=&AD0D7330
  80.  fPt2&(4)=&C932D08B
  81.  fPt2&(5)=&CDD88BAD
  82.  fPt2&(6)=&F8754ACF
  83.  fPt2&(7)=&CB
  84.  
  85.  m%=0                                   REM Initialise no messages pending
  86.  fFopen%=0                              REM File not open
  87.  fTStat%=-46                            REM Timers not running, so fake pending
  88.  init%=-1                               REM Initial masks still to be processed
  89.  wait%=0                                REM Not waiting: events to be processed
  90.  fSys%=sysE%                            REM System error status
  91.  
  92.  fParm$=CMD$(2)                         REM Initial Filename
  93.  IF CMD$(3)="C"
  94.   m%=101                                REM Create file command
  95.  ELSEIF CMD$(3)="O"
  96.   m%=102                                REM Open file command
  97.  ENDIF
  98.  
  99.  IOA(-2,14,fCStat%,k%(1),#0)            REM Queue asynchronous keyboard/command request
  100.  IF fSys% :ONERR sysErr :ENDIF          REM Enable System Errors
  101.  
  102.  DO                                     REM START OF MAIN MESSAGE PROCESSING LOOP
  103.                                         REM -------------------------------------
  104.  
  105.   Restart::                             REM Re-entry for application errors
  106.  
  107.   IF m%=0                               REM NO FRAME MESSAGES PENDING
  108.    IF fTStat%=-46 AND fCStat%=-46       REM NO SYSTEM MESSAGES PENDING
  109.     IF wait%                            REM NOTHING TO DO AT PRESENT
  110.      BUSY OFF                           REM Responsive to user input
  111.      IOWAIT                             REM Suspend the application
  112.      BUSY "busy....",1,2                REM Not responsive to user input while processing
  113.     ELSE
  114.      m%=11                              REM The "nothing better to do message"
  115.      wait%=-1                           REM Suspend at next cycle if no system messages
  116.     ENDIF
  117.    ENDIF
  118.  
  119.    IF fTStat%<>-46                      REM TIMER MESSAGE PENDING
  120.     wait%=0                             REM Message rx, not in wait mode
  121.     CALL($078b,0,10,0,$41c,addr(t%))    REM Fetch time information
  122.     x%=SECOND                           REM Current (clock) seconds
  123.     y&=10-((t% AND $1f)*10)/32          REM Calculate timer ticks to next whole second
  124.     x&=t&-fS&                           REM Elapsed seconds since last message generated
  125.     fS&=t&                              REM Store current seconds for next cycle
  126.     IF (fMask% AND $80)                 REM TIMER IS MINUTES TIMER
  127.      y&=y&+10*(60-x%)                   REM Scale number of ticks to next whole minute
  128.      x&=(x&+30)/60                      REM Scale parameter value to elapsed minutes
  129.      m%=8                               REM Minutes time-out message
  130.     ELSE                                REM TIMER IS SECONDS TIMER
  131.      m%=7                               REM Seconds time-out message
  132.     ENDIF
  133.     IOA(fTCB%,1,fTStat%,y&,#0)          REM Queue asynchronous timer message request
  134.     fParm%=x&                           REM Parameter is actual elapsed units
  135.  
  136.    ELSEIF fCStat%<>-46                  REM KEYBOARD OR SYSTEM MESSAGE PENDING
  137.     wait%=0                             REM Message rx, not in wait mode
  138.     IF (k%(1) AND $400)                 REM MESSAGE IS SYSTEM MESSAGE
  139.      m%=k%(1)-$400
  140.      IF m%=4                            REM MESSAGE IS FILE COMMAND
  141.       fParm$=GETCMD$                    REM Get the command parameter
  142.       x%=ASC(fParm$)                    REM Get the type character
  143.       fParm$=MID$(fParm$,2,128)         REM Get the filename
  144.       m%=0                              REM Just in case future version adds more commands
  145.       IF x%=%X                          REM MESSAGE IS "EXIT"
  146.        m%=100
  147.       ELSEIF x%=%C                      REM MESSAGE IS "CREATE FILE"
  148.        m%=101
  149.       ELSEIF x%=%O                      REM MESSAGE IS "OPEN FILE"
  150.        m%=102
  151.       ENDIF
  152.      ENDIF
  153.     ELSE                                REM MUST BE A KEYSTROKE MESSAGE
  154.      fParm%=k%(1)                       REM The keycode
  155.      fKmod%=k%(2) AND $00FF             REM The modifier key set
  156.      IF (fParm% AND $200)               REM KEYSTROKE IS HOTKEY
  157.       fParm%=fParm%-$200                REM ASCII value
  158.       fParm$=CHR$(fparm%)               REM Character
  159.       m%=4                              REM Hotkey message
  160.      ELSEIF fParm%>31 AND fParm%<256    REM KEYSTROKE IS PRINTABLE
  161.       fParm$=CHR$(fparm%)               REM Character
  162.       m%=5                              REM Printable key message
  163.      ELSEIF fParm%=290                  REM KEYSTROKE IS MENU KEY
  164.       m%=9                              REM Menu key message
  165.      ELSEIF fParm%=291                  REM KEYSTROKE IS HELP KEY
  166.       m%=10                             REM Help key message
  167.      ELSE                               REM KEYSTROKE IS SPECIAL KEY
  168.       m%=6                              REM Special key message
  169.      ENDIF
  170.     ENDIF
  171.     IOA(-2,14,fCStat%,k%(1),#0)         REM Re-queue asynchronous key/command request
  172.    ENDIF