home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / sound / midi / mb.asm < prev    next >
Assembly Source File  |  1988-03-20  |  193KB  |  4,248 lines

  1.     TITLE    Main Work Loop for Modular Sequencer
  2.     NAME    MB
  3.     .SALL
  4. ;==============================================================
  5. ; MusicBox Modular Sequencer, Version 2
  6. ; main module
  7. ;--------------------------------------------------------------
  8. ; author: John Dunn
  9. ; date:   03/07/86
  10. ; update: 03/20/88
  11. ;--------------------------------------------------------------
  12. ; COPYRIGHT (C) 1986 John Dunn, All Rights Reserved 
  13. ; Entered into the Public Domain, March 20, 1988
  14. ;
  15. ; Use and copying of this software and preparation of derivative works
  16. ; based upon this software are permitted.  Any distribution of this
  17. ; software or derivative works must comply with all applicable United
  18. ; States export control laws.
  19. ; This software is made available AS IS, and the author makes no warranty 
  20. ; about the software, its performance, or its conformity to any specification.
  21. ; Any person obtaining a copy of this software is requested to send their
  22. ; name and address address to:
  23. ;
  24. ;       John Dunn, Senior Research Fellow
  25. ;       Time Arts Inc.
  26. ;       3436 Mendocino Ave.
  27. ;       Santa Rosa, CA 95401
  28. ;
  29. ;==============================================================
  30.         include    order.asm
  31. ;--------------------------------------------------------------
  32.         include equates.asm
  33.         clkadr  equ 146+(23*160) ; addr of page 0 clock
  34. ;==============================================================
  35.         include    macros.asm
  36. ;==============================================================
  37. ; MACROS
  38. ;--------------------------------------------------------------
  39. ; convert character x,y to an address
  40. ; call with al = video y, bx = video x
  41. ; (x= 0-79, y= 0=24)
  42. ; returns with bx = offset, ax trashed
  43. ;  
  44. vxyadr  macro
  45.         mov     ah,160
  46.         mul     ah
  47.         add     bx,bx
  48.         add     bx,ax
  49.         endm
  50. ;--------------------------------------------------------------
  51. ; display priority number
  52. ;
  53. showp   macro
  54.         and     ah,1                    ;; do ms byte
  55.         xor     ah,1
  56.         add     ah,0f8h
  57.         mov     byte ptr es:158[bx],ah  ;; set high byte
  58.         tohex                           ;; binary to hex
  59.         mov     byte ptr es:160[bx],ah  ;; set the priority
  60.         mov     byte ptr es:162[bx],al  ;; /
  61.         endm
  62. ;==============================================================
  63.         if not withc
  64. STACK   SEGMENT para stack 'STACK'
  65.         db 512 dup (?)
  66. STACK   ENDS
  67.         endif
  68. ;==============================================================
  69. BUFFV   SEGMENT
  70.         db 0
  71.         db 4094 dup (?) ; video "foo" buffer
  72.         db 0
  73. BUFFV   ENDS
  74. ;==============================================================
  75. _DATA   SEGMENT
  76.         ASSUME DS:DGROUP, CS:_TEXT
  77. ;--------------------------------------------------------------
  78.         extrn  mute:word,mutef:byte,midisf:byte,midixsf:byte
  79.         extrn  vartbl:near,modscr:near
  80.         extrn  _chrtbl:near
  81.         extrn  _exetbl:near
  82.         extrn  @dummy:near
  83.         extrn  _modsrc:near
  84.         extrn  $menu:near      ; page #'s and menu
  85.         extrn  $dummy:near     ; 25 line dummy for module text buffer
  86.         extrn  _modtxt:near,?modtxt:near
  87.         extrn  @zero:near
  88.         extrn   mmreset:byte,mmstart:byte
  89.         extrn   mmtick:word,mmcount:word,mclocks:word
  90.         extrn   mvlsav:near,mvlnum:abs
  91.         extrn   mprstf:byte
  92. ;--------------------------------------------------------------
  93.         extrn   midip:byte
  94. ;--------------------------------------------------------------
  95.         public varsav,cmdflg,special,cmdloc,vpage,locsav,curadr,noop
  96.         public ticka,tickis,cmdcnt,valflg,usrflg,magflg,holdv,colr,doesc
  97.         public _tmpfn,_savfn,_lodfn,_bakfn,_mpab,_header,fastflg,modnum
  98.         public lodflg,clrchf,midiok,curonf,asensf
  99. ;--------------------------------------------------------------
  100. _bases  dw      0               ; base seg is saved here
  101. clrchf  db      0               ; clear channel flag, used by chanl
  102. tickis  db      0               ; timer value after modules
  103. lodflg  db      0               ; nz for 2 clocks after loading
  104. fastflg db      0               ; nz = fast as possible loops
  105. savtime dw      0               ; place to save time of day
  106. timecnt db      8               ; time count for colon flash
  107. midiss  db      0               ; place to save last midi xtrn sync
  108. waiting db      0               ; nz if waiting on timer
  109. pdf     db      0               ; pd values set by interrupt
  110. pdx     db      39              ;  /
  111. pdy     db      12              ; /
  112. curonf  db      0               ; nz = don't restore screen char
  113. curflg  db      0               ; z to display normal cursor
  114. curcol  db      017h            ; 0 = cursor not being displayed
  115. curdata dw      0               ; data under the cursor
  116. savcol  db      0               ; /
  117. colr    db      blue            ; current number readout color 
  118. vpage   dw      0B800H          ; current video page seg
  119. vpagen  db      0               ; current video page number
  120. vpagep  db      0               ; previous video page number
  121. curadr  dw      1998            ; cursor address offset
  122. execur  dw      0               ; z = don't do it
  123. modchar dw      offset dgroup:$dummy; current module char list
  124. cmdcol  db      0               ; command color
  125. cmdcnt  db      0               ; command count
  126. cmdptr  dw      offset dgroup:@dummy; command pointer
  127. cmdloc  dw      0               ; command location offset
  128. cmdtag  dw      0               ; command label offset
  129. shosav  dw      0               ; place to save it
  130. shoflg  db      0               ; nz = showing output-inputs
  131. cmdflg  db      0               ; nz = a command is pending
  132. magflg  db      0               ; 0=no-value, 1=channel #, 2=input value
  133. errflg  db      0               ; 1 = write, 2 = non-fatal read 
  134. errwrd  dw      0               ; dos error word
  135. byemsg  dw      0               ; addr of exit msg, or 0
  136. room    db      0               ; disk room, in save files
  137. tmpsav  dw      offset dgroup:vartbl; place to hold a variable ptr (move)
  138.                                 ; or modsrc addr (reincarnate)
  139. locsav  dw      0               ; place to hold cmdloc, to remember hilights
  140. modnum  db      0               ; module number *2 of last new module
  141. special dw      noop            ; place to hold exe addr of special routine
  142. usrflg  db      0               ; nz when special magenta input is happening
  143. valflg  db      0               ; nz when blue value input is happening
  144. mickx   dw      0               ; current mickey horiz count
  145. lastx   db      0               ; place to save last pdx for no-button cmds
  146. lasty   db      0               ; place to save last pdy for no-button cmds
  147. holdv   dw      0               ; place to hold last value offset 
  148. doesc   dw      noop            ; do this when ESC is selected
  149. cscale  db      'C:C#D:D#E:F:F#G:G#A:A#B:'
  150. diradr  dw      0               ; temp storage for screen directory
  151. dirptr  dw      0               ; last directory file name pointer
  152. _mpab   db      8Fh             ; file load flags
  153. asensf  db      1               ; active sensing send flag
  154. ;==============================================================
  155. ; the following are constants that may be changed either before
  156. ; assembley or with debug after MB.EXE is built.  Actual number of 
  157. ; bytes must remain the same, or previously saved files will be 
  158. ; incompatable, causing upredictable results when loaded.
  159. ;
  160. usesf   db      1                   ; 1 = use _scrfn file if found
  161. midiok  db      1                   ; 0= off, 1= 1 MPU, 3= 2 MPU's
  162. _numpg  dw      3                   ; number of video pages -1 (1/3/7)
  163.                                     ; should be 3 for CGA, 7 for EGA/VGA
  164. _scrfn  db      'tutor.scr',0,0,0,0 ; screen file name
  165.                                     ; if not found, uses screen image
  166.                                     ; from MODSCR, last section of MBV.ASM
  167. _tmpfn  db      '\undo.mb$',0,0,0,0 ; file name for set/undo
  168.                                     ; 0 in 1st byte disables    
  169. _bakfn  db      'previous.mb ',0    ; file name for backup
  170.                                     ; 0 in 1st byte disables    
  171. _lodfn  db      'temp.mb ',0,0,0,0,0; file name for dir loading
  172. _dirfn  db      '*.mb ',0           ; directory file name                   
  173. ;==============================================================
  174. _inbuf  db      128 dup (?)         ; kbd input buffer  
  175. _err_wp db      7,'Write Protect: Retry Ignore Quit$'
  176. _err_dx db      7,'Disk Error: Retry Ignore Quit?  $'
  177. _errwx  db      7,'Write Error: Retry Escape Quit? $'
  178. _errwr  db      7,'Write Error: Retry Ignore Quit? $'
  179. _errver db      7,'Wrong Vers: M disabled. Escape? $'
  180.  
  181. _noundo db      7,'Error in writing to Undo File.$'
  182. _opundo db      7,'Error in opening Undo File.$'
  183. _errmod db      7,'Error in reading modules.  $'
  184. roomis  db      "Room= 20$"
  185. ;--------------------------------------------------------------
  186. ; header format (only first 128 bytes are actually used)
  187. ; byte 0 = revision
  188. ; byte 1 = version
  189. ; byte 2 = encoding (0 = no encoding in this version)
  190. ; byte 3 = 0
  191. ; byte 4-43 = copyright notice
  192. ; other bytes unused
  193. ;--------------------------------------------------------------
  194. _header db      version,release ; version/release word
  195.         db      0,0             ; encoding = 0 = none
  196.         db      'MusicBox Copyright (c) 1986, 1987 John Dunn'
  197.         db      100 dup (0)     ; more stuff
  198. _foo    db      128 dup (?)     ; scratch area
  199. ;--------------------------------------------------------------
  200. ; the following are saved/loaded
  201. ;
  202. valsav  equ     $               ; start of values to save
  203. _savfn  db      'temp.mb ',0,0,0,0,0; file name for saving
  204. ticka   db      0CH             ; timer tick (1456/mtempo)
  205. varptr  dw      offset dgroup:vartbl; addr of next free variable space
  206. varnow  dw      offset dgroup:vartbl; current variable table addr
  207. varsav  dw      offset dgroup:vartbl; saved variable table addr
  208. last    dw      0               ; index of last module in exetbl
  209.                                 ; also next module's priority
  210. valend  equ     $               ; end of values to save
  211. _DATA   ENDS
  212. ;==============================================================
  213. _TEXT   SEGMENT
  214.     ASSUME  CS: _TEXT, DS: DGROUP, SS: DGROUP, ES: NOTHING
  215. ;--------------------------------------------------------------
  216.         public  loops
  217. loops   dw      0               ; module loop count
  218. ;--------------------------------------------------------------
  219.         extrn _dummy:near
  220.         extrn ticks:word,timer:word,midixs:byte
  221.         extrn startm:near,stopm:near,startt:near,stopt:near
  222.         extrn sendm:near,alloff:near,tomidi:near
  223.         extrn allclr:near,allmidi:near
  224.         extrn secondf:byte,seconds:word
  225. ;==============================================================
  226. ; main body of program
  227. ;--------------------------------------------------------------
  228. ; initialization
  229. ;
  230.         public  _doit
  231. _doit:
  232.         if      withc           ; if compiled with C
  233.         push    es              ; save C regs
  234.         push    bp              ;     /
  235.         push    si              ;   /
  236.         push    di              ; /
  237.         else                    ; else if assembly
  238.         mov     ax,seg dgroup   ; set data seg
  239.         mov     dx,ds           ; save initial data seg
  240.         mov     ds,ax           ;  /
  241.         mov     _bases,dx       ; /
  242.         endif
  243.         ;
  244.         mov     ah,25H          ; set int vect
  245.         mov     al,24H          ; int 24h for MS crit error
  246.         push    ds              ; save data seg
  247.         mov     dx,cs           ; get code ds
  248.         mov     ds,dx           ; point to cerror
  249.         mov     dx,offset cerror; vector to mine
  250.         int     21H             ; set new int vect
  251.         pop     ds              ; restore data seg
  252.         ;
  253.         mov     cx,_numpg       ; get number of pages
  254.         inc     cx              ; +1 for loop
  255.         if      debug           ; if debug mode, don't clr page 7
  256.         dec     cx              ;           /
  257.         endif                   ;          /
  258.         mov     al,0            ;         /
  259. start0: push    cx              ;        /
  260.         push    ax              ;       /
  261.         call    page            ;      /
  262.         call    clx             ;     /
  263.         pop     ax              ;    /   
  264.         inc     al              ;   /
  265.         pop     cx              ;  /
  266.         loop    start0          ; /
  267.         mov     al,0            ; set page 0 active
  268.         call    page            ; /
  269.         call    shoall          ; show all modules
  270.         call    modloc          ; set module location addresses
  271.         ;
  272.         call    savmod          ; save undo modules
  273.         ;
  274.         call    getfn           ; get file name from cmd line
  275.         jnc     start1          ; branch if no input filename
  276.         ;
  277.         mov     ah,3dh          ; dos open file command
  278.         mov     al,0            ; read only
  279.         mov     dx,offset dgroup:_savfn; point to file name
  280.         int     21H             ; open the file
  281.         jc      start1          ; branch if open error
  282.         call    lodmod0         ; else load modules
  283.         call    showfn          ; show the save filename
  284.         call    getdir          ; show directory enterys
  285.         call    dopath          ; show current path
  286.         call    dompab          ; show mpad status
  287.         call    menus           ; draw menus
  288.         mov     vpagen,0        ; set up for swaps
  289.         mov     al,1            ; show page 1
  290.         call    page            ;  /       
  291.         jmp     short start2    ; /
  292.         ;
  293. start1: call    showfn          ; show the save filename
  294.         call    getdir          ; show directory enterys
  295.         call    dopath          ; show current path
  296.         call    dompab          ; show mpad status
  297.         call    menus           ; draw menus
  298.         mov     vpagen,1        ; set up for swaps
  299.         mov     al,0            ; show page 0
  300.         call    page            ; /       
  301.         ;
  302. start2: call    startt          ; start system timer
  303.         call    initpd          ; initialize pointing device
  304.         test    midiok,-1       ; was MIDI on?
  305.         jz      start3          ; no, branch
  306.         call    startm          ; yes, turn it on
  307.         ;
  308. start3: mov     curonf,1        ; no old cursor
  309.         call    curon           ; activate cursor
  310.         mov     pdf,80h         ; /
  311.         call    fixhlt          ; fix halt status
  312. ;==============================================================
  313. ; registers that must be preserved: DS, SI
  314. ;==============================================================
  315. ; main work loop
  316.         public work
  317. work:
  318.         if      debug           ; if true compile this stuff
  319.         mov     al,really       ; if really, really do it
  320.         or      al,al           ;  /
  321.         jz      really1         ; /
  322.         ;
  323.         mov     bx,varnow       ; ...display the variable list
  324.         sub     bx,8            ; back up a little
  325. ;--------------------------------------------------------------
  326. ; use this stuff to show MIDI data stream
  327. comment |
  328. ;
  329.         mov     bx, offset dgroup:mobuf;; get next byte
  330.         add     bx,mobiix       ;; get midi in buffer index
  331.         sub     bx,36           ; back up a little
  332.         mov     ax,mobiix
  333.         mov     show2,ax
  334.         sub     ax,moboix
  335.         mov     show3,ax
  336. comment ends |
  337. ;--------------------------------------------------------------
  338. ; use this stuff to show mouse location & screen address
  339. ;
  340.         mov     ax,curadr       ; cursor screen address
  341.         mov     show0,ax        ; show it
  342.         mov     al,pdx          ; cursor x
  343.         mov     ah,pdy          ; cursor y
  344.         mov     show1,ax        ; show it
  345.         mov     show2,sp
  346. ;--------------------------------------------------------------
  347.         call    showw           ;       /
  348.         call    show            ;     /
  349. really1:                        ;   /
  350.         endif                   ; /
  351. ;==============================================================
  352. ; display time if on page 0
  353. ;
  354.         mov     es,vpage                ; set up for video page
  355.         cmp     vpagen,0                ; on page 0?
  356.         jnz     work0                   ; no, branch
  357.         mov     ah,2ch                  ; dos get time function
  358.         int     21h                     ; call dos
  359.         ;
  360.         test    lodflg,-1               ; did a load happen
  361.         jnz     workt                   ; yes, set new time
  362.         ;
  363.         cmp     cx,savtime              ; has time changed?
  364.         jz      worktz                  ; no, branch
  365.         ;
  366. workt:  mov     colr,cyan               ; set color to cyan
  367.         test    lodflg,-1               ; did a load happen
  368.         jnz     workt2                  ; yes, don't check hrs
  369.         cmp     ch,byte ptr savtime+1   ; hrs changed?
  370.         jz      workt1                  ; no, branch
  371.         ;
  372. workt2: mov     al,ch                   ; setup for ascii
  373.         mov     bx,clkadr               ; address of decimal readout
  374.         call    todec                   ; show it in decimal
  375.         mov     bx,clkadr               ; zip ms zero
  376.         mov     byte ptr es:[bx],0b3h   ; /
  377.         ;
  378. workt1: mov     al,cl                   ; setup for ascii
  379.         mov     bx,clkadr+6             ; address of decimal readout
  380.         call    todec                   ; show it in decimal
  381.         mov     bx,clkadr+6             ; zip ms zero
  382.         mov     byte ptr es:[bx],':'    ; /
  383.         ;
  384. worktx: mov     savtime,cx              ; save time
  385.         mov     colr,blue               ; fix color
  386.  
  387. worktz: dec     timecnt                 ; seconds changed?
  388.         jnz     work0                   ; no, exit
  389. ;        mov     timecnt,64              ; yes, set new count  
  390.         mov     bx,clkadr+7             ; flip colon color
  391.         xor     byte ptr es:[bx],green  ; /
  392. ;--------------------------------------------------------------
  393. ; test to see if a request to change pages has been asserted
  394. work0:  cmp     pdf,82H         ; change page if pdf=2
  395.         jnz     work0a          ; else, go on
  396.         and     pdf,07fh        ; clear pen-down flag
  397.         call    curoff          ; no cursor while changing pages
  398.         mov     al,vpagep       ; get previous page number
  399.         call    page            ; swap with current
  400.         mov     curonf,1        ; don't restore screen data
  401.         call    curon           ; do turn on the cursor
  402. work0x: jmp     workx           ; back to the work loop
  403. ;==============================================================
  404. ; test to see if a command request has been asserted
  405. ;
  406. work0a: cmp     pdf,81h         ; do command if pdf = 1
  407.         jnz     work02          ; else check for user input
  408.         and     pdf,07fh        ; clear pen-down flag
  409.         cmp     pdx,2           ; in vertical menu area?
  410.         jbe     workm0          ; yes, go do it     
  411.         ;
  412.         cmp     vpagen,0        ; on page 0?
  413.         jnz     work01          ; no, branch
  414.         cmp     pdy,10h         ; horiz menu?
  415.         jz      workh           ; yes, go do it
  416.         cmp     pdy,15h         ; below file area
  417.         ja      work0x          ; yes, not interested
  418.         cmp     pdy,11h         ; in file area?
  419.         ja      workf           ; yes, go process
  420. work01: jmp     work00          ; no, go process screen commands
  421. workf:  jmp     workf0          ; branch to file area processing
  422. workh:  jmp     workh0          ; branch to horiz menu processing
  423. ;==============================================================
  424. ; no putton push, if user input was requested (cmdflg =7 ), and
  425. ; if x,y position has changed, process user input
  426. ;
  427. work02: mov     ax,11           ; check for mouse movement
  428.         int     33H             ; /
  429.         cmp     mickx,cx        ; has x changed?
  430.         jnz     work02a         ; yes, go do it
  431.         mov     ah,pdy          ; has y changed
  432.         cmp     lasty,ah        ; /
  433.         jz      work02x         ; no, then back to work loop
  434.  
  435. work02a:mov     mickx,cx        ; save x,y mickeys
  436.         mov     al,pdx          ; save last pdx,pdy
  437.         mov     lastx,al        ; yes, save pdx,pdy
  438.         mov     ah,pdy          ;  /
  439.         mov     lasty,ah        ; /
  440.         cmp     cmdflg,7        ; blue input?
  441.         jnz     work02b         ; no, branch
  442.         jmp     work72          ; yes, process blue user input
  443. work02b:cmp     cmdflg,10       ; magenta input?
  444.         jnz     work02c         ; no, branch
  445.         jmp     work92          ; yes, process magenta special input
  446. work02c:
  447. work02x:jmp     workx           ; no,  back to the work loop
  448.  
  449. ;==============================================================
  450. ; Process Menu command.
  451. ;
  452. workm0: cmp     pdy,7           ; page change command
  453.         ja      workm1          ; no, go fish
  454.         call    curoff          ; yes, set page
  455.         mov     al,pdy          ;   /
  456.         call    page            ; /
  457.         mov     curonf,1        ; don't restore screen data
  458.         call    curon           ; cursor back on
  459.         jmp     workx           ; back to the work loop
  460. ;==============================================================
  461. ; menu commands other than page change
  462. workm1: cmp     pdy,8           ; ESC?
  463.         jnz     workm4          ; no, branch
  464.         jmp     workm1a         ; yes, go do it
  465. workm4: cmp     pdy,10          ; SET?
  466.         jnz     workm5          ; no, branch
  467.         jmp     workm4a         ; yes, go do it
  468. workm5:
  469.         ;
  470. workm2: cmp     cmdflg,0        ; something pending?
  471.         jnz     workmz          ; yes, split
  472.         ;
  473.         cmp     pdy,9           ; delete?
  474.         jnz     workm3          ; no, branch
  475.         jmp     workm2a         ; yes, branch to delete
  476. workm3: cmp     pdy,11          ; HLT?
  477.         jnz     workm7          ; no, branch
  478.         jmp     workm3a         ; yes, go do it
  479. workm7: cmp     pdy,12          ; OFF?
  480.         jnz     workm8          ; no, branch
  481.         jmp     workm7a         ; yes, go do it
  482. workm8: cmp     pdy,17          ; mute/solo command
  483.         jb      workmz          ; no, exit
  484.         jmp     workm8a         ; yes, go do it
  485.         ;
  486. workmz: jmp     workx           ; none of the above, exit
  487.  
  488. ;==============================================================
  489. ; Delete command given, turn on highlite, set cmdflg to 4
  490. ;
  491. workm2a:mov     bx,5a0h         ; address of DEL
  492.         call    turnon          ; turn on
  493.         mov     cmdflg,4        ; set command flag = 4
  494.         mov     word ptr doesc,offset workm2d; set up for ESC
  495.         jmp     workx           ; exit
  496. ;--------------------------------------------------------------
  497. ; escape from delete
  498. ;
  499. workm2d:mov     bx,5a0h         ; turn off hilight
  500.         jmp     turnoff
  501. ;==============================================================
  502. ; process HLT command (on/off)
  503. ;
  504. workm3a:mov     bx,6E0H         ; text offset
  505.         test    mprstf,2        ; stopped already?
  506.         jz      workm3b         ; no, branch
  507.         call    turnoff         ; yes, turn off highlight
  508.         mov     al,0fah         ; send MIDI START command
  509.         call    allmidi         ; send to all midi ports
  510.         mov     mmtick,1        ; reset to 1st note in measure
  511.         and     mprstf,0FDH     ; clear halt flag
  512.         jmp     workx           ; exit
  513. workm3b:call    turnon          ; turn on highlight
  514.         or      mprstf,2        ; set master halt the flag
  515.         mov     al,0fch         ; send MIDI STOP command
  516.         call    allmidi         ; /
  517.         jmp     workx           ; exit
  518. ;==============================================================
  519. ; SET  command given, save current system to temp file
  520. ;
  521. workm4a:
  522.         test    _tmpfn,-1       ; want to do it?
  523.         jz      workm4e         ; no, branch
  524.         ;
  525.         cmp     cmdflg,0        ; was it clear?
  526.         jz      workm4d         ; yes, branch
  527.         jmp     workx           ; no, ignore
  528.         ;
  529. workm4d:mov     bx,160*10       ; address of menu text
  530.         call    turnon          ; turn on highlight
  531.         call    curoff          ; zip cursor
  532.         call    allclr          ; clear all midi channels
  533.         ;
  534.         call    savmod          ; save modules
  535.         ;
  536.         mov     pdf,80h         ; reset mouse flag
  537.         call    curon           ; cursor back on
  538.         mov     bx,160*10       ; address of menu text
  539.         call    turnoff         ; turn off highlight
  540.         mov     clrchf,1        ; setup to clear chanl
  541. workm4e:jmp     workx           ; exit
  542. ;==============================================================
  543. ; process OFF command (all notes off)
  544. ;
  545. workm7a:
  546.         call    alloff          ; process all notes off
  547.         jmp     workx           ; exit
  548. ;==============================================================
  549. ; ESC command given.
  550. ; Turn cursor off, execute DOESC, then zip DOSEC.
  551. ; If cursor is a module image, turn it off.
  552. ; Clear cmdflg. 
  553. ;
  554.         public  _cancel,cancel
  555. _cancel:
  556. workm1a:call    curoff          ; cursor off
  557. cancel: mov     ax,doesc        ; get the esc exe addr
  558.         call    ax              ; go do it
  559.         mov     doesc,offset noop ; put it to sleep
  560.         call    curon           ; cursor back on
  561.         test    curflg,1        ; dragging a module around?
  562.         jz      workm1d         ; no, branch
  563.         call    setcur          ; yes, set cursor
  564. workm1d:mov     cmdflg,0        ; clear command flag
  565.         jmp     workx           ; exit
  566. ;--------------------------------------------------------------
  567. ; mute/solo commands
  568. ;
  569. workm8a:test    mutef,1         ; action mute or solo?
  570.         jnz     workm8e         ; branch if mute
  571.         ;
  572.         mov     dx,-1           ; set up solo mask
  573.         mov     cl,pdy          ; point to the screen location
  574.         sub     cl,17           ; cl = 0-7
  575.         add     cl,cl           ; *2 for 0-14
  576.         cmp     pdx,2           ; do odd?
  577.         jz      workm8b         ; yes, branch
  578.         mov     ax,1            ; set flag bit
  579.         shl     ax,cl           ; ax = bit flag for mute
  580.         xor     dx,ax           ; set the bit
  581.         cmp     pdx,0           ; was this just even?
  582.         jz      workm8c         ; yes, branch
  583. workm8b:inc     cl              ; +1 for 1-15
  584.         mov     ax,1            ; set flag bit
  585.         shl     ax,cl           ; ax = bit flag for mute
  586.         xor     dx,ax           ; set the bit
  587.         ;
  588. workm8c:cmp     dx,mute         ; same as last time?
  589.         jnz     workm8d         ; no, branch
  590.         mov     dx,0            ; yes, clear solo flags
  591. workm8d:mov     mute,dx         ; set new solo
  592.         jmp     workx           ; back to the work loop
  593. ;--------------------------------------------------------------
  594. workm8e:mov     cl,pdy          ; point to the screen location
  595.         sub     cl,17           ; cl = 0-7
  596.         add     cl,cl           ; *2 for 0-14
  597.         cmp     pdx,2           ; do odd?
  598.         jz      workm8f         ; yes, branch
  599.         mov     ax,1            ; set flag bit
  600.         shl     ax,cl           ; ax = bit flag for mute
  601.         xor     mute,ax         ; flip the bit
  602.         cmp     pdx,0           ; was this just even?
  603.         jz      workm8g         ; yes, branch
  604. workm8f:inc     cl              ; +1 for 1-15
  605.         mov     ax,1            ; set flag bit
  606.         shl     ax,cl           ; ax = bit flag for mute
  607.         xor     mute,ax         ; flip the bit
  608. workm8g:jmp     workx           ; back to work loop
  609. ;==============================================================
  610. ; Process horiz page 0 menu
  611. ;
  612. workh0: cmp     pdx,8           ; QUIT @ workh0a
  613.         jnb     workh01         ;  /
  614.         jmp     workh0a         ; /
  615. workh01:cmp     pdx,0DH         ; EXIT @ workh1a
  616.         jnb     workh02         ;  /
  617.         test    room,-1         ; room to save?
  618.         jz      workhx          ; no, ignore the command
  619.         jmp     workh1a         ; /
  620. workh02:cmp     pdx,12H         ; MPAD @ workh2a
  621.         jnb     workh03         ;  /
  622.         jmp     workh2a         ; /
  623. workh03:cmp     pdx,17H         ; UNDO @ workh3a
  624.         jnb     workh05         ;  /
  625.         jmp     workh3a         ; /
  626. workh05:cmp     pdx,1CH         ; REDO @ workh5a
  627.         jnb     workh04         ; /
  628.         jmp     workh5a         ; else go do it
  629. workh04:cmp     pdx,21H         ; SAVE @ workh4a
  630.         jnb     workh06         ;  /
  631.         test    room,-1         ; room to save?
  632.         jz      workhx          ; no, ignore the command
  633.         jmp     workh4a         ; else go do it
  634. workh06:cmp     pdx,2bh         ; NAME @ workh6a
  635.         jnb     workh07         ;  /
  636.         jmp     workh6a         ; /
  637. workh07:jmp     workh7a         ; PATH @ workh7a
  638. workhx: jmp     workx           ; back to the work loop
  639. ;--------------------------------------------------------------
  640. ; Turn on horiz menu command highlight.
  641. ; call with cursor on, bx = menu text offset
  642. ;
  643.         public  horzon
  644. horzon: push    bx              ; save text addr
  645.         call    curoff          ; zip cursor
  646.         pop     bx              ; get text addr
  647.         add     bx,16*160       ; offset for line
  648.         mov     dx,0b800h       ; do page 0 only
  649.         mov     es,dx           ;
  650.         or      byte ptr es:1[bx],8 ; make bright
  651.         or      byte ptr es:3[bx],8 ;   /
  652.         or      byte ptr es:5[bx],8 ;  /
  653.         or      byte ptr es:7[bx],8 ; /
  654.         mov     curonf,1        ; don't restore 
  655.         jmp     curon           ; cursor normal
  656. ;--------------------------------------------------------------
  657. ; Turn off menu command highlight.
  658. ; call with cursor on, bx = menu text offset
  659. ;
  660.         public  horzoff
  661. horzoff:push    bx              ; save text addr
  662.         call    curoff          ; zip cursor
  663.         pop     bx              ; get text addr
  664.         add     bx,16*160       ; offset for line
  665.         mov     dx,0b800h       ; do page 0 only
  666.         mov     es,dx           ;
  667.         and     byte ptr es:1[bx],0f7h ; make dark  
  668.         and     byte ptr es:3[bx],0f7h ;   /
  669.         and     byte ptr es:5[bx],0f7h ;  /
  670.         and     byte ptr es:7[bx],0f7h ; /
  671.         mov     curonf,1        ; don't restore 
  672.         jmp     curon           ; keep it right
  673. ;--------------------------------------------------------------
  674. ; show mapb status
  675. ;
  676. dompab: mov     bx,1cH+(16*160) ; offset for line
  677.         mov     dx,0b800h       ; do page 0 only
  678.         mov     es,dx           ; /
  679.         mov     al,_mpab        ; get it        
  680.         mov     ah,1            ; set bit test flag
  681.         mov     cl,4            ; 4 bits to do
  682. dompab0:test    al,ah           ; look at the bit
  683.         jz      dompab1         ; branch if off
  684.         mov     byte ptr es:1[bx],cyan; else make bright
  685.         jmp     short dompab2   ; branch
  686. dompab1:mov     byte ptr es:1[bx],grey; make dark
  687. dompab2:inc     bl              ; bump pointers
  688.         inc     bl              ;  /
  689.         shl     ah,1            ; /
  690.         loop    dompab0         ; loop
  691.         ret
  692. ;==============================================================
  693. ; QUIT command given, turn on highlite, set cmdflg to 6
  694. ;
  695. workh0a:mov     bx,8            ; address of QUIT
  696.         cmp     cmdflg,6        ; already set?
  697.         jnz     workh0b         ; no, branch
  698.         mov     dx,ds           ; yes, fix es = ds
  699.         mov     es,dx           ; /
  700.         test    _mpab,80H       ; has there been a save?
  701.         jz      workh0e         ; no, branch
  702.         call    delmod          ; delete temp file
  703. workh0e:jmp     split           ; exit
  704. workh0b:cmp     cmdflg,0        ; was it clear?
  705.         jz      workh0d         ; yes, branch
  706.         jmp     workx           ; no, ignore
  707. workh0d:call    horzon          ; was clear, so turn on
  708.         call    tmphlt          ; set temp hlt
  709.         mov     cmdflg,6        ; set command flag = 6
  710.         mov     doesc,offset workh0c ; set up ESC
  711.         jmp     workx           ; exit
  712. ;--------------------------------------------------------------
  713. ; escape from QUIT
  714. ; also define "noop" as a dummy return
  715. ;
  716. workh0c:mov     bx,8            ; turn off highlight
  717.         call    horzoff         ; /
  718.         call    clrhlt          ; clear hlt 
  719. noop:   ret                     ; "noop" is dummy return
  720. ;==============================================================
  721. ; EXIT command given, turn on highlite, set cmdflg to 18
  722. ;
  723. workh1a:mov     bx,12h          ; address of EXIT
  724.         cmp     cmdflg,16       ; already set?
  725.         jnz     workh1b         ; no, branch
  726.         mov     cmdflg,0        ; clear the command
  727.         ;
  728.         call    horzoff         ; yes, turn off highlight
  729.         mov     bx,3ah          ; zip save highlight
  730.         call    horzoff         ; /
  731.         call    curoff          ; zip cursor
  732.         ;
  733.         call    delmod          ; delete temp file
  734.         ;
  735.         mov     dx,ds           ; fix es = ds
  736.         mov     es,dx           ; /
  737.         ;
  738.         test    _bakfn,-1       ; doing backups?
  739.         jz      workh1e         ; no, branch
  740.         ;
  741.         mov     dx,offset dgroup:_savfn; file already exists?
  742.         mov     cx,0            ; /
  743.         mov     ah,4eh          ; dos search for first
  744.         int     21h             ; /
  745.         jc      workh1e         ; branch if not already existing
  746.         ;
  747.         mov     dx,offset dgroup:_bakfn; delete old bakfn
  748.         mov     ah,41h          ; dos delete function call
  749.         int     21h             ; /
  750.         ;
  751.         mov     dx,offset dgroup:_savfn; rename savfn to bakfn
  752.         mov     di,offset dgroup:_bakfn
  753.         mov     ah,56h          ; dos rename function call
  754.         int     21h             ; /
  755.         ;
  756. workh1e:mov     dx,offset dgroup:_savfn; point to file name
  757.         call    savmods         ; save modules
  758.         test    errflg,-1       ; any errors?
  759.         jz      workh1f         ; no, branch
  760.         mov     dx,offset dgroup:_errwx; yes, setup message
  761.         call    errmsg          ; do msg, get response
  762.         cmp     al,'Q'          ; want to ignore?
  763.         jz      workh1f         ; /
  764.         cmp     al,'R'          ; Retry
  765.         jz      workh1e         ; /
  766.         ;                       ; else Escape
  767.         mov     pdf,80h         ; reset mouse flag
  768.         call    curon           ; cursor back on
  769.         call    workh1c         ; fix menu & HLT status
  770.         call    getdir          ; show directory
  771.         jmp     workx           ; exit
  772.         ;
  773. workh1f:jmp     split           ; exit
  774.         ;
  775. workh1b:cmp     cmdflg,0        ; was it clear?
  776.         jz      workh1d         ; yes, branch
  777.         jmp     workx           ; no, ignore
  778.         ;
  779. workh1d:call    horzon          ; was clear, so turn on
  780.         mov     bx,3ah          ; set save highlight
  781.         call    horzon          ; /
  782.         call    tmphlt          ; set temp hlt
  783.         mov     cmdflg,16       ; set command flag = 18
  784.         mov     doesc,offset workh1c ; set up ESC
  785.         jmp     workx           ; exit
  786. ;--------------------------------------------------------------
  787. ; escape from EXIT
  788. ;
  789. workh1c:mov     bx,12h          ; turn off highlight
  790.         call    horzoff         ; /
  791.         mov     bx,3ah          ; zip save highlight
  792.         call    horzoff         ; /
  793.         call    clrhlt          ; clear temp hlt
  794.         ret
  795. ;==============================================================
  796. ; set MPAB bit & display status
  797. ;
  798. workh2a:mov     ah,1            ; set bit flag
  799.         mov     dh,pdx          ; get cursor x-loc
  800.         mov     dl,0EH          ; first match position
  801.         mov     cx,4            ; 4 to do
  802. workh2b:cmp     dl,dh           ; match?
  803.         jz      workh2c         ; yes, branch out
  804.         shl     ah,1            ; bump bit flag
  805.         inc     dl              ; bump x-loc
  806.         loop    workh2b         ; do them all
  807. workh2c:xor     _mpab,ah        ; flip the mpab bit
  808.         call    curoff          ; zip cursor
  809.         call    dompab          ; show it
  810.         mov     curonf,1        ; don't restore 
  811.         call    curon           ; keep it right
  812.         jmp     workx           ; exit
  813. ;==============================================================
  814. ; UNDO command given, turn on highlite, set cmdflg to 16
  815. ;
  816. workh3a:
  817.         test    _tmpfn,-1       ; want to do it?
  818.         jz      workh3e         ; no, branch
  819.         ;
  820.         mov     bx,26h          ; address of UNDO
  821.         cmp     cmdflg,17       ; already set?
  822.         jnz     workh3b         ; no, branch
  823.         mov     cmdflg,0        ; clear the command
  824.         ;
  825.         call    curoff          ; zip cursor
  826.         xor     _tmpfn+4,1      ; switch file name
  827.         call    savmod          ; save modules
  828.         xor     _tmpfn+4,1      ; switch file name
  829.         call    lodmod          ; load modules
  830.         ;
  831.         call    delmod          ; delete just loaded file
  832.         xor     _tmpfn+4,1      ; switch file name
  833.         ;
  834.         call    showfn          ; show the save filename
  835.         call    getdir          ; show directory enterys
  836.         call    dopath          ; show current path
  837.         call    dompab          ; show mpad status
  838.         call    menus           ; draw menus
  839.         ;
  840.         mov     pdf,80h         ; reset mouse flag
  841.         mov     curonf,1        ; don't restore
  842.         call    curon           ; cursor back on
  843.         mov     bx,26h          ; turn off highlight
  844.         call    horzoff         ; /
  845.         mov     bx,160*10       ; address of menu text
  846.         call    turnoff         ; turn off highlight
  847.         call    showfn          ; show exit file name
  848.         call    fixhlt          ; clear temp HLT
  849.         mov     lodflg,2        ; flag that a load happened
  850. workh3e:jmp     workx           ; exit
  851.         ;
  852. workh3b:cmp     cmdflg,0        ; was it clear?
  853.         jz      workh3d         ; yes, branch
  854.         jmp     workx           ; no, ignore
  855.         ;
  856. workh3d:mov     bx,26h          ; point menu text
  857.         call    horzon          ; turn on
  858.         call    tmphlt          ; set temp HLT
  859.         mov     cmdflg,17       ; set command flag = 19
  860.         mov     doesc,offset workh3c ; set up ESC
  861.         jmp     workx           ; exit
  862. ;--------------------------------------------------------------
  863. ; escape from UNDO
  864. ;
  865. workh3c:mov     bx,26h          ; turn off highlight
  866.         call    horzoff         ; /
  867.         call    clrhlt          ; clear temp hlt
  868.         ret
  869. ;==============================================================
  870. ; SAVE command given, turn on highlite, set cmdflg to 19
  871. ;
  872. workh4a:cmp     cmdflg,19       ; already set?
  873.         jnz     workh4b         ; no, branch
  874.         mov     cmdflg,0        ; clear the command
  875.         ;
  876.         mov     bx,3ah          ; point to text
  877.         call    horzoff         ; turn off highlight
  878.         call    curoff          ; zip cursor
  879.         ;
  880.         mov     dx,ds           ; fix es = ds
  881.         mov     es,dx           ; /
  882.         ;
  883.         test    _bakfn,-1       ; doing backups?
  884.         jz      workh4e         ; no, branch
  885.         ;
  886.         mov     dx,offset dgroup:_savfn; file already exists?
  887.         mov     cx,0            ; /
  888.         mov     ah,4eh          ; dos search for first
  889.         int     21h             ; /
  890.         jc      workh4e         ; branch if not already existing
  891.         ;
  892.         mov     dx,offset dgroup:_bakfn; delete old bakfn
  893.         mov     ah,41h          ; dos delete function call
  894.         int     21h             ; /
  895.         ;
  896.         mov     dx,offset dgroup:_savfn; rename savfn to bakfn
  897.         mov     di,offset dgroup:_bakfn
  898.         mov     ah,56h          ; dos rename function call
  899.         int     21h             ; /
  900.         ;
  901. workh4e:mov     dx,offset dgroup:_savfn; point to file name
  902.         call    savmods         ; save modules
  903.         test    errflg,-1       ; any errors?
  904.         jz      workh4f         ; no, branch
  905.         mov     dx,offset dgroup:_errwr; yes, setup message
  906.         call    errmsg          ; do msg, get response
  907.         cmp     al,'I'          ; want to ignore?
  908.         jz      workh4f         ; /
  909.         cmp     al,'R'          ; Retry
  910.         jz      workh4e         ; /
  911.         jmp     split           ; must be split
  912.         ;
  913. workh4f:
  914.         mov     pdf,80h         ; reset mouse flag
  915.         call    curon           ; cursor back on
  916.         call    workh4c         ; fix menu & HLT status
  917.         call    getdir          ; show directory
  918.         jmp     workx           ; exit
  919.         ;
  920. workh4b:cmp     cmdflg,0        ; was it clear?
  921.         jz      workh4d         ; yes, branch
  922.         jmp     workx           ; no, ignore
  923.         ;
  924. workh4d:mov     bx,3ah          ; point menu text
  925.         call    horzon          ; turn on
  926.         call    tmphlt          ; set temp HLT
  927.         mov     cmdflg,19       ; set command flag = 19
  928.         mov     doesc,offset workh4c ; set up ESC
  929.         jmp     workx           ; exit
  930. ;--------------------------------------------------------------
  931. ; escape from SAVE
  932. ;
  933. workh4c:mov     bx,3ah          ; turn off highlight
  934.         call    horzoff         ; /
  935.         call    clrhlt          ; fix hlt status
  936.         ret
  937. ;==============================================================
  938. ; REDO command given, turn on highlite, set cmdflg to 18
  939. ;
  940. workh5a:
  941.         test    _tmpfn,-1       ; want to do it?
  942.         jz      workh5e         ; no, branch
  943.         ;
  944.         mov     bx,30h          ; address of UNDO
  945.         cmp     cmdflg,18       ; already set?
  946.         jnz     workh5b         ; no, branch
  947.         mov     cmdflg,0        ; clear the command
  948.         ;
  949.         call    curoff          ; zip cursor
  950.         call    lodmod          ; load modules
  951.         ;
  952.         call    showfn          ; show the save filename
  953.         call    getdir          ; show directory enterys
  954.         call    dopath          ; show current path
  955.         call    dompab          ; show mpad status
  956.         call    menus           ; draw menus
  957.         ;
  958.         mov     pdf,80h         ; reset mouse flag
  959.         mov     curonf,1        ; don't restore
  960.         call    curon           ; cursor back on
  961.         mov     bx,26h          ; turn off highlight
  962.         call    horzoff         ; /
  963.         mov     bx,160*10       ; address of menu text
  964.         call    turnoff         ; turn off highlight
  965.         call    showfn          ; show exit file name
  966.         call    fixhlt          ; clear temp HLT
  967.         mov     lodflg,2        ; flag that a load happened
  968. workh5e:jmp     workx           ; exit
  969.         ;
  970. workh5b:cmp     cmdflg,0        ; was it clear?
  971.         jz      workh5d         ; yes, branch
  972.         jmp     workx           ; no, ignore
  973.         ;
  974. workh5d:mov     bx,30h          ; point menu text
  975.         call    horzon          ; turn on
  976.         call    tmphlt          ; set temp HLT
  977.         mov     cmdflg,18       ; set command flag = 19
  978.         mov     doesc,offset workh5c ; set up ESC
  979.         jmp     workx           ; exit
  980. ;--------------------------------------------------------------
  981. ; escape from REDO
  982. ;
  983. workh5c:mov     bx,30h          ; turn off highlight
  984.         call    horzoff         ; /
  985.         call    clrhlt          ; clear temp hlt
  986.         ret
  987. ;--------------------------------------------------------------
  988. ; NAME command, put new name in _savfn
  989. ;
  990. workh6a:call    curoff                  ; zip cursor
  991.         ;
  992.         mov     ah,2                    ; bios set cursor position
  993.         mov     bh,0                    ; page 0
  994.         mov     dx,1023H                ; x,y of cursor
  995.         int     10H                     ; do bios int
  996.         ;
  997.         mov     _savfn,'.'              ; clear the name area
  998.         call    showfn                  ; /
  999.         mov     _inbuf,9                ; 8 chars max
  1000.         call    getkey                  ; get them
  1001.         ;
  1002.         mov     cx,8                    ; put them in savfn
  1003.         mov     bx,offset dgroup:_inbuf+2;  /
  1004.         mov     di,offset dgroup:_savfn ; /
  1005. workh6b:mov     al,[bx]                 ; get the char
  1006.         cmp     al,21h                  ;  /
  1007.         jb      workh6d                 ; /
  1008.         mov     [di],al                 ; put char in savfn buffer
  1009.         inc     di                      ; bump fn pointer
  1010.         inc     bx                      ; bump cmd line pointer
  1011.         loop    workh6b                 ; loop to max of input chars
  1012.         ;
  1013. workh6d:mov     byte ptr   [di],'.'     ; set up save extension
  1014.         mov     byte ptr  1[di],'M'     ;    /
  1015.         mov     byte ptr  2[di],'B'     ;   /
  1016.         mov     byte ptr  3[di],' '     ;  /
  1017.         mov     byte ptr  4[di],0       ; /
  1018.         call    showfn                  ; show it
  1019.         mov     curadr,0a44h            ; set cursor to 0th char
  1020.         mov     curonf,1                ; don't restore
  1021.         call    curon                   ; but turn it on
  1022.         mov     pdf,80h                 ; /
  1023.         mov     clrchf,1                ; setup to clear chanl
  1024.         jmp     workx                   ; exit
  1025. ;--------------------------------------------------------------
  1026. ; PATH command, set new directory path
  1027. ;
  1028. workh7a:call    curoff                  ; zip cursor
  1029.         ;
  1030.         mov     ax,0b800h               ; set up video seg
  1031.         mov     es,ax                   ; /
  1032.         mov     bx,58H+(16*160)         ; offset for line
  1033.         mov     ax,whi                  ; set color
  1034.         mov     cx,35                   ; words in line
  1035. workh7b:mov     es:[bx],ax              ; set the word
  1036.         inc     bx                      ; bump
  1037.         inc     bx                      ; /
  1038.         loop    workh7b                 ; do the line
  1039.         ;
  1040.         mov     ah,2                    ; bios set cursor position
  1041.         mov     bh,0                    ; page 0
  1042.         mov     dx,102CH                ; x,y of cursor
  1043.         int     10H                     ; do bios int
  1044.         ;
  1045.         mov     _inbuf,36               ; 36 chars max
  1046.         call    getkey                  ; get them
  1047.         mov     al,_inbuf+1             ; get number of chars
  1048.         mov     ah,0                    ;  /
  1049.         mov     bx,offset dgroup:_inbuf+2;/
  1050.         mov     dx,bx                   ; save for path
  1051.         add     bx,ax                   ; point to end of string
  1052.         mov     byte ptr [bx],0         ; null terminate
  1053.         ;
  1054.         mov     ah,19h                  ; get current disk drive
  1055.         int     21h                     ; dos call
  1056.         mov     _inbuf,al               ; put it away
  1057.         ;
  1058.         cmp     byte ptr _inbuf+2,'\'   ; directory or drive?
  1059.         jz      workh7c                 ; branch if directory
  1060.         ;
  1061.         mov     al,_inbuf+2             ; get the new drive
  1062.         call    touc                    ; make uppercase
  1063.         sub     al,'A'                  ; make A=0, B=1, etc.
  1064.         mov     dl,al                   ; set up for dos call
  1065.         mov     ah,0eh                  ; set default drive
  1066.         int     21h                     ; dos call
  1067.         ;
  1068.         cmp     byte ptr _inbuf+4,'\'   ; drive change only
  1069.         jnz     workh7d                 ; yes, don't change path
  1070.         ;
  1071. workh7c:mov     ah,3bh                  ; set new path
  1072.         mov     dx,offset dgroup:_inbuf+2;/
  1073.         int     21h                     ; dos call
  1074.         jnc     workh7d                 ; branch if ok
  1075.         ;
  1076.         mov     dl,_inbuf               ; else get old drive
  1077.         mov     ah,0eh                  ; set default drive
  1078.         int     21h                     ; dos call
  1079.         ;
  1080. workh7d:call    dopath                  ; show it
  1081.         call    getdir                  ; show new directory
  1082.         ;
  1083.         mov     curadr,0a56h            ; set cursor to 0th char
  1084.         mov     curonf,1                ; don't restore
  1085.         call    curon                   ; but turn it on
  1086.         mov     pdf,80h                 ; /
  1087.         jmp     workx                   ; exit
  1088. ;==============================================================
  1089. ; Process file area loads, set cmdflg = 20
  1090. ;
  1091. workf0: call    curoff                  ; zip cursor
  1092.         mov     bx,0b800H               ; setup video seg
  1093.         mov     es,bx                   ; /
  1094.         mov     bx,curadr               ; get cursor address
  1095.         mov     al,es:1[bx]             ; get attribute byte
  1096.         and     al,lo                   ; strip highlight
  1097.         cmp     al,yellow               ; got anything? 
  1098.         jz      workf0a                 ; yes, branch
  1099.         jmp     workfq                  ; no, cancel the command
  1100.         ;
  1101. workf0a:cmp     byte ptr es:[bx],' '    ; is it a letter
  1102.         ja      workf1                  ; yes, go on
  1103.         jmp     workfq                  ; no, cancel
  1104.         ;
  1105. workf1: dec     bx                      ; no, back up
  1106.         dec     bx                      ; /
  1107.         cmp     byte ptr es:[bx],' '    ; look for 1st non-letter
  1108.         ja      workf1                  ; /
  1109.         inc     bx                      ; point to start
  1110.         inc     bx                      ; /
  1111.         ;
  1112.         cmp     cmdflg,20               ; ready to do it
  1113.         jz      workf1a                 ; yes, branch
  1114.         cmp     cmdflg,4                ; DEL
  1115.         jz      workf1b                 ; yes, branch
  1116.         jmp     workf8                  ; no, exit
  1117.         ;
  1118. workf1a:test    byte ptr es:1[bx],hi    ; hi bit set
  1119.         jnz     workf1b                 ; yes, go on
  1120.         jmp     workfq                  ; no, cancel
  1121.         ;
  1122. workf1b:mov     di,offset dgroup:_lodfn ; point to file text area
  1123.         mov     cx,8                    ; 8 maximum to do
  1124. workf3: mov     al,es:[bx]              ; get first char
  1125.         cmp     al,' '                  ; ignore spaces
  1126.         jna     workf2                  ; /
  1127.         mov     [di],al                 ; put char in save file name buffer
  1128.         inc     bx                      ; bump screen pointer
  1129.         inc     bx                      ; /
  1130.         inc     di                      ; bump text pointer
  1131.         loop    workf3                  ; loop to max
  1132.         ;
  1133. workf2: mov     byte ptr [di],'.'       ; set up extension
  1134.         mov     byte ptr 1[di],'M'      ;    /
  1135.         mov     byte ptr 2[di],'B'      ;   /
  1136.         mov     byte ptr 3[di],' '      ;  /
  1137.         mov     byte ptr 4[di],0        ; /
  1138.         ;
  1139.         cmp     cmdflg,20               ; want to load?
  1140.         jz      workf2a                 ; yes, go do it
  1141.         mov     ah,41H                  ; else DEL file
  1142.         mov     dx,offset dgroup:_lodfn ; point to file name
  1143.         int     21H                     ; zap it
  1144.         mov     cmdflg,0                ; clear the cmd
  1145.         call    getdir                  ; show directory enterys
  1146.         mov     pdf,80h                 ; reset mouse flag
  1147.         mov     curonf,1                ; don't restore
  1148.         call    curon                   ; but turn it on
  1149.         mov     bx,5a0h                 ; turn off DEL hilight
  1150.         call    turnoff                 ; /
  1151.         jmp     workx                   ; split
  1152.         ;
  1153. workf2a:
  1154.         mov     ah,3dh                  ; dos open file command
  1155.         mov     al,0                    ; read only
  1156.         mov     dx,offset dgroup:_lodfn ; point to file name
  1157.         int     21H                     ; open the file
  1158.         jc      workf6                  ; exit if error
  1159.         call    lodmod0                 ; load modules
  1160.         ;
  1161. workf6: call    showfn                  ; show the save filename
  1162.         call    getdir                  ; show directory enterys
  1163.         call    dopath                  ; show current path
  1164.         call    dompab                  ; show mpad status
  1165.         call    menus                   ; draw menus
  1166.         ;
  1167. workfx: mov     cmdflg,0                ; reset
  1168.         mov     pdf,80h                 ; fix mouse flag
  1169. workfz: mov     curonf,1                ; don't restore
  1170.         call    curon                   ; but turn it on
  1171.         call    fixhlt                  ; fix hlt status
  1172.         mov     lodflg,2                ; flag that a load happened
  1173.         jmp     workx                   ; exit
  1174.         ;
  1175. workfq: mov     pdf,80h                 ; /
  1176.         jmp     cancel                  ; so forget it
  1177. ;--------------------------------------------------------------
  1178. ; cmdflg was not alreay 20, setup new one
  1179. ;
  1180. workf8: cmp     cmdflg,0                ; was it clear?
  1181.         jz      workf9                  ; yes, branch
  1182.         jmp     cancel                  ; no, cancel
  1183.         ;
  1184. workf9: mov     dirptr,bx               ; text location
  1185.         call    dirnon                  ; highlight
  1186.         call    tmphlt                  ; set temp HLT
  1187.         mov     cmdflg,20               ; set command flag = 20
  1188.         mov     doesc,offset workf10    ; set up ESC
  1189.         mov     curonf,1                ; don't restore
  1190.         call    curon                   ; but turn it on
  1191.         jmp     workx                   ; exit
  1192. ;--------------------------------------------------------------
  1193. ; escape from DIR load
  1194. ;
  1195. workf10:call    clrhlt                  ; fix hlt status
  1196.         call    dirnoff                 ; lowlight
  1197.         ret
  1198. ;--------------------------------------------------------------
  1199. ; highlight a directory file name
  1200. ; call with cursor OFF
  1201. ;
  1202. dirnon: mov     cx,8                    ; 8 chars to do
  1203.         mov     bx,0b800h               ; do page 0 only
  1204.         mov     es,bx                   ;
  1205.         mov     bx,dirptr               ; get last picked name
  1206. dirnon1:
  1207.         or      byte ptr es:1[bx],hi    ; make bright
  1208.         inc     bx                      ; bump pointer
  1209.         inc     bx                      ; /
  1210.         loop    dirnon1                 ; do all 8
  1211.         ret
  1212. ;--------------------------------------------------------------
  1213. ; loghlight a directory file name
  1214. ; call with cursor ON
  1215. ;
  1216. dirnoff:call    curoff                   ; cursor on
  1217.         mov     cx,8                    ; 8 chars to do
  1218.         mov     bx,0b800h               ; do page 0 only
  1219.         mov     es,bx                   ;
  1220.         mov     bx,dirptr               ; get last picked name
  1221. dirnoff1:
  1222.         and     byte ptr es:1[bx],lo    ; make dark  
  1223.         inc     bx                      ; bump pointer
  1224.         inc     bx                      ; /
  1225.         loop    dirnoff1                ; do all 8
  1226.         mov     curonf,1                ; don't restore 
  1227.         jmp     curon                   ; keep it right
  1228. ;==============================================================
  1229. ; Process Screen command.
  1230. ;
  1231. work0bx:jmp     workx           ; split
  1232.         ;
  1233. work00:
  1234.         call    curoff          ; cursor off while reading screen
  1235.         call    cmdchk          ; get new cmdloc, ptr, tag, cnt, & col
  1236.         cmp     vpagen,0        ; on page 0?
  1237.         jz      work0b          ; yes, branch
  1238.         cmp     cmdflg,3        ; reincarnate?
  1239.         jz      work0b          ; yes, branch
  1240.         call    varlst          ; else find the variable list
  1241.         or      di,di           ; is it good
  1242.         jz      work0b          ; no, branch
  1243.         mov     varnow,di       ; save it
  1244. work0b: call    curon           ; cursor back on
  1245.         cmp     cmdflg,3        ; move, copy, or reincarnate?
  1246.         ja      workp0          ; no, process other stuff
  1247.         jmp     work20a         ; yes, branch
  1248. ;--------------------------------------------------------------
  1249. ; process pending commands > 3
  1250. ; 4 = delete module
  1251. ; 5 = priority swap
  1252. ; 6 = bye
  1253. ; 7 = user variable input
  1254. ; 8 = flagged output to variable input
  1255. ; 9 = special user input (magenta inputs )
  1256. workp0: cmp     cmdflg,4        ; delete?
  1257.         jnz     workp1          ; /
  1258.         jmp     workpa          ; yes, go do the delete
  1259. workp1: cmp     cmdflg,5        ; priority?
  1260.         jnz     workp2          ; /
  1261.         jmp     work6           ; yes, go do the priority swap
  1262. workp2: cmp     cmdflg,6        ; trying to QUIT
  1263.         jnz     workp3          ; /
  1264.         jmp     _cancel         ; yes, kill it
  1265. workp3: cmp     cmdflg,7        ; user input value?
  1266.         jnz     workp4          ; /
  1267.         jmp     _cancel         ; yes, set it
  1268. workp4: cmp     cmdflg,8        ; flagged output value?
  1269.         jnz     workp5          ; /
  1270.         jmp     work8           ; yes, go set the value
  1271. workp5: cmp     cmdflg,9        ; special user input?
  1272.         jnz     workp6          ; /
  1273.         jmp     work9           ; yes, go process magenta stuff
  1274. workp6: cmp     cmdflg,10       ; special user input?
  1275.         jnz     workp7          ; /
  1276.         jmp     work9           ; yes, go process magenta stuff
  1277. workp7: cmp     cmdflg,16       ; EXIT?
  1278.         jnz     workp8          ;  /
  1279.         jmp     _cancel         ; yes, kill it
  1280. workp8: cmp     cmdflg,17       ; UNDO?
  1281.         jnz     workp9          ;  /
  1282.         jmp     _cancel         ; yes, kill it
  1283. workp9: cmp     cmdflg,18       ; REDO?
  1284.         jnz     workp10         ; /
  1285.         jmp     _cancel         ; yes, kill it
  1286. workp10:cmp     cmdflg,19       ; was SAVE set?
  1287.         jnz     workp11         ; /
  1288.         jmp     _cancel         ; yes, kill it
  1289. workp11:cmp     cmdflg,20       ; was directory load pending
  1290.         jnz     workp12         ; /
  1291.         jmp     _cancel         ; yes, kill it
  1292. workp12:
  1293. workpq: mov     cmdflg,0        ; no, clear the flag
  1294.         jmp     workx           ; back to the work loop
  1295.  
  1296. ;--------------------------------------------------------------
  1297. ; no command pending above 3, check if cursor is a module,
  1298. ; if it is branch to work2a to do the pending create or move.
  1299. ; Otherwise, check color under cursor.
  1300. ; If white branch to work2e to set up a pending move/create.
  1301. ; If color is not white branch to work1 for further processing.
  1302. ;
  1303. work20a:test    curflg,1        ; already dragging something around?
  1304.         jz      work20c         ; yes, go do something with it
  1305.         jmp     work2a          ; /
  1306. work20c:cmp     cmdcol,7        ; is this a module pickup?
  1307.         jz      work2e          ; yes, go do it
  1308.         jmp     work1           ; no, go do something else
  1309. ;==============================================================
  1310. ; Module pickup requested: don't do anything except set the module
  1311. ; to be the cursor (so it can be dragged around), and set cmdflg
  1312. ; to indicate a pending module create or move.  If currently on
  1313. ; page 0, a new module will be created, if on any other page, the
  1314. ; existing module will be moved.  Nothing is done, however, until
  1315. ; the next command request.  Modules with "*" for the module number
  1316. ; are not allowed to be picked up. 
  1317. ; Modules with "X" will be reincarnated.
  1318. ;
  1319. work2e: cmp     vpagen,0        ; is this page 0?
  1320.         jnz     work2d          ; no, branch
  1321.         mov     bx,cmdloc       ; get the module number
  1322.         mov     es,vpage        ;   /
  1323.         cmp     byte ptr es:2[bx],'*'; out of gas?
  1324.         jnz     work2e1         ; no, go on
  1325.         jmp     workx           ; yes, exit
  1326. work2e1:cmp     byte ptr es:2[bx],'X'; a deleted module?
  1327.         jnz     work2e2         ; no, go on
  1328.         jmp     workr           ; yes, go reincarnate it.
  1329. work2e2:mov     bx,cmdptr       ; set up the cursor
  1330.         mov     ax,2[bx]        ; ... to be the module
  1331.         mov     modchar,ax      ; the module source text
  1332.         call    setmod          ; ... is now the cursor
  1333.         mov     cmdflg,1        ; set the command flag
  1334.         jmp     workx           ; back to the work loop
  1335. ;==============================================================
  1336. ; It's not on page 0, so setup a copy of the existing module
  1337. ;
  1338. work2d: call    curoff          ; turn cursor off
  1339.         mov     ax,varnow       ; get variable table address
  1340.         mov     tmpsav,ax       ; save it
  1341.         mov     bx,cmdptr       ; set up the cursor
  1342.         mov     ax,2[bx]        ; ... to be the module
  1343.         mov     bx,ax           ; point to module source text
  1344.         mov     di,offset dgroup:$dummy; gonna put it in the dummy
  1345.         mov     cx,[bx]         ; get number of lines in module
  1346.         mov     [di],cx         ; store in dummy buffer
  1347.         add     di,4            ; bump index
  1348.         mov     bx,cmdloc       ; point to current screen text
  1349.         mov     es,vpage        ; get current screen seg
  1350. work2d1:mov     ax,es:-2[bx]    ; get left word
  1351.         mov     [di],ax         ; put in dummy
  1352.         or      byte ptr es:-1[bx],80h ; blink
  1353.         inc     di              ; bump index
  1354.         inc     di              ; /
  1355.         mov     ax,es:[bx]      ; get center word
  1356.         mov     [di],ax         ; put in dummy
  1357.         or      byte ptr es:1[bx],80h ; blink
  1358.         inc     di              ; bump index
  1359.         inc     di              ; /
  1360.         mov     ax,es:2[bx]     ; get right word 
  1361.         mov     [di],ax         ; put in dummy
  1362.         or      byte ptr es:3[bx],80h ; blink
  1363.         inc     di              ; bump index
  1364.         inc     di              ; /
  1365.         add     bx,160          ; next line
  1366.         loop    work2d1         ; loop til done
  1367.         mov     modchar,offset dgroup:$dummy ; set dummy as cursor source
  1368.         mov     curonf,1        ; don't replace blinking label
  1369.         call    curon           ; keep it even
  1370.         call    setmod          ; dummy copy is now the cursor
  1371.         mov     cmdflg,2        ; set the command flag
  1372.         mov     doesc, offset work2dx; setup for ESC
  1373.         jmp     workx           ; back to the work loop
  1374. ;--------------------------------------------------------------
  1375. ; escape from move
  1376. ; fixes blinking module
  1377. ;
  1378. work2dx:mov     di,tmpsav       ; find variable list
  1379.         mov     es,4[di]        ; get screen seg
  1380.         mov     bx,6[di]        ; get screen addr
  1381.         mov     di,[di]         ; get number of lines
  1382.         mov     di,2[di]        ;   /
  1383.         mov     cx,[di]         ; /
  1384.         jmp     unblink         ; zip blinking
  1385. ;==============================================================
  1386. ; Set up to drag around a gost module (module # = "X")
  1387. ;
  1388. workr:  call    curoff          ; zip old cursor
  1389.         mov     bx,cmdptr       ; set up new cursor...
  1390.         mov     tmpsav,bx       ; (save MODSRC for later)
  1391.         mov     ax,2[bx]        ; ... to be the module
  1392.         mov     bx,ax           ; point to module source text
  1393.         mov     di,offset dgroup:$dummy; gonna put it in the dummy
  1394.         mov     cx,[bx]         ; get number of lines in module
  1395.         mov     [di],cx         ; store in dummy buffer
  1396.         add     di,4            ; bump index
  1397.         add     bx,4            ;
  1398. workr1: mov     ax,[bx]         ; get left word
  1399.         mov     [di],ax         ; put in dummy
  1400.         inc     di              ; bump index
  1401.         inc     di              ;     /
  1402.         inc     bx              ;   /
  1403.         inc     bx              ; /
  1404.         mov     ax,[bx]         ; get center word
  1405.         mov     [di],ax         ; put in dummy
  1406.         inc     di              ; bump index
  1407.         inc     di              ;     /
  1408.         inc     bx              ;   /
  1409.         inc     bx              ; /
  1410.         mov     ax,[bx]         ; get right word 
  1411.         cmp     ah,white        ; this a label?
  1412.         jnz     workr2          ; no, branch
  1413.         mov     al,'X'          ; yes, change number to 'X'
  1414. workr2: mov     [di],ax         ; put in dummy
  1415.         inc     di              ; bump index
  1416.         inc     di              ;     /
  1417.         inc     bx              ;   /
  1418.         inc     bx              ; /
  1419.         loop    workr1          ; loop til done
  1420.         mov     modchar,offset dgroup:$dummy ; set dummy as cursor source
  1421.         mov     curonf,1        ; don't replace blinking label
  1422.         call    curon           ; keep it even
  1423.         call    setmod          ; dummy copy is now the cursor
  1424.         mov     cmdflg,3        ; set the command flag for reincarnate
  1425.         jmp     workx           ; back to the work loop
  1426. ;==============================================================
  1427. ; case of not currently dragging something, color <> white
  1428. ; possible commands (all not page 0):
  1429. ;       grey:    priority swap
  1430. ;       cyan:    flag output for value input from cmdflg = 7
  1431. ;       blue:    value input from user
  1432. ;       green:   value input from user
  1433. ;       magenta: user input
  1434.  
  1435.  
  1436. work1: cmp     vpagen,0         ; in page 0
  1437.         jz      work1x          ; yes, go back to the work loop
  1438.         ;                       ; no, ( process other commands)
  1439.         cmp     cmdcol,grey     ; priority swap?
  1440.         jnz     work1b          ; no, branch
  1441.         jmp     work60          ; yes, go do the priority swap
  1442. work1b: cmp     cmdcol,blue     ; value input from user?
  1443.         jnz     work1bb         ; no, branch
  1444.         jmp     work70          ; yes, go do user input
  1445. work1bb:cmp     cmdcol,green    ; value input from user?
  1446.         jnz     work1c          ; no, branch
  1447.         jmp     work70          ; yes, go do user input
  1448. work1c: cmp     cmdcol,cyan     ; output value flagged?
  1449.         jnz     work1d          ; no, branch
  1450.         jmp     work80          ; yes, process output value flag
  1451. work1d: cmp     cmdcol,magenta  ; want special user input
  1452.         jnz     work1x          ; no, branch
  1453.         jmp     work90          ; yes set up for special input
  1454. work1x: jmp     workx           ; and back to the work loop
  1455. ;==============================================================
  1456. ; Priority selected, set cmdflg = 5
  1457. ;
  1458. work60: mov     cmdflg,5        ; set the flag
  1459.         call    curoff          ; turn cursor off
  1460.         mov     ax,varnow       ; get variable table address
  1461.         mov     tmpsav,ax       ; save it
  1462.         mov     bx,cmdtag       ; highlight the command
  1463.         mov     es,vpage        ;          /
  1464.         or      byte ptr es:161[bx],7;   /
  1465.         or      byte ptr es:163[bx],7; /
  1466.         mov     curonf,1        ; don't restore
  1467.         call    curon           ; normal cursor
  1468.         mov     doesc,offset work61 ; set up for ESC
  1469.         jmp     workx           ; back to the work loop
  1470. ;--------------------------------------------------------------
  1471. ; escape from priority swap
  1472. ;
  1473. work61: mov     di,tmpsav       ; turn off highlight
  1474.         mov     es,4[di]        ; get seg
  1475.         mov     bx,6[di]        ; get addr
  1476.         mov     byte ptr es:161[bx],grey; zip hilight
  1477.         mov     byte ptr es:163[bx],grey; /
  1478.         mov     curonf,1        ; don't restore cursor
  1479.         ret
  1480. ;==============================================================
  1481. ; Output flag selected, set cmdflg = 8
  1482. ;
  1483. work80: mov     cmdflg,8        ; set the flag
  1484.         call    curoff          ; turn cursor off
  1485.         mov     ax,varnow       ; get variable table address
  1486.         mov     tmpsav,ax       ; save it
  1487.         mov     bx,cmdloc       ; highlight the command
  1488.         mov     locsav,bx       ; (save hilight addr)
  1489.         mov     es,vpage        ; /
  1490.         or      byte ptr es:1[bx],hi;   /
  1491.         or      byte ptr es:3[bx],hi; /
  1492.         mov     bx,cmdtag       ; get icon tag
  1493.         mov     al,es:[bx]      ;  /
  1494.         mov     ah,es:2[bx]     ; /
  1495.         mov     shosav,ax       ; save it
  1496.         mov     curonf,1        ; don't restore
  1497.         call    curon           ; normal cursor
  1498.         mov     doesc,offset work81 ; set up for ESC
  1499.         jmp     workx           ; back to the work loop
  1500. ;--------------------------------------------------------------
  1501. ; escape from flag output command
  1502. ;
  1503. work81: mov     di,tmpsav       ; turn off highlight
  1504.         mov     es,4[di]        ; get seg
  1505.         mov     bx,locsav       ; get addr
  1506.         and     byte ptr es:1[bx],lo; zip hilight
  1507.         and     byte ptr es:3[bx],lo; /
  1508. ;--------------------------------------------------------------
  1509. ; lowlight all inputs currently associated with output
  1510. ; if shoflg = 1
  1511. ;
  1512.         test    shoflg,1        ; wanna show inputs?
  1513.         jz      work81d         ; no, branch
  1514.         mov     shoflg,0        ; yes, zip flag
  1515.         mov     ax,shosav       ; get icon tag
  1516.         push    ds              ; save data seg
  1517.         mov     cx,0b800H       ; point to color screen
  1518.         mov     ds,cx           ; /
  1519.         mov     cx,4000H        ; 16K words to look at
  1520.         mov     bx,0            ; set up index
  1521. work81c:cmp     al,[bx]         ; got an icon match?
  1522.         jz      work81e         ; yes, go look
  1523.         ;
  1524. work81b:inc     bx              ; no, bump address
  1525.         inc     bx              ; /
  1526.         loop    work81c         ; loop
  1527.         pop     ds              ; restore data seg
  1528.         mov     pdf,80h         ; reset mouse flag        
  1529. work81d:mov     curonf,1        ; don't restore cursor
  1530.         ret                     ; exit
  1531.         ;
  1532. work81e:cmp     ah,2[bx]        ; got a module match
  1533.         jnz     work81b         ; no, go loop
  1534.         cmp     byte ptr 1[bx],green OR hi; is it a green label?
  1535.         jnz     work81b         ; no, go loop 
  1536.         and     byte ptr 1[bx],lo; zip hilight
  1537.         and     byte ptr 3[bx],lo; /
  1538.         jmp     short work81b   ; go to loop
  1539. ;--------------------------------------------------------------
  1540. ; process flagged output to become an input variable
  1541. ;
  1542. work8:  call    curoff
  1543.         cmp     cmdcol,blue     ; was an input variable selected?
  1544.         jz      work8y          ; yes, do it
  1545.         cmp     cmdcol,green    ; was an input variable selected?
  1546.         jz      work8y          ; yes, go doit
  1547.         cmp     cmdcol,cyan OR hi; wanna show exitsting connections
  1548.         jnz     work8x          ; no, exit
  1549. ;--------------------------------------------------------------
  1550. ; highlight all inputs currently associated with output
  1551. ;
  1552.         mov     shoflg,1        ; set the show flag
  1553.         call    curoff          ; turn cursor off
  1554.         mov     ax,shosav       ; get module icon
  1555.         push    ds              ; save data seg
  1556.         mov     cx,0b800H       ; point to color screen
  1557.         mov     ds,cx           ; /
  1558.         mov     cx,4000H        ; 16K words to look at
  1559.         mov     bx,0            ; set up index
  1560. work80c:cmp     al,[bx]         ; got an icon match?
  1561.         jz      work80e         ; yes, go look
  1562.         ;
  1563. work80b:inc     bx              ; no, bump address
  1564.         inc     bx              ; /
  1565.         loop    work80c         ; loop
  1566.         ;
  1567.         pop     ds              ; restore data seg
  1568.         mov     curonf,1        ; don't restore
  1569.         mov     pdf,80h         ; reset mouse flag
  1570. work8x: call    curon           ; normal cursor
  1571.         jmp     workx           ; exit
  1572.         ;
  1573. work80e:cmp     ah,2[bx]        ; got a module match
  1574.         jnz     work80b         ; no, go loop
  1575.         cmp     byte ptr 1[bx],green; is it a green label
  1576.         jnz     work80b         ; no, go loop 
  1577.         or      byte ptr 1[bx],hi;yes, set the highlight
  1578.         or      byte ptr 3[bx],hi; /
  1579.         jmp     short work80b   ; go to loop
  1580. ;--------------------------------------------------------------
  1581. ; connect flagged output to input
  1582. ;
  1583. work8y: mov     cmdflg,0        ; yes, clear cmdflg
  1584.         call    work81          ; clear the highlight
  1585.         mov     bx,6[di]        ; get the screen addr of source module
  1586.         mov     es,4[di]        ; get screen seg of module
  1587.         mov     dl,es:[bx]      ; dl = tag character
  1588.         mov     dh,es:2[bx]     ; dh = module number tag
  1589.         ;
  1590.         mov     cx,di           ; calculate the output address
  1591.         add     cx,8            ; cx = address of output value
  1592.         ;
  1593.         mov     es,vpage        ; get current screen seg
  1594.         mov     bx,cmdloc       ; get current variable pointer
  1595.         mov     es:[bx],dl      ; set the label to input module
  1596.         mov     es:2[bx],dh     ; /
  1597.         mov     al,green        ; set the color to green
  1598.         mov     es:1[bx],al     ;   /
  1599.         mov     es:3[bx],al     ; /
  1600.         ;
  1601.         mov     ax,0            ; find out which value it is
  1602. work80a:sub     bx,160          ;       /
  1603.         add     ax,2            ;     /
  1604.         cmp     byte ptr es:1[bx],blue
  1605.         jz      work80a         ; /
  1606.         cmp     byte ptr es:1[bx],green
  1607.         jz      work80a         ; /
  1608.         mov     bx,ax           ; bx = word offset to variables
  1609.         mov     di,varnow       ; get current variable table
  1610.         mov     10[bx+di],cx    ; set address of new variable
  1611.         ;
  1612.         call    curon
  1613.         jmp     workx
  1614. ;==============================================================
  1615. ; User value input selected, set cmdflg = 7
  1616. ;
  1617. work70: mov     cmdflg,7        ; set the flag
  1618.         call    curoff          ; turn cursor off
  1619.         mov     ax,varnow       ; get variable table address
  1620.         mov     tmpsav,ax       ; save it
  1621.         mov     bx,cmdloc       ; highlight the command
  1622.         mov     locsav,bx       ; (save hilight addr)
  1623.         mov     es,vpage        ;       /
  1624.         or      byte ptr es:1[bx],hi;  /
  1625.         or      byte ptr es:3[bx],hi; /
  1626.         mov     ax,0            ; find out which value it is
  1627. work70a:sub     bx,160          ;        /
  1628.         add     ax,2            ;       /
  1629.         cmp     byte ptr es:1[bx],blue;/
  1630.         jz      work70a         ;     /
  1631.         cmp     byte ptr es:1[bx],green
  1632.         jz      work70a         ;   /
  1633.         mov     holdv,ax        ; save the offset
  1634.         ;
  1635.         mov     bx,holdv        ; read current value
  1636.         mov     di,tmpsav       ; get value table for module
  1637.         mov     bx,10[bx+di]    ; bx = address of value
  1638.         mov     dl,[bx]         ; dl = binary value
  1639.         mov     dh,0            ; make into a word
  1640.         add     dx,dx           ; make into a word
  1641.         add     dx,offset dgroup:@zero; dx = address pointer into number table
  1642.         mov     bx,holdv        ; get offset to the value
  1643.         mov     10[bx+di],dx    ; store the new value
  1644.         mov     bx,dx           ; convert number addr to number
  1645.         mov     al,[bx]         ; /
  1646.         tohex                   ; convert it to ascii hex
  1647.         mov     es,4[di]        ; get seg
  1648.         mov     bx,locsav       ; get addr
  1649.         mov     es:[bx],ah      ; display number
  1650.         mov     es:2[bx],al     ; /
  1651.         mov     al,blue+hi      ; set color to blue (may have been green)
  1652.         mov     es:1[bx],al     ;  /
  1653.         mov     es:3[bx],al     ; /
  1654.         ;
  1655.         mov     curonf,1        ; don't restore
  1656.         call    curon           ; normal cursor
  1657.         mov     doesc,offset work71; set up for ESC
  1658.         mov     al,curcol       ; save cursor color
  1659.         mov     savcol,al       ; /
  1660.         mov     ax,3            ; get current position
  1661.         int     33h             ; /
  1662.         mov     ax,7            ; don't move cursor
  1663.         push    dx              ;       /
  1664.         mov     dx,cx           ;      /
  1665.         int     33h             ;     /
  1666.         pop     dx              ;    /
  1667.         mov     cx,dx           ;   /
  1668.         mov     ax,8            ;  /
  1669.         int     33h             ; /
  1670.         mov     curcol,0        ; hide the cursor
  1671.         mov     valflg,1        ; flag value input is happening
  1672.         jmp     workx           ; back to the work loop
  1673. ;--------------------------------------------------------------
  1674. ; escape from value input command
  1675. ;
  1676. work71: mov     di,tmpsav       ; turn off highlight
  1677.         mov     es,4[di]        ; get seg
  1678.         mov     bx,locsav       ; get addr
  1679.         and     byte ptr es:1[bx],lo; zip hilight
  1680.         and     byte ptr es:3[bx],lo; /
  1681.         mov     al,savcol       ; restore cursor color
  1682.         mov     curcol,al       ;     /
  1683.         mov     dx,199          ; maximum y
  1684.         mov     cx,0            ; minimum y
  1685.         mov     ax,8            ; set min, max allowable pdy values
  1686.         int     33h             ; /
  1687.         mov     ax,7            ; set min, max allowable pdx values
  1688.         mov     dx,639          ; maximum x
  1689.         mov     cx,0            ; minimum x
  1690.         int     33h             ; set it
  1691.         mov     es,vpage        ; lowlight the menu readout        
  1692.         mov     bx,960H         ; addr of decimal readout
  1693.         mov     byte ptr es:1[bx],blue ; make dark  
  1694.         mov     byte ptr es:3[bx],blue ;   /
  1695.         mov     byte ptr es:5[bx],blue ;  /
  1696.         mov     byte ptr es:7[bx],blue ; /
  1697.         mov     bx,0A00H        ; addr of note readout
  1698.         mov     byte ptr es:1[bx],blue ; make dark  
  1699.         mov     byte ptr es:3[bx],blue ;   /
  1700.         mov     byte ptr es:5[bx],blue ;  /
  1701.         mov     byte ptr es:7[bx],blue ; /
  1702.         mov     curonf,1        ; don't restore under cursor
  1703.         mov     valflg,0        ; finished with value input
  1704.         ret
  1705. ;--------------------------------------------------------------
  1706. ; case of pdf = 0, cmdflg = 7, and change in pdx,pdy
  1707. ; process value input from user
  1708. ;
  1709. work72: call    curoff          ; cursor off
  1710.         mov     bx,holdv        ; get offset to the value
  1711.         mov     di,tmpsav       ; get value table for module
  1712.         mov     bx,10[bx+di]    ; get adr of current value
  1713.         mov     dx,mickx        ; get mickey count
  1714.         add     dx,[bx]         ; add value to mickeys
  1715.         jz      work72b         ; if = 0, go on
  1716.         cmp     dx,255          ; if = 255, go on
  1717.         jz      work72b         ; /
  1718.         test    dh,128          ; if neg, make it 0
  1719.         jz      work72a         ; /
  1720.         mov     dx,0            ; /
  1721. work72a:test    dh,1            ; if > 255, make it 255
  1722.         jz      work72b         ;  /
  1723.         mov     dx,255          ; /
  1724. work72b:add     dx,dx           ; make into a word
  1725.         mov     di,tmpsav       ; get value table for module
  1726.         add     dx,offset dgroup:@zero; dx = address pointer into number table
  1727.         mov     bx,holdv        ; get offset to the value
  1728.         mov     10[bx+di],dx    ; store the new value
  1729.         mov     bx,dx           ; convert number addr to number
  1730.         mov     al,[bx]         ; /
  1731.         push    ax              ; save for decimal conversion
  1732.         tohex                   ; convert it to ascii hex
  1733.         mov     es,4[di]        ; get seg
  1734.         mov     bx,locsav       ; get addr
  1735.         mov     es:[bx],ah      ; display number
  1736.         mov     es:2[bx],al     ; /
  1737.         mov     al,blue+hi      ; set color to blue (may have been green)
  1738.         mov     es:1[bx],al     ;  /
  1739.         mov     es:3[bx],al     ; /
  1740.         mov     bx,960H         ; address of decimal readout
  1741.         mov     colr,blue+hi    ; set highlight blue
  1742.         pop     ax              ; get the number again
  1743.         call    todec           ; show it in decimal
  1744.         mov     bx,0A00h        ; address of note readout
  1745.         call    tonote          ; show it as CM scale
  1746.         mov     curonf,1        ; don't restore cursor
  1747.         call    curon           ; turn it back on
  1748. work72x:jmp     workx           ; exit
  1749. ;==============================================================
  1750. ; Special User input selected, set cmdflg = 9
  1751. ; magflg gets set here:
  1752. ;       no-value--> 0
  1753. ;       up/down --> 1
  1754. ;       channel --> 2
  1755. ;       value   --> 3
  1756. ;
  1757. work90: mov     cmdflg,9        ; else set the flag for channel value
  1758.         call    curoff          ; turn cursor off
  1759.         mov     di,varnow       ; get variable table address
  1760.         mov     tmpsav,di       ; save it
  1761.         mov     varsav,di       ; save it
  1762.         mov     bx,[di]         ; get exe addr of special routine
  1763.         mov     ax,40[bx]       ; ax = exec addr of special
  1764.         mov     special,ax      ; save it
  1765.         mov     bx,cmdloc       ; highlight the command
  1766.         mov     locsav,bx       ; (save hilight addr)
  1767.         mov     es,vpage        ;        /
  1768.         mov     magflg,0        ; set flag for no-value
  1769.         cmp     byte ptr es:[bx],'#'; is this a no-value cmd
  1770.         jz      work90b         ; yes, set up for no-value
  1771.         inc     magflg          ; no, set flag for up/down
  1772.         cmp     byte ptr es:[bx],1eh; branch if up/down
  1773.         jz      work90b         ; /
  1774.         or      byte ptr es:1[bx],hi; highlight single for channel
  1775.         inc     magflg          ; set magenta flag for channel
  1776.         cmp     byte ptr es:3[bx],white; is this a channel cmd
  1777.         jz      work90b         ; yes, branch
  1778.         inc     magflg          ; no, set up for value change
  1779.         or      byte ptr es:3[bx],hi; highlight double for value
  1780. work90b:mov     ax,0            ; find out which value it is
  1781. work90a:sub     bx,160          ;       /
  1782.         add     ax,2            ;     /
  1783.         cmp     byte ptr es:1[bx],magenta
  1784.         jz      work90a         ; /
  1785.         mov     holdv,ax        ; save the offset
  1786.         mov     curonf,1        ; don't restore
  1787.         call    curon           ; normal cursor
  1788.         cmp     magflg,3        ; want value input?
  1789.         jnz     work90x         ; no, exit
  1790.         mov     al,curcol       ; save cursor color
  1791.         mov     savcol,al       ; /
  1792.         mov     ax,3            ; get current position
  1793.         int     33h             ; /
  1794.         mov     ax,7            ; don't move cursor
  1795.         push    dx              ;       /
  1796.         mov     dx,cx           ;      /
  1797.         int     33h             ;     /
  1798.         pop     dx              ;    /
  1799.         mov     cx,dx           ;   /
  1800.         mov     ax,8            ;  /
  1801.         int     33h             ; /
  1802.         mov     curcol,0        ; hide the cursor
  1803. work90x:mov     doesc,offset work91 ; set up for ESC
  1804.         mov     usrflg,1        ; flag user input is happening
  1805.         mov     ax,special      ; get the special routine
  1806.         call    ax              ; do it
  1807.         jmp     workx           ; back to the work loop
  1808. ;--------------------------------------------------------------
  1809. ; escape from special user command
  1810. ;
  1811. work91: mov     usrflg,0        ; clear happening flag
  1812.         cmp     magflg,3        ; data input
  1813.         jnz     work91a         ; no, branch
  1814.         jmp     work71          ; yes, same as blue
  1815.         ;
  1816. work91a:mov     di,varsav       ; turn off highlight
  1817.         mov     es,4[di]        ; get seg
  1818.         mov     bx,locsav       ; get addr
  1819.         and     byte ptr es:1[bx],lo; zip hilight
  1820.         mov     ax,offset noop  ; reset special
  1821.         mov     special,ax      ; /
  1822.         mov     curonf,1        ; don't restore cursor
  1823.         ret                     ; return from call
  1824. ;--------------------------------------------------------------
  1825. ; process special user input routine
  1826. ;
  1827. work9:  mov     cmdflg,0
  1828.         mov     usrflg,0
  1829.         mov     ax,special
  1830.         jmp     ax
  1831. ;--------------------------------------------------------------
  1832. ; special user input routines
  1833. ; case of pdf = 0, cmdflg = 9, and change in pdx,pdy
  1834. ; process value input from user
  1835. ;
  1836. work92: cmp     magflg,2        ; want channel?
  1837.         jz      work92a         ; yes, branch
  1838.         cmp     magflg,3        ; want data?
  1839.         jz      work92e         ; yes, branch
  1840.         jmp     workx           ; no, exit
  1841.  
  1842. work92a:mov     dl,pdx          ; get x value
  1843.         sub     dl,8            ; offset by 8
  1844.         jnb     work92d         ; branch if ok
  1845.         mov     dl,0            ; else set to 0
  1846. work92d:cmp     dl,63           ; max is 63
  1847.         jna     work92b         ; branch if ok
  1848.         mov     dl,63           ; else max out
  1849. work92b:shr     dl,1            ; /4
  1850.         shr     dl,1            ; /
  1851.         and     dl,0fH          ; only use low nybble
  1852.         mov     al,dl           ; load with x value
  1853.         mov     di,varsav       ; get value table for module
  1854.         mov     byte ptr 8[di],dl; save in the output location
  1855.         tohex                   ; convert it to ascii hex
  1856.         mov     es,4[di]        ; get seg
  1857.         mov     bx,locsav       ; get addr
  1858.         mov     es:[bx],al      ; display number
  1859.         ;
  1860.         jmp     workx           ; exit
  1861.  
  1862. work92e:
  1863.         call    curoff          ; cursor off
  1864.         mov     bx,holdv        ; get offset to the value
  1865.         mov     di,varsav       ; get value table for module
  1866.         mov     dl,10[bx+di]    ; get current value
  1867.         mov     dh,0            ; /
  1868.         add     dx,mickx        ; get mickey count
  1869.         jz      work92g         ; if = 0, go on
  1870.         cmp     dx,255          ; if = 255, go on
  1871.         jz      work92g         ; /
  1872.         test    dh,128          ; if neg, make it 0
  1873.         jz      work92f         ; /
  1874.         mov     dx,0            ; /
  1875. work92f:test    dh,1            ; if > 255, make it 255
  1876.         jz      work92g         ;  /
  1877.         mov     dx,255          ; /
  1878. work92g:mov     di,varsav       ; get value table for module
  1879.         mov     bx,holdv        ; get offset to the value
  1880.         mov     10[bx+di],dl    ; store the new value
  1881.         mov     ax,dx           ; get value to ax
  1882.         push    ax              ; save for decimal conversion
  1883.         tohex                   ; convert it to ascii hex
  1884.         mov     es,4[di]        ; get seg
  1885.         mov     bx,locsav       ; get addr
  1886.         mov     es:[bx],ah      ; display number
  1887.         mov     es:2[bx],al     ; /
  1888.         mov     colr,magenta+hi ; set hilighted magenta
  1889.         pop     ax              ; get the number again
  1890.         mov     bx,960H         ; address of decimal readout
  1891.         call    todec           ; show it in decimal
  1892.         mov     bx,0A00h        ; address of note readout
  1893.         call    tonote          ; show it as CM scale
  1894.         mov     curonf,1        ; don't restore cursor
  1895.         call    curon           ; turn it back on
  1896.         jmp     workx           ; exit
  1897.  
  1898. ;==============================================================
  1899. ; have been dragging a module around, now want to do something with it
  1900. ;
  1901. work2a: call    setcur          ; set normal cursor again
  1902.         call    curoff          ; and then turn it off
  1903. work2b: cmp     vpagen,0        ; now in page 0 ?
  1904.         jnz     work2b1         ; no, continue
  1905.         jmp     work3           ; yes, go get a new module
  1906. work2b1:cmp     cmdflg,1        ; was last command "create module"?
  1907.         jz      work2c          ; yes, go do it
  1908.         cmp     cmdflg,2        ; no, was it "copy module"?
  1909.         jz      work2b2         ; yes, go do it
  1910.         jmp     work5           ; no, go do "reincarnate module" 
  1911. work2b2:jmp     work4           ; go do "copy module"
  1912. ;==============================================================
  1913. ; Want to create a new module.  Check that there is enough empty
  1914. ; space on the screen, and if ok, draw the module.
  1915. ;
  1916. work2c: mov     es,vpage        ; pick up video page segment
  1917.         mov     bx,curadr       ; current cursor offset
  1918.         mov     di,modchar      ; point to module char source
  1919.         mov     cx,[di]         ; get the line count
  1920.         mov     ax,0            ; clear register
  1921. work2f: or      al,es:1[bx]     ; look to see that there is space
  1922.         or      al,es:-1[bx]    ;       /
  1923.         or      al,es:3[bx]     ;     /
  1924.         add     bx,160          ;   /
  1925.         loop    work2f          ; /  
  1926.         or      al,al           ; was there?
  1927.         jz      work2g          ; yes, branch
  1928.         call    setmod          ; no, continue dragging the module around
  1929.         jmp     workx           ; back to work
  1930. ;--------------------------------------------------------------
  1931. ; There is enough space on the screen, show the module
  1932. ;
  1933. work2g: mov     cmdflg,0        ; clear the command flag
  1934.         mov     cx,[di]         ; get module line count again
  1935.         add     di,4            ; point to 1st char
  1936.         mov     bx,curadr       ; cursor address
  1937.         dec     bx              ; shift for module
  1938.         dec     bx              ; /
  1939.         call    shomod$         ; show the module
  1940.         mov     bx,curadr       ; cursor address
  1941.         mov     ax,last         ; get priority
  1942.         showp                   ; show priority
  1943. ;--------------------------------------------------------------
  1944. ; set up exetbl enteries, variable space, and pointers thereto
  1945. ;
  1946.         mov     bx,offset dgroup:_exetbl; calc addr of last module
  1947.         mov     ax,last         ;       /
  1948.         add     ax,ax           ;     /
  1949.         add     ax,ax           ;   /
  1950.         add     bx,ax           ; /
  1951.         mov     di,cmdptr       ; get address of modsrc table
  1952.         mov     ax,[di]         ; get module exe addr
  1953.         mov     [bx],ax         ; put it in exetbl
  1954.         mov     ax,varptr       ; get end of variable table
  1955.         mov     2[bx],ax        ; put it in exetbl
  1956.         mov     ax,offset work  ; get exe addr of work
  1957.         mov     4[bx],ax        ; put it at the end of the exetbl
  1958.         mov     ax,4[di]        ; get variable allocation for module
  1959.         mov     dx,ax           ; (dx=variable allocation)
  1960.         add     ax,ax           ; *2 for word
  1961.         add     ax,14           ; plus static allocation
  1962.         mov     bx,varptr       ; get current variable address
  1963.         add     ax,bx           ; ax = next one, bx = this one
  1964.         mov     varptr,ax       ; set varptr to new end of list
  1965. ;--------------------------------------------------------------
  1966. ; build the variable list
  1967. ;
  1968.         mov     [bx],di         ; first word is modsrc addr
  1969.         mov     ax,last         ; get priority
  1970.         mov     2[bx],ax        ; second word is priority
  1971.         push    bx              ; save variable list pointer for later
  1972.         inc     ax              ; bump index
  1973.         and     ax,maxmods      ; limit to 512 active modules
  1974.         mov     last,ax         ; store it
  1975.         mov     ax,vpage        ; current display seg addr
  1976.         mov     4[bx],ax        ; third word is vpage seg address
  1977.         mov     ax,curadr       ; current head of module text
  1978.         mov     6[bx],ax        ; forth word is addr of module label
  1979.         mov     word ptr 8[bx],0; fifth word is module output
  1980.         mov     10[bx],dx       ; sixth word is variable alloc count
  1981.         add     bx,12           ; point to start of variables
  1982.         mov     cx,4[di]        ; get number of variables allocated
  1983.         or      cx,cx           ; got at least one?
  1984.         jnz     work2h          ; yes, branch
  1985.         inc     cx              ; always make at least one
  1986. work2h: mov     word ptr [bx], offset dgroup:@zero; set variables to zero
  1987.         inc     bx              ; point to next
  1988.         inc     bx              ; /
  1989.         loop    work2h          ; loop til done
  1990.         mov     bx,-2           ; find out the module number
  1991. work2i: add     bx,2            ;      /
  1992.         cmp     word ptr 6[bx+di],0; /
  1993.         jnz     work2i          ; bx = module number *2
  1994.         mov     ax,bx           ; get actual number
  1995.         shr     ax,1            ; /
  1996.         mov     modnum,al       ; save it for the other guys
  1997.         pop     ax              ; get variable list ptr from stack
  1998.         mov     6[bx+di],ax     ; put it in modsrc
  1999.         mov     di,2[di]        ; get source text for the module
  2000. ;        mov     bx,2[di]        ; get page 0 address
  2001.         mov     bx,cmdtag       ; get page 0 address
  2002.         mov     ax,0b800H       ; page 0 segment
  2003.         mov     es,ax           ; set up seg reg for page 0
  2004.         mov     al,byte ptr es:2[bx]; get the current module number
  2005.         mov     ah,al           ; copy it
  2006.         inc     ah              ; bump
  2007.         cmp     al,'$'          ; system module?
  2008.         jnz     work2j          ; no, branch
  2009.         mov     ah,'*'          ; yes, show "in use"
  2010. work2j: cmp     ah,':'          ; did it go from 9->10?
  2011.         jnz     work2k          ; no, branch
  2012.         mov     ah,'A'          ; yes, funky hex conversion
  2013. work2k: cmp     ah,'G'          ; >16?
  2014.         jnz     work2l          ; no, branch
  2015.         mov     ah,'*'          ; yes, show "in use"
  2016. work2l: mov     byte ptr es:2[bx],ah; set new module number
  2017.         mov     byte ptr 8[di],ah; set it in the source
  2018. ;--------------------------------------------------------------
  2019. ; finish up by turning on the regular cursor, going back to work
  2020. ;
  2021.         mov     curonf,1        ; don't restore old cursor
  2022.         call    curon           ; normal cursor
  2023.         jmp     workx           ; back to the grind
  2024. ;==============================================================
  2025. ; command was "create", now another page 0 module is selected,
  2026. ; zip pending command, kill module cursor
  2027. ;
  2028. work3:  cmp     cmdflg,2        ; stray move?
  2029.         jnz     work3a          ; no, branch
  2030.         jmp     cancel          ; yes, cancel the command
  2031. work3a: mov     cmdflg,0        ; zip pending command
  2032.         mov     curonf,1        ; don't restore old cursor
  2033.         call    curon           ; drop module and exit
  2034.         jmp     workx           ; ...back to the work loop
  2035. ;==============================================================
  2036. ; Want to move an existing module.  Check that there is enough empty
  2037. ; space on the screen, and if ok, draw the module.
  2038. work4:  mov     es,vpage        ; pick up video page segment
  2039.         mov     bx,curadr       ; current cursor offset
  2040.         mov     di,modchar      ; point to module char source
  2041.         mov     cx,[di]         ; get the line count
  2042.         mov     al,0            ; clear register
  2043. work4a: test    byte ptr es:1[bx],80h ; look to see that there is space
  2044.         jnz     work4aa         ; blinking counts as 0
  2045.         or      al,es:1[bx]     ;                 /
  2046. work4aa:test    byte ptr es:-1[bx],80h;         /
  2047.         jnz     work4ab         ;             /
  2048.         or      ax,es:-1[bx]    ;           /
  2049. work4ab:test    byte ptr es:3[bx],80h;    /
  2050.         jnz     work4ac         ;       /
  2051.         or      ax,es:3[bx]     ;     /
  2052. work4ac:add     bx,160          ;   /
  2053.         loop    work4a          ; /  
  2054.         or      al,al           ; the final test
  2055.         jz      work4b          ; nothing there, branch to the move
  2056.         call    setmod          ; else continue dragging the module around
  2057.         jmp     workx           ; back to work
  2058. ;--------------------------------------------------------------
  2059. ; There is enough space, erase the old module, 
  2060. ; then display it in its new location.
  2061. ; First find old module's location page.
  2062. work4b: mov     di,tmpsav       ; get varlist of source module
  2063.         mov     es,4[di]        ; get seg of source module display
  2064.         mov     bx,6[di]        ; get offset of tag
  2065. ;--------------------------------------------------------------
  2066. ; Now erase the old module.
  2067. ;
  2068.         mov     di,[di]         ; di = modsrc(old_varlist)
  2069.         mov     di,2[di]        ; di = txtadr(modsrc(old_varlist))
  2070.         mov     cx,[di]         ; cx = line count
  2071.         call    eramod$         ; erase the old module
  2072. ;--------------------------------------------------------------
  2073. ; Show the module in its new location
  2074. ;
  2075.         mov     cmdflg,0        ; clear the command flag
  2076.         mov     di,modchar      ; point to module char source
  2077.         mov     cx,[di]         ; get module line count again
  2078.         add     di,4            ; point to 1st char
  2079.         mov     bx,curadr       ; cursor address
  2080.         dec     bx              ; shift for module
  2081.         dec     bx              ; /
  2082.         mov     es,vpage        ; get current screen seg addr
  2083.         call    shomod$         ; show the module
  2084. ;--------------------------------------------------------------
  2085. ; set new screen location in the variable list
  2086. ;
  2087.         mov     di,tmpsav       ; get varlist of source module
  2088.         mov     ax,vpage        ; get current seg
  2089.         mov     4[di],ax        ; put it in the list
  2090.         mov     ax,curadr       ; get cursor addr
  2091.         mov     6[di],ax        ; in the list
  2092. ;--------------------------------------------------------------
  2093. ; finish up by turning on the regular cursor, going back to work
  2094. ;
  2095. work4x: mov     curonf,1        ; don't restore old cursor
  2096.         call    curon           ; normal cursor
  2097.         jmp     workx           ; back to the grind
  2098. ;==============================================================
  2099. ; Have been dragging a gost around, now it's time to reincarnate.
  2100. ; Check that there is enough empty space on the screen.
  2101. ;
  2102. work5:  mov     es,vpage        ; pick up video page segment
  2103.         mov     bx,curadr       ; current cursor offset
  2104.         mov     di,modchar      ; point to module char source
  2105.         mov     cx,[di]         ; get the line count
  2106.         mov     ax,0            ; clear register
  2107. work5a: or      al,es:1[bx]     ; look to see that there is space
  2108.         or      al,es:-1[bx]    ;       /
  2109.         or      al,es:3[bx]     ;     /
  2110.         add     bx,160          ;   /
  2111.         loop    work5a          ; /  
  2112.         or      al,al           ; was there?
  2113.         jz      work5b          ; yes, branch
  2114.         call    setmod          ; no, continue dragging the module around
  2115.         jmp     workx           ; back to work
  2116. ;--------------------------------------------------------------
  2117. ; There is enough space.  Get a delete flag from MODSRC,
  2118. ; Use it as a pointer to the variable list.
  2119. ;
  2120. work5b: mov     di,tmpsav       ; get last modsrc
  2121.         mov     ax,38[di]       ; get the bit flags
  2122.         call    frombit         ; convert to a number
  2123.         push    ax              ; save a copy for later
  2124.         mov     bx,ax           ; convert to an address offset
  2125.         add     bx,bx           ; /
  2126.         mov     bx,6[bx+di]     ; bx = address of the variable table
  2127.         call    tobit           ; mask out the reincarnated bit
  2128.         xor     ax,-1           ;   /
  2129.         and     38[di],ax       ; /
  2130.         jnz     work5c          ; branch if there are more delete flags
  2131. ;--------------------------------------------------------------
  2132. ; no more delete flags, fix 'X'
  2133. ;
  2134.         push    bx              ; save variable table pointer
  2135.         mov     bx,-2           ; find out the module number
  2136. work5d: add     bx,2            ;      /
  2137.         cmp     word ptr 6[bx+di],0; /
  2138.         jnz     work5d          ; bx = module number *2
  2139.         shr     bx,1            ; /2
  2140.         mov     al,'*'          ; load
  2141.         cmp     bl,16           ; last module?
  2142.         jz      work5e          ; yes, branch using '*'
  2143.         mov     al,bl           ; no, use the module number
  2144.         tohex                   ; convert to ascii hex
  2145. work5e: mov     bx,2[di]        ; find text address
  2146.         mov     bx,2[bx]        ; bx = page0 screen offset
  2147.         mov     dx,0b800h       ; set page0 seg
  2148.         mov     es,dx           ; /
  2149.         cmp     word ptr 36[di],-1; system module?
  2150.         jnz     work5e0         ; no, branch
  2151.         mov     al,'*'          ; yes, use * instead of number 
  2152. work5e0:mov     es:4[bx],al     ; set the module number
  2153.         pop     bx              ; restore the variable table addr
  2154. ;--------------------------------------------------------------
  2155. ; restore the original module number and priority number
  2156. ;
  2157. work5c: mov     dx,2[bx]        ; get priority number
  2158.         pop     ax              ; get the module number
  2159.         tohex                   ; convert to ascii hex
  2160.         push    bx              ; save the variable table addr
  2161.         mov     bx,modchar      ; point to $dummy
  2162.         cmp     word ptr 36[di],-1; system module?
  2163.         jnz     work5c0         ; no, branch
  2164.         mov     al,'$'          ; yes, use $ instead of number 
  2165. work5c0:mov     8[bx],al        ; set the current module number
  2166.         mov     ax,dx           ; get lsb of priority number
  2167.         and     ah,1            ; do ms byte
  2168.         xor     ah,1            ;   /
  2169.         add     ah,0f8h         ;  /
  2170.         mov     10[bx],ah       ; /
  2171.         tohex                   ; convert to ascii hex
  2172.         mov     12[bx],ah       ; set the priority number
  2173.         mov     14[bx],al       ; /
  2174.         pop     bx              ; restore variable table addr
  2175. ;--------------------------------------------------------------
  2176. ; update the variable table
  2177. ;
  2178.         mov     ax,vpage        ; get current seg addr
  2179.         mov     4[bx],ax        ; put in seg slot of var table
  2180.         mov     ax,curadr       ; current cursor offset
  2181.         mov     6[bx],ax        ; put in addr slot of var table
  2182.         mov     cx,10[bx]       ; get number of variables allocated
  2183.         or      cx,cx           ; don't do it if 0 variables
  2184.         jz      work5f          ; /
  2185.         push    bx              ; save variable pointer
  2186. work5g: mov     word ptr 12[bx], offset dgroup:@zero; set variables to zero
  2187.         inc     bx              ; point to next
  2188.         inc     bx              ; /
  2189.         loop    work5g          ; loop til done
  2190.         pop     bx              ; restore variable pointer
  2191. work5f: mov     word ptr 8[bx],0; set output to 0
  2192. ;--------------------------------------------------------------
  2193. ; reactivate by inserting the module exe addr in the exe table
  2194. ;
  2195.         mov     di,[bx]         ; get modsrc addr
  2196.         mov     di,[di]         ; di = exe addr of module
  2197.         mov     bx,2[bx]        ; get priority
  2198.         add     bx,bx           ; *4
  2199.         add     bx,bx           ; /
  2200.         add     bx,offset dgroup:_exetbl;bx = addr position in exetbl
  2201.         mov     [bx],di         ; replace dummy with the real one
  2202. ;--------------------------------------------------------------
  2203. ; Show the module in its new location
  2204. ;
  2205.         mov     cmdflg,0        ; clear the command flag
  2206.         mov     di,modchar      ; point to module char source
  2207.         mov     cx,[di]         ; get module line count again
  2208.         add     di,4            ; point to 1st char
  2209.         mov     bx,curadr       ; cursor address
  2210.         dec     bx              ; shift for module
  2211.         dec     bx              ; /
  2212.         mov     es,vpage        ; get current screen seg addr
  2213.         call    shomod$         ; show the module
  2214. ;--------------------------------------------------------------
  2215. ; finish up by turning on the regular cursor, going back to work
  2216. ;
  2217. work5x: mov     curonf,1        ; don't restore old cursor
  2218.         call    curon           ; normal cursor
  2219.         jmp     workx           ; back to the grind
  2220. ;==============================================================
  2221. ; Priority swap was pending, now do it.
  2222. ;
  2223. work6:  call    curoff          ; turn cursor off
  2224.         mov     bx,tmpsav       ; get saved variable table
  2225.         mov     es,4[bx]        ; get seg of last screen
  2226.         mov     bx,6[bx]        ; get offset of last screen
  2227.         mov     byte ptr es:161[bx],grey; turn off hilight
  2228.         mov     byte ptr es:163[bx],grey; /
  2229.         ;
  2230.         mov     di,tmpsav       ; old variable table
  2231.         mov     si,varnow       ; new variable table
  2232.         mov     ax,2[di]        ; get old priority #
  2233.         mov     dx,ax           ; dx = old priority #
  2234.         xchg    ax,2[si]        ; swap with new
  2235.         mov     2[di],ax        ; /
  2236.         ;
  2237.         add     ax,ax           ; convert to exetbl addr
  2238.         add     ax,ax           ; /
  2239.         add     ax,offset dgroup:_exetbl; ax = new exetbl addr
  2240.         mov     bx,ax           ; bx = new exetbl addr
  2241.         mov     ax,[bx]         ; ax = new exe addr
  2242.         mov     cx,2[bx]        ; cx = new vartbl addr
  2243.         add     dx,dx           ; convert old # to exetbl addr
  2244.         add     dx,dx           ; /
  2245.         add     dx,offset dgroup:_exetbl; dx = old exetbl addr
  2246.         mov     bp,dx           ; bp = old exetbl addr
  2247.         xchg    ax,ds:[bp]      ; swap exe addrs
  2248.         mov     [bx],ax         ; /
  2249.         xchg    cx,ds:2[bp]     ; swap vartbl addrs
  2250.         mov     2[bx],cx        ; /     
  2251.         ;
  2252.         mov     es,4[si]        ; get screen seg of new
  2253.         mov     bx,6[si]        ; get screen addr of new
  2254.         mov     ax,2[si]        ; get priority #
  2255.         showp                   ; show priority
  2256.         mov     es,4[di]        ; get screen seg of old
  2257.         mov     bx,6[di]        ; get screen addr of old
  2258.         mov     ax,2[di]        ; get priority #
  2259.         showp                   ; show priority
  2260.         ;
  2261.         mov     cmdflg,0        ; clear the command
  2262.         mov     curonf,1        ; don't restore
  2263.         call    curon           ; normal cursor
  2264.         jmp     workx           ; back to the work loop
  2265. ;==============================================================
  2266. ; Delete Module was pending, now it's time to do it.
  2267. ;
  2268. workpa: cmp     vpage,0         ; page 0 ?
  2269.         jnz     workpa0         ; no, branch
  2270.         jmp     workpz          ; yes, exit
  2271.         ;
  2272. workpa0:test    cmdcol,80H      ; valid color
  2273.         jnz     workpz          ; no, exit
  2274.         ;
  2275.         mov     bx,5a0h         ; offset for DEL
  2276.         call    turnoff         ; turn off highlight
  2277.         call    curoff          ; turn off cursor
  2278.         ;
  2279.         mov     di,cmdptr       ; find out which module #
  2280.         mov     bx,0            ; counter offset
  2281.         mov     ax,varnow       ; get current variable list
  2282. workpb: cmp     6[di+bx],ax     ; look for a match
  2283.         jz      workpc          ; branch if found
  2284.         add     bx,2            ; else bump index
  2285.         cmp     bx,32           ; split if not found
  2286.         jz      workpx          ; /
  2287.         jmp     short workpb    ; loop
  2288.         ;                       ; bx = module # *2
  2289. workpc: mov     al,bl           ; al = module # *2
  2290.         shr     al,1            ; al = module #
  2291.         call    tobit           ; ax = bit pattern
  2292.         or      38[di],ax       ; flag module as deleted
  2293.         mov     di,varnow       ; get variable list
  2294.         mov     bx,2[di]        ; get priority
  2295.         add     bx,bx           ; *4
  2296.         add     bx,bx           ; /
  2297.         add     bx,offset dgroup:_exetbl; point to position in exetable
  2298.         mov     word ptr [bx],offset _dummy ; insert dummy
  2299.         ;                       ; set up to erase the module from screen
  2300.         mov     es,4[di]        ; get seg of module display
  2301.         mov     bx,6[di]        ; get offset of tag
  2302.         ;
  2303.         mov     word ptr 4[di],0b000H; set illegal display seg
  2304.         mov     word ptr 6[di],-1; set illegal display offset
  2305.         ;
  2306.         mov     di,[di]         ; di = modsrc(varlist)
  2307.         mov     di,2[di]        ; di = txtadr(modsrc(varlist))
  2308.         mov     cx,[di]         ; cx = line count
  2309.         call    eramod$         ; erase the old module
  2310.         ;                       ; mark source as erased
  2311.         mov     di,cmdptr       ; get source text
  2312.         mov     di,2[di]        ; di = txtadr(modsrc(cmdptr)))
  2313.         mov     bx,2[di]        ; bx = screen address of source text
  2314.         mov     ax,0b800h       ; set page0 seg
  2315.         mov     es,ax           ; /
  2316.         mov     byte ptr es:4[bx],'X' ; mark source as deleted
  2317.         ;                       ; finish up and exit
  2318. workpx: mov     curonf,1        ; don't restore under cursor
  2319.         call    curon           ; cursor back on
  2320.         mov     cmdflg,0        ; clear command flag
  2321. workpz: jmp     workx           ; exit
  2322. ;==============================================================
  2323. ; End of WORK.  If not HLT'd or module cursor, reset SI to the head
  2324. ; of the module list, and run through the modules again.
  2325. ;
  2326.         public  workx
  2327. workx:
  2328.         test    midixsf,1       ; external sync input?
  2329.         jz      workxa          ; no, branch
  2330.         mov     al,midixs       ; yes, get xtrn sync
  2331.         cmp     al,midiss       ; same as before?
  2332.         jz      workxx          ; yes, back to loop
  2333.         mov     midiss,al       ; no, reset saved count
  2334.         mov     tickis,al       ; set alpha display
  2335.         jmp     short workx2    ; go to work
  2336.         ;
  2337. workxa:
  2338.         test    asensf,-1       ; want active sensing?
  2339.         jz      workxas         ; no, branch
  2340.         test    byte ptr ticks,7fh; time for active sensing?
  2341.         jnz     workxas         ; branch if not needed yet
  2342.         mov     al,0feh         ; send MIDI active sensing
  2343.         call    allmidi         ; /
  2344. workxas:sendmb
  2345.         ;
  2346.         test    fastflg,-1      ; fast flag set
  2347.         jnz     workx4          ; yes, branch
  2348.         test    byte ptr cs:timer,255; timer zeroed out?
  2349.         jz      workx4          ; yes, branch
  2350.         test    waiting,-1      ; have been waiting?
  2351.         jnz     workxx          ; yes, do housekeeping again
  2352.         mov     waiting,1       ; no, set flag
  2353.         mov     al,byte ptr cs:timer; get current timer value
  2354.         mov     tickis,al       ; save it
  2355. workxx: sendmb                  ; send midi byte, if any
  2356.         jmp     work            ; go do housekeeping
  2357.         ;
  2358. workx4: mov     al,ticka        ; get new timer value
  2359.         mov     byte ptr cs:timer,al; put it in the timer
  2360.         test    waiting,-1      ; was waiting?
  2361.         jnz     workx2          ; yes, branch
  2362.         mov     tickis,0        ; no, zip tick readout
  2363. workx2: mov     waiting,0       ; not waiting now
  2364.         ;
  2365. workx0: cmp     mmreset,0       ; want to reset measures?
  2366.         jnz     workx5          ; no, branch
  2367.         mov     mmcount,0       ; yes, reset measure count
  2368.         mov     mmreset,0       ; clear flag on sync
  2369.         jmp     short workx6    ; set new measure
  2370.         ;
  2371. workx5: mov     mmstart,0       ; flag not end of measure
  2372.         dec     mmtick          ; kick measure timer
  2373.         jnz     workx3          ; branch if really not eom
  2374. workx6: mov     ax,mclocks      ; else reload timer
  2375.         mov     mmtick,ax       ; /
  2376.         mov     mmstart,1       ; flag start of measure
  2377.         inc     mmcount         ; bump measure count
  2378.         mov     ax,mmcount      ; else display measure count
  2379.         mov     bx,vpage        ; current video page
  2380.         mov     es,bx           ; /
  2381.         mov     bx,160*13       ; address of decimal readout
  2382.         call    toddec          ; display
  2383.         ;
  2384. workx3: ;
  2385.         test    secondf,-1      ; new seconds count?
  2386.         jz      workx9          ; no, branch
  2387.         mov     secondf,0       ; yes, clear the flag
  2388.         mov     ax,seconds      ; display seconds count
  2389.         mov     bx,vpage        ; current video page
  2390.         mov     es,bx           ; /
  2391.         mov     bx,160*14       ; address of decimal readout
  2392.         call    toddec          ; display
  2393.         ;
  2394. workx9: test    lodflg,-1       ; lodflg aready 0
  2395.         jz      workx9a         ; yes, do nothing
  2396.         dec     lodflg          ; else dec the flag
  2397.         ;
  2398. workx9a:test    clrchf,2        ; channel cleared? 
  2399.         jz      workx7          ; no, branch
  2400.         mov     clrchf,0        ; yes, clear flag
  2401.         ;
  2402. workx7: cmp     pdx,3           ; in menu area
  2403.         jnb     workx7e         ; no, branch
  2404.         cmp     pdy,17          ; in mute area
  2405.         jb      workx7e         ; no, branch
  2406. workx7e:mov     bx,vpage        ; get video page
  2407.         mov     es,bx           ; es = current video page
  2408.         mov     bx,160*17       ; point to menu area
  2409.         inc     bx              ; point to highlight byte
  2410.         mov     dx,mute         ; get mute flags
  2411.         mov     al,hi           ; hi  if not mute
  2412.         mov     ah,lo           ; lo if mute
  2413.         mov     cx,8            ; 8 * 2 mute flags
  2414. workx7l:ror     dx,1            ; pop even flag
  2415.         jc      workx7a         ; branch if mute
  2416.         or      es:[bx],al      ; set hi  if not mute
  2417.         jmp     short workx7b   ; branch
  2418. workx7a:and     es:[bx],ah      ; set lo if mute
  2419. workx7b:ror     dx,1            ; pop odd flag 
  2420.         jc      workx7c         ; branch if mute
  2421.         or      es:4[bx],al     ; set hi  if not mute
  2422.         jmp     short workx7d   ; branch
  2423. workx7c:and     es:4[bx],ah     ; set lo if mute
  2424. workx7d:add     bx,160          ; next line
  2425.         loop    workx7l         ; do 8 pairs
  2426.         ;
  2427.         test    midisf,1        ; midi sync flag on?
  2428.         jz      workx8a         ; no, branch
  2429.         mov     al,0f8h         ; yes, send one
  2430.         mov     midip,0         ; ... only to port 0
  2431.         call    tomidi          ; /
  2432.         ;
  2433. workx8a:inc     cs:loops        ; inc loop counter
  2434.         mov     si,offset dgroup:_exetbl; point to start of table
  2435.         mov     di,2[si]        ; set di pointing to variable list
  2436.         jmp     [si]            ; go for it
  2437. ;--------------------------------------------------------------
  2438. ; cleanup & exit
  2439.         public  split
  2440. split:  call    curoff          ; turn pd cursor off
  2441. split1: mov     dx,seg dgroup   ; set up ds
  2442.         mov     ds,dx           ; /
  2443.         mov     al,0            ; set vpage0
  2444.         call    page            ;
  2445.         call    cls             ; clear screen
  2446.         mov     ah,2            ; set cursor to top of screen
  2447.         mov     dx,0            ;     /
  2448.         mov     bh,dh           ;   /
  2449.         int     10H             ; /
  2450.         mov     ah,1            ; turn dos cursor on
  2451.         mov     ch,6            ;     /
  2452.         mov     cl,7            ;   /
  2453.         int     10H             ; /
  2454.         call    stopt           ; stop system timer
  2455.         call    stopm           ; stop mpu ints
  2456.         ;
  2457.         mov     dx,byemsg       ; get exit message
  2458.         or      dx,dx           ; anything there
  2459.         jz      split2          ; no, branch
  2460.         mov     ah,9            ; dos print string
  2461.         int     21h             ; dos call
  2462. split2: ;
  2463.         if      withc           ; if compiled with C
  2464.         pop     di              ; restore C regs
  2465.         pop     si              ;     /
  2466.         pop     bp              ;   /
  2467.         pop     es              ; /
  2468.         ret                     ; back to C
  2469.         else                    ; if assembley
  2470.         ;
  2471.         mov     ax,4c00h        ; then do assembly exit
  2472.         int     21h             ; split
  2473.         endif
  2474. ;==============================================================
  2475. ; routines used by WORK
  2476. ;--------------------------------------------------------------
  2477. ; Return to di the varlist for the currently selected module.
  2478. ; Assumes the current module tag address is in CMDTAG, and
  2479. ; the current page address is in VPAGE. Error if DI = 0 on return.
  2480. ;
  2481. varlst: mov     bp,offset dgroup:_exetbl ; point to start of table
  2482.         mov     dx,vpage                ; dx = current seg
  2483.         mov     cx,cmdtag               ; cx = current module addr
  2484. varlst0:mov     di,0                    ; err if 0 returned
  2485.         cmp     word ptr ds:[bp],offset work; exit when list is exausted
  2486.         jz      varlstx                 ; /
  2487.         mov     di,ds:2[bp]             ; get the variable list
  2488.         cmp     4[di],dx                ; right seg?
  2489.         jnz     varlst2                 ; /
  2490.         cmp     6[di],cx                ; right address?
  2491.         jz      varlstx                 ; yes, exit
  2492. varlst2:add     bp,4                    ; bump to next module
  2493.         jmp     short varlst0           ; loop
  2494. varlstx:ret                             ; exit with di=varlist addr
  2495. ;--------------------------------------------------------------
  2496. ; look at color at the cursor (CURADR), if it is one of the
  2497. ; command colors, set up CMDCOL, CMDCNT, CMDLOC, CMDTAG & CMDPTR,
  2498. ; otherwise clear CMDCOL and exit with no further action.  
  2499. ; Normally, this routine will be called only if pdf = 1.
  2500. ;
  2501. cmdchk  proc    near
  2502.         mov     es,vpage        ; get screen segment
  2503.         mov     bx,curadr       ; get cursor offset
  2504.         mov     dl,es:1[bx]     ; get the color
  2505.         cmp     dl,white        ; compare against command color list
  2506.         jz      cmdchk1         ; branch out if good
  2507.         cmp     dl,grey         ;                   /
  2508.         jz      cmdchk1         ;                 /
  2509.         cmp     dl,cyan         ;               /
  2510.         jz      cmdchk1         ;             /
  2511.         cmp     dl,cyan OR hi   ;               /
  2512.         jz      cmdchk1         ;             /
  2513.         cmp     dl,blue         ;           /
  2514.         jz      cmdchk1         ;         /
  2515.         cmp     dl,green        ;       /
  2516.         jz      cmdchk1         ;     /
  2517.         cmp     dl,magenta      ;   /
  2518.         jz      cmdchk1         ; /
  2519.         or      dl,80H          ; not on list, flag ng color
  2520.         mov     cmdcol,dl       ; /
  2521.         ret                     ; exit
  2522. cmdchk1:mov     cmdcol,dl       ; is good, set the color
  2523.         cmp     dl,es:-1[bx]    ; look left
  2524.         jnz     cmdchk2         ; branch if not same color
  2525.         dec     bx              ; else bump address left
  2526.         dec     bx              ; /
  2527. cmdchk2:mov     cmdloc,bx       ; save the location
  2528.         mov     cmdcnt,0        ; default count is 0
  2529.         cmp     dl,blue         ; check for blue or green
  2530.         jz      cmdchk3         ;     /
  2531.         cmp     dl,green        ;   /
  2532.         jz      cmdchk3         ; /
  2533.         cmp     dl,magenta      ; check for magenta
  2534.         jnz     cmdchk3         ; no, go on
  2535.         cmp     curadr,0f9ch    ; test for lower left
  2536.         jnb     cmdchk4         ; /
  2537.         cmp     byte ptr es:5[bx],white ; left of top label?
  2538.         jnz     cmdchk4         ; no, branch
  2539.         add     bx,2            ; yes, bump to label
  2540.         jmp     short cmdchk4   ; branch around count
  2541.         ;
  2542. cmdchk3:mov     dh,-1           ; blue or green needs count
  2543. cmdchk5:inc     dh              ; dh = count
  2544.         sub     bx,160          ; up one line
  2545.         cmp     byte ptr es:1[bx],blue; look for blue or green
  2546.         jz      cmdchk5         ;         /                        
  2547.         cmp     byte ptr es:1[bx],green;/                      
  2548.         jz      cmdchk5         ; look until color not blue or green
  2549.         cmp     byte ptr es:1[bx],magenta
  2550.         jz      cmdchk5         ; look until color not magenta
  2551.         mov     cmdcnt,dh       ; set the count
  2552.         mov     bx,cmdloc       ; restore bx
  2553. cmdchk4:cmp     byte ptr es:1[bx],white; look for white
  2554.         jz      cmdchk6         ; exit loop when found
  2555.         sub     bx,160          ; back one line
  2556.         jmp     short cmdchk4   ; /
  2557. cmdchk6:mov     cmdtag,bx       ; save the tag address
  2558.         mov     al,byte ptr es:[bx] ; get the character
  2559.         mov     ah,0            ; make it into an address
  2560.         add     ax,ax           ; /
  2561.         mov     di,offset dgroup:_chrtbl; find the ptr for that char
  2562.         add     di,ax           ;     /
  2563.         mov     ax,[di]         ;   /
  2564.         mov     cmdptr,ax       ; /
  2565.         ret                     ; exit
  2566. cmdchk  endp
  2567.  
  2568. ;--------------------------------------------------------------
  2569. ; use module text for cursor
  2570. ;
  2571. setmod  proc    near
  2572.         call    curoff          ; turn off regular cursor
  2573.         mov     di,modchar      ; get line size
  2574.         mov     ax,[di]         ; /
  2575.         add     ax,ax           ; convert to pixel addr
  2576.         add     ax,ax           ;   /
  2577.         add     ax,ax           ; /
  2578.         mov     dx,200          ; subtract from max
  2579.         sub     dx,ax           ; dx = maximum pdy for this char
  2580.         mov     cx,0            ; 0  = minimum pdy
  2581.         mov     ax,8            ; set min, max allowable pdy values
  2582.         int     33h             ; /
  2583.         mov     ax,7            ; set min, max allowable pdx values
  2584.         mov     dx,631          ; maximum x
  2585.         mov     cx,8            ; minimum x
  2586.         int     33h             ; set it
  2587.         ;
  2588.         mov     execur,offset modcur; do show-modules
  2589.         mov     curflg,1        ; flag special cursor
  2590.         call    curon           ; continue
  2591.         ret
  2592. setmod  endp
  2593. ;--------------------------------------------------------------
  2594. ; use module text for cursor
  2595. ;
  2596. setcur  proc    near
  2597.         call    curoff          ; stop pd interupts
  2598.         mov     dx,199          ; maximum y
  2599.         mov     cx,0            ; minimum y
  2600.         mov     ax,8            ; set min, max allowable pdy values
  2601.         int     33h             ; /
  2602.         mov     ax,7            ; set min, max allowable pdx values
  2603.         mov     dx,639          ; maximum x
  2604.         mov     cx,0            ; minimum x
  2605.         int     33h             ; set it
  2606.         ;
  2607.         mov     execur,0        ; no special cursors
  2608.         mov     curflg,0        ; /
  2609.         call    curon           ; continue
  2610.         ret
  2611. setcur  endp
  2612. ;--------------------------------------------------------------
  2613. ; Turn on menu command highlight.
  2614. ; call with cursor on, bx = menu text offset
  2615. ;
  2616.         public  turnon
  2617. turnon: push    bx              ; save text addr
  2618.         call    curoff          ; zip cursor
  2619.         pop     bx              ; get text addr
  2620.         mov     dx,0b800h       ; do all 8 pages
  2621.         mov     cx,8            ; /
  2622. turnon1:mov     es,dx           ; set the page seg
  2623.         or      byte ptr es:1[bx],8 ; make bright
  2624.         or      byte ptr es:3[bx],8 ;   /
  2625.         or      byte ptr es:5[bx],8 ; /
  2626.         inc     dh              ; next page
  2627.         loop    turnon1         ; loop til done 
  2628.         mov     curonf,1        ; don't restore 
  2629.         jmp     curon           ; cursor normal
  2630. ;--------------------------------------------------------------
  2631. ; Turn off menu command highlight.
  2632. ; call with cursor on, bx = menu text offset
  2633. ;
  2634.         public  turnoff
  2635. turnoff:push    bx              ; save text addr
  2636.         call    curoff          ; zip cursor
  2637.         pop     bx              ; get text addr
  2638.         mov     dx,0b800h       ; do all 8 pages
  2639.         mov     cx,8            ; /
  2640. turnoff1:mov    es,dx           ; set the page seg
  2641.         and     byte ptr es:1[bx],0f7h ; make dark  
  2642.         and     byte ptr es:3[bx],0f7h ;   /
  2643.         and     byte ptr es:5[bx],0f7h ; /
  2644.         inc     dh              ; next page
  2645.         loop    turnoff1        ; loop til done 
  2646.         mov     curonf,1        ; don't restore 
  2647.         jmp     curon           ; keep it right
  2648. ;--------------------------------------------------------------
  2649. ; convert binary in al to decimal in in screen location es:bx
  2650. ; all registers preserved
  2651. ;
  2652.         public  todec
  2653. todec:  push    dx              ; save registers
  2654.         mov     dl,al           ;       /
  2655.         push    ax              ;     /
  2656.         push    bx              ;   /
  2657.         push    cx              ; /
  2658.         add     bx,4            ; start at ls digit
  2659.         mov     cx,3            ; initialize counter
  2660. todec1: cmp     dl,0            ; if 0, do shortcut
  2661.         jnz     todec0          ; /
  2662.         mov     al,30H          ; ascii bias if 0
  2663.         jmp     short todec2    ; /
  2664. todec0: push    cx              ; save outer loop
  2665.         mov     al,dl           ; ax = numerator
  2666.         mov     ah,0            ; /
  2667.         mov     cl,10           ; divisor of 10
  2668.         div     cl              ; divide
  2669.         mov     dl,al           ; get quotient
  2670.         mov     al,ah           ; get remainder
  2671.         add     al,30h          ; add ASCII bias
  2672.         pop     cx              ; get loop counter
  2673. todec2: mov     es:[bx],al      ; put to the screen
  2674.         dec     bx              ; bump count address
  2675.         dec     bx              ; /
  2676.         loop    todec1          ; do 3 digits
  2677.         mov     al,valflg       ; mouse input?
  2678.         or      al,usrflg       ; /
  2679.         jz      todec3          ; no, branch
  2680.         mov     al,colr         ; yes, set color
  2681.         mov     es:3[bx],al     ;   /
  2682.         mov     es:5[bx],al     ;  /
  2683.         mov     es:7[bx],al     ; /
  2684. todec3: pop     cx              ; restore registers
  2685.         pop     bx              ;     /
  2686.         pop     ax              ;   /
  2687.         pop     dx              ; /
  2688.         ret                     ; exit
  2689. ;--------------------------------------------------------------
  2690. ; convert binary in ax to decimal in in screen location es:bx
  2691. ; all registers preserved
  2692. ;
  2693.         public  toddec
  2694. toddec: push    dx              ; save registers
  2695.         mov     dx,ax           ;    /
  2696.         push    ax              ;   /
  2697.         push    bx              ;  /
  2698.         push    cx              ; /
  2699.         add     bx,4            ; start at ls digit
  2700.         mov     cx,3            ; initialize counter
  2701. toddec1:mov     ax,dx           ; ax = numerator
  2702.         mov     dx,0            ; clear upper half
  2703.         cmp     ax,0            ; if 0, do shortcut
  2704.         jnz     toddec0         ; /
  2705.         mov     al,30H          ; ascii bias if 0
  2706.         jmp     short toddec2   ; /
  2707. toddec0:push    cx              ; save outer loop
  2708.         mov     cx,10           ; divisor of 10
  2709.         div     cx              ; divide
  2710.         xchg    ax,dx           ; get quotent
  2711.         add     al,30h          ; add ASCII bias
  2712.         pop     cx              ; get loop counter
  2713. toddec2:mov     es:[bx],al      ; put to the screen
  2714.         mov     byte ptr es:1[bx],grey
  2715.         dec     bx              ; bump count address
  2716.         dec     bx              ; /
  2717.         loop    toddec1         ; do 3 digits
  2718.         pop     cx              ; restore registers
  2719.         pop     bx              ;   /
  2720.         pop     ax              ;  /
  2721.         pop     dx              ; /
  2722.         ret                     ; exit
  2723. ;--------------------------------------------------------------
  2724. ; convert binary in al to CM scale in screen location es:bx
  2725. ; all registers preserved
  2726. ;
  2727.         public  tonote
  2728. tonote: push    di              ; save registers
  2729.         push    ax              ;   /
  2730.         push    cx              ; /
  2731.         and     al,127          ; 0-127 allowed
  2732.         mov     ah,0            ; ax = midi key value
  2733.         mov     cl,12           ; 12 notes per octave
  2734.         div     cl              ; al = octave, ah = scale
  2735.         mov     cl,ah           ; save remainder in cl
  2736.         tohex                   ; convert octave to ascii
  2737.         mov     es:4[bx],al     ; put to the screen
  2738.         mov     ch,0            ; get address of note char
  2739.         add     cx,cx           ; /
  2740.         add     cx,offset dgroup:cscale
  2741.         mov     di,cx           ; di = address of note char
  2742.         mov     ax,[di]         ; get the chars
  2743.         mov     es:2[bx],al     ; send to the screen
  2744.         mov     es:[bx],ah      ; /
  2745.         mov     al,valflg       ; mouse input?
  2746.         or      al,usrflg       ; /
  2747.         jz      tonot0          ; no, branch
  2748.         mov     al,colr         ; yes, set color
  2749.         mov     es:1[bx],al     ;   /
  2750.         mov     es:3[bx],al     ;  /
  2751.         mov     es:5[bx],al     ; /
  2752. tonot0: pop     cx              ; restore registers
  2753.         pop     ax              ;   /
  2754.         pop     di              ; /
  2755.         ret                     ; exit
  2756. ;--------------------------------------------------------------
  2757. ; convert binary in al to hex in ax
  2758. ; no regs but ax used
  2759. ;
  2760. tohexx: rol     al,1
  2761.         rol     al,1
  2762.         rol     al,1
  2763.         rol     al,1
  2764.         mov     ah,al
  2765.         and     al,0FH
  2766.         daa
  2767.         add     al,0F0H
  2768.         adc     al,040H
  2769.         ;
  2770.         xchg    al,ah
  2771.         rol     al,1
  2772.         rol     al,1
  2773.         rol     al,1
  2774.         rol     al,1
  2775.         and     al,00FH
  2776.         daa
  2777.         add     al,0F0H
  2778.         adc     al,040H
  2779.         ret
  2780. ;--------------------------------------------------------------
  2781. ; convert hex in al to binary in al
  2782. ; only al is used
  2783. ;
  2784. fromhex:sub     al,30H          ; for 0-9
  2785.         cmp     al,9            ; if 0-9
  2786.         jle     fromhxx         ; ... go
  2787.         and     al,5fh          ; for lower case
  2788.         sub     al,7            ; adjust for A-F
  2789. fromhxx:ret
  2790. ;--------------------------------------------------------------
  2791. ; convert bit set in ax to nybble in al
  2792. ; first bit seen is taken
  2793. ;
  2794. frombit:mov     cl,0
  2795.         stc
  2796. frombi1:inc     cl
  2797.         rcr     ax,1
  2798.         jnc     frombi1
  2799.         dec     cl
  2800.         mov     al,cl
  2801.         and     ax,15
  2802.         ret
  2803. ;--------------------------------------------------------------
  2804. ; convert nybble in al to bit set in ax
  2805. ;
  2806. tobit:  mov     cl,al           ; for shift
  2807.         mov     ax,1
  2808.         shl     ax,cl
  2809.         ret
  2810. ;--------------------------------------------------------------
  2811. ; convert al to upper case
  2812. ;
  2813. touc:   cmp     al,'a'          ; below lower case chars
  2814.         jb      toucx           ; yes, branch
  2815.         cmp     al,'z'          ; above lower case chars
  2816.         ja      toucx           ; yes, branch
  2817.         and     al,5fh          ; mask out bit 5
  2818. toucx:  ret
  2819. ;--------------------------------------------------------------
  2820. ; Temp HLT set   
  2821. ; Set clrchf to send out channel module settings
  2822. ; reset to 1st note in measure
  2823. ;
  2824. tmphlt: or      mprstf,4        ; turn tmp hlt on
  2825.         ret
  2826. ;--------------------------------------------------------------
  2827. ; Temp HLT clear
  2828. ; Set HLT highlight according to HLT flag
  2829. ; Set clrchf to send out channel module settings
  2830. ; reset to 1st note in measure
  2831. ;
  2832. fixhlt:
  2833.         mov     bx,6E0H         ; text offset
  2834.         test    mprstf,2        ; was previously halted?
  2835.         jnz     fixhlt1         ; yes, turn on highlight
  2836.         call    turnoff         ; turn off highlight
  2837.         jmp     clrhlt          ; finish up
  2838. fixhlt1:
  2839.         call    turnon          ; turn on highlight
  2840.         ;
  2841. clrhlt: and     mprstf,0FBH     ; turn tmp hlt off
  2842.         mov     clrchf,1        ; set for chanl module
  2843.         mov     mmtick,1        ; reset to 1st note in measure
  2844.         ret
  2845. ;--------------------------------------------------------------
  2846. ; find module text address on screen 0, and insert them into the
  2847. ; module source table (_modtxt).  Called once only, on startup.
  2848. ;
  2849. modloc: mov     ax,0b800H       ; set page 0 seg
  2850.         mov     es,ax           ; /
  2851.         mov     di,0            ; start at offset 0
  2852. modlo1: inc     di              ; point to next screen location
  2853.         inc     di              ; /
  2854.         cmp     di,4090         ; do all of screen 0
  2855.         jnz     modlo2          ; branch if not done
  2856.         ret                     ; else exit loop
  2857.         ;
  2858. modlo2: mov     bx,es:[di]      ; get it
  2859.         cmp     bh,white        ; look for label color
  2860.         jnz     modlo1          ; not interested if not label color
  2861.         cmp     bl,'0'          ; not interested if label number
  2862.         jz      modlo1          ; /
  2863.         cmp     bl,'$'          ; not interested if system module
  2864.         jz      modlo1          ; /
  2865.         ;
  2866.         mov     bh,0            ; bx = label char (0-255)
  2867.         add     bx,bx           ; bx = _chrtbl offset
  2868.         add     bx,offset dgroup:_chrtbl; add the _chrtbl base address
  2869.         mov     bx,[bx]         ; bx = _modsrc address for the label
  2870.         mov     bx,2[bx]        ; bx = _modtxt address for the label
  2871.         mov     ax,di           ; ax = screen address of the label
  2872.         dec     ax              ; drop back two for module address
  2873.         dec     ax              ; ax = module address
  2874.         mov     2[bx],ax        ; insert module address into table
  2875.         jmp     short modlo1    ; loop
  2876. ;==============================================================
  2877. ; DOS & BIOS Utilities
  2878. ;--------------------------------------------------------------
  2879. ; print string
  2880. ; call with DX = string addr, terminated with $
  2881. ;
  2882. print$: push    ds
  2883.         mov     ax,cs
  2884.         mov     ds,ax
  2885.         mov     ah,9
  2886.         int     21H
  2887.         pop     ds
  2888.         ret
  2889. ;--------------------------------------------------------------
  2890. ; clear current display screen
  2891. ; cls0 can be called with bh=atrribute
  2892. ;
  2893. cls:    mov     bh,7            ; normal blank
  2894.         jmp     short cls0      ; /
  2895. clx:    mov     bh,0            ; blank w 0's
  2896. cls0:   mov     al,0            ; blank entire page
  2897.         mov     ah,7            ; scroll down bios call
  2898.         mov     cx,0            ; start at 0,0
  2899.         mov     dx,184fH        ; 24, 79
  2900.         int     10H             ; do bios thing
  2901.         ret                     ; exit
  2902. ;--------------------------------------------------------------
  2903. ; set video page
  2904. ; call with al = video page to be set
  2905. ; cursor must be off!
  2906. ;
  2907. page:   and     ax,_numpg       ; 0-7 for EGA, 0-3 for CGA
  2908.         push    ax              ; save it
  2909.         mov     al,vpagep       ; get previous page
  2910.         mov     ah,160          ; convert to a screen address
  2911.         mul     ah              ;   /
  2912.         mov     bx,ax           ; /
  2913.         mov     es,vpage        ; get seg of current page
  2914.         and     byte ptr es:1[bx],0F7H; return to low yellow
  2915.         and     byte ptr es:3[bx],0F7H; /
  2916.         mov     al,vpagen       ; get current page
  2917.         mov     vpagep,al       ; remember it
  2918.         pop     ax              ; get new page
  2919.         mov     vpagen,al       ; store it
  2920.         push    ax              ; save page number
  2921.         mov     ah,5            ; bios call to change vpage
  2922.         int     10H             ; /
  2923.         pop     ax              ; get page back
  2924.         mov     bx,0b800H       ; base page address
  2925.         add     bh,al           ; set new base page seg
  2926.         mov     vpage,bx        ; /
  2927.         mov     al,vpagep       ; get previous page number
  2928.         mov     ah,160          ; convert to a screen address
  2929.         mul     ah              ;   /
  2930.         mov     bx,ax           ; /
  2931.         mov     es,vpage        ; get seg of current page
  2932.         or      byte ptr es:1[bx],8; highlight
  2933.         or      byte ptr es:3[bx],8; /
  2934.         ret                     ; exit
  2935. ;--------------------------------------------------------------
  2936. ; copy menus in all pages
  2937. ;
  2938. menus:  mov     dx,0b800H       ; address of page0
  2939.         mov     di,offset dgroup:$menu ; point to the menu text
  2940.         mov     bp,[di]         ; get number of lines
  2941.         add     di,4            ; point to start of text
  2942.         mov     cx,_numpg       ; 8/4 pages to do
  2943.         inc     cx              ; /
  2944. menus1: push    cx              ; save outer count
  2945.         push    di              ; save orig index
  2946.         mov     cx,bp           ; get count of lines
  2947.         mov     es,dx           ; set target seg
  2948.         mov     bx,0            ; screen offset is 0
  2949. menus2: mov     ax,[di]         ; get character
  2950.         mov     es:[bx],ax      ; put it to the screen
  2951.         mov     ax,2[di]        ; get 2nd of three
  2952.         mov     es:2[bx],ax     ; put it away
  2953.         mov     ax,4[di]        ; get third
  2954.         mov     es:4[bx],ax     ; put it away
  2955.         add     di,6            ; bump indexes
  2956.         add     bx,160          ; next line for video
  2957.         loop    menus2          ; do all text lines
  2958.         mov     al,dh           ; get page #
  2959.         and     al,byte ptr _numpg; 0-7
  2960.         mov     ah,160          ; convert to line number
  2961.         mul     ah              ; /
  2962.         mov     bx,ax           ; now it's an address
  2963.         or      byte ptr es:5[bx],8; make it brite
  2964.         pop     di              ; get orig index back
  2965.         add     dh,1            ; bump to next page
  2966.         pop     cx              ; get page count
  2967.         loop    menus1          ; do all pages
  2968.         ret                     ; exit
  2969. ;--------------------------------------------------------------
  2970. ; display modules names
  2971. ;
  2972. shoall: test    usesf,1         ; want to use screen file?
  2973.         jz      shoall0         ; no, then use internal data
  2974.         ;
  2975.         mov     ah,3dh          ; dos open file command
  2976.         mov     al,0            ; read only
  2977.         mov     dx,offset dgroup:_scrfn; point to file name
  2978.         int     21H             ; open the file
  2979.         jc      shoall0         ; internal data if no file
  2980.         ;
  2981.         push    ax              ; save file handle
  2982.         mov     bx,ax           ; set up file handle
  2983.         mov     ah,3fh          ; dos read file command
  2984.         push    ds              ; save data seg
  2985.         mov     dx,vpage        ; set page seg
  2986.         mov     ds,dx           ; /
  2987.         mov     dx,0            ; page offset is 0
  2988.         mov     cx,4096         ; screen is 4K bytes
  2989.         int     21h             ; read the file
  2990.         pop     ds              ; restore data seg
  2991.         jc      errexit         ; bomb if error
  2992.         ;
  2993.         pop     bx              ; get file handle
  2994.         mov     ah,3eh          ; dos close file
  2995.         int     21h             ; close the file
  2996.         ret                     ; exit
  2997.         ;
  2998. errexit:pop     ax              ; discard return address        
  2999.         jmp     split1          ; exit
  3000.         ;
  3001. shoall0:cld                     ; direction forward
  3002.         mov     ax,0b800h       ; set up for block copy
  3003.         mov     es,ax           ;   /
  3004.         mov     si,offset dgroup:modscr
  3005.         mov     di,0            ; /
  3006.         mov     cx,2048         ;/
  3007.         rep     movsw           ; move from vartbl to screen
  3008.         ret                     ; exit
  3009. ;==============================================================
  3010. ; save modules
  3011. ;
  3012. savmod: test    _tmpfn,-1       ; want to do it?
  3013.         jnz     savmodt         ; yes, branch
  3014.         ret                     ; no, just return
  3015. savmodt:mov     dx,offset dgroup:_tmpfn; point to file name
  3016.         call    savmods         ; save the stuff
  3017.         test    errflg,-1       ; was there an error
  3018.         jz      savmodu         ; no, go on
  3019.         mov     ax,offset dgroup:_noundo; yes, give parting shot
  3020.         mov     byemsg,ax       ; /
  3021.         jmp     split           ; exit
  3022. savmodu:ret
  3023. ;--------------------------------------------------------------
  3024. ; save modules & sequencers
  3025. ; call with dx pointing to filename
  3026. ;
  3027. savmods:mov     ah,3ch          ; dos create file command
  3028.         mov     cx,0            ; regular file
  3029.         int     21H             ; create the file
  3030.         call    erropw          ; check for disk error
  3031.         ;
  3032.         push    ax              ; save file handle
  3033.         mov     bx,ax           ; set up file handle
  3034.         mov     ah,40h          ; dos write file command
  3035.         mov     dx,offset dgroup:_header; point to header
  3036.         mov     cx,128          ; 128 byte header
  3037.         int     21h             ; save it
  3038.         mov     cx,128          ; 128 byte header
  3039.         call    errwrt          ; check for disk error
  3040.         ;
  3041.         pop     bx              ; get handle
  3042.         push    bx              ; save it again
  3043.         mov     ah,40h          ; dos write file command
  3044.         push    ds              ; save data seg
  3045.         mov     dx,seg bufsp    ; set small seq seg
  3046.         mov     ds,dx           ; /
  3047.         mov     dx,0            ; page offset is 0
  3048.         mov     cx,4096         ; 16 seq's of 256 bytes each
  3049.         int     21h             ; save them
  3050.         pop     ds              ; restore data seg
  3051.         mov     cx,4096         ; 16 seq's of 256 bytes each
  3052.         call    errwrt          ; check for disk error
  3053.         ;
  3054.         pop     bx              ; get handle
  3055.         push    bx              ; save it again
  3056.         mov     ah,40h          ; dos write file command
  3057.         push    ds              ; save data seg
  3058.         mov     dx,seg buffs    ; set large seq seg
  3059.         mov     ds,dx           ; /
  3060.         mov     dx,0            ; page offset is 0
  3061.         mov     cx,8000H        ; save half at a time
  3062.         int     21h             ; save first half
  3063.         pop     ds              ; restore data seg
  3064.         mov     cx,8000H        ; save half at a time
  3065.         call    errwrt          ; check for disk error
  3066.         pop     bx              ; get handle
  3067.         push    bx              ; save it again
  3068.         mov     ah,40h          ; dos write file command
  3069.         push    ds              ; save data seg
  3070.         mov     dx,seg buffs    ; set large seq seg
  3071.         mov     ds,dx           ; /
  3072.         mov     dx,8000h        ; page offset for 2nd half
  3073.         mov     cx,8000H        ; save half at a time
  3074.         int     21h             ; save second half
  3075.         pop     ds              ; restore data seg
  3076.         mov     cx,8000H        ; save half at a time
  3077.         call    errwrt          ; check for disk error
  3078.         ;
  3079.         pop     bx              ; get handle
  3080.         push    bx              ; save it again
  3081.         mov     ah,40h          ; dos write file command
  3082.         push    ds              ; save data seg
  3083.         mov     dx,seg bufpa    ; set large seq seg
  3084.         mov     ds,dx           ; /
  3085.         mov     dx,0            ; page offset is 0
  3086.         mov     cx,8000h        ; save half at a time
  3087.         int     21h             ; save first half
  3088.         pop     ds              ; restore data seg
  3089.         mov     cx,8000h        ; save half at a time
  3090.         call    errwrt          ; check for disk error
  3091.         pop     bx              ; get handle
  3092.         push    bx              ; save it again
  3093.         mov     ah,40h          ; dos write file command
  3094.         push    ds              ; save data seg
  3095.         mov     dx,seg bufpa    ; set large seq seg
  3096.         mov     ds,dx           ; /
  3097.         mov     dx,8000h        ; page offset for 2nd half
  3098.         mov     cx,8000h        ; save half at a time
  3099.         int     21h             ; save second half
  3100.         pop     ds              ; restore data seg
  3101.         mov     cx,8000h        ; save half at a time
  3102.         call    errwrt          ; check for disk error
  3103.         ;
  3104.         pop     bx              ; get handle
  3105.         push    bx              ; save it again
  3106.         mov     ah,40h          ; dos write file command
  3107.         push    ds              ; save data seg
  3108.         mov     dx,0bc00h       ; set page 4 seg
  3109.         mov     ds,dx           ; /
  3110.         mov     dx,0            ; page offset is 0
  3111.         mov     cx,4000H        ; 4 screens of 4K bytes
  3112.         int     21h             ; save the video screens
  3113.         pop     ds              ; restore data seg
  3114.         mov     cx,4000H        ; 4 screens of 4K bytes
  3115.         call    errwrt          ; check for disk error
  3116.         ;
  3117.         pop     bx              ; get handle
  3118.         push    bx              ; save it again
  3119.         mov     ah,40h          ; dos write file command
  3120.         push    ds              ; save data seg
  3121.         mov     dx,0b800h       ; set page 0 seg
  3122.         mov     ds,dx           ; /
  3123.         mov     dx,0            ; page offset is 0
  3124.         mov     cx,4000H        ; 4 screens of 4K bytes
  3125.         int     21h             ; save the video screens
  3126.         pop     ds              ; restore data seg
  3127.         mov     cx,4000H        ; 4 screens of 4K bytes
  3128.         call    errwrt          ; check for disk error
  3129.         ;
  3130.         pop     bx              ; get handle
  3131.         push    bx              ; save it again
  3132.         mov     ah,40h          ; dos write file command
  3133.         mov     dx,offset dgroup:valsav; point to values
  3134.         mov     cx,valend-valsav; cx = bytes to save
  3135.         int     21h             ; save the values
  3136.         mov     cx,valend-valsav; cx = bytes to save
  3137.         call    errwrt          ; check for disk error
  3138.         ;
  3139.         pop     bx              ; get handle
  3140.         push    bx              ; save it again
  3141.         mov     ah,40h          ; dos write file command
  3142.         mov     dx,offset dgroup:mvlsav; point to values
  3143.         mov     cx,mvlnum       ; cx = bytes to save
  3144.         int     21h             ; save the values
  3145.         mov     cx,mvlnum       ; cx = bytes to save
  3146.         call    errwrt          ; check for disk error
  3147.         ;
  3148.         pop     bx              ; get handle
  3149.         push    bx              ; save it again
  3150.         mov     ah,40h          ; dos write file command
  3151.         mov     dx,offset dgroup:_modsrc; point to module source table
  3152.         mov     cx,offset dgroup:_chrtbl; calc number of bytes
  3153.         sub     cx,dx           ; cx = bytes in modsrc table
  3154.         push    cx
  3155.         int     21h             ; save the modsrc table
  3156.         pop     cx
  3157.         call    errwrt          ; check for disk error
  3158.         ;
  3159.         pop     bx              ; get handle
  3160.         push    bx              ; save it again
  3161.         mov     ah,40h          ; dos write file command
  3162.         mov     dx,offset dgroup:_exetbl; module exec table
  3163.         mov     cx,2048         ; 512 modules @ 4 bytes each
  3164.         int     21h             ; save the table
  3165.         mov     cx,2048         ; 512 modules @ 4 bytes each
  3166.         call    errwrt          ; check for disk error
  3167.         ;
  3168.         pop     bx              ; get handle
  3169.         push    bx              ; save it again
  3170.         mov     ah,40h          ; dos write file command
  3171.         mov     dx,offset dgroup:vartbl; variable table
  3172.         mov     cx,varsiz       ; var table
  3173.         int     21h             ; save the table
  3174.         mov     cx,varsiz       ; var table
  3175.         call    errwrt          ; check for disk error
  3176.         ;
  3177.         pop     bx              ; get handle
  3178.         push    bx              ; save it again
  3179.         mov     ah,40h          ; dos write file command
  3180.         mov     dx,offset dgroup:_modtxt; module text
  3181.         mov     cx,offset dgroup:?modtxt; end of module text
  3182.         sub     cx,dx           ; cx = bytes in module text
  3183.         push    cx
  3184.         int     21h             ; save the table
  3185.         pop     cx
  3186.         call    errwrt          ; check for disk error
  3187.         ;
  3188.         pop     bx              ; get file handle
  3189.         mov     ah,3eh          ; dos close file
  3190.         int     21h             ; close the file
  3191.         call    errclw          ; check for disk error
  3192.         ret                     ; exit
  3193. ;--------------------------------------------------------------
  3194. ; load modules from _tmpfn
  3195. ;
  3196. lodmod: test    _tmpfn,-1       ; want to do it?
  3197.         jz      lodmodq         ; no, just return
  3198.         mov     ah,3dh          ; dos open file command
  3199.         mov     al,0            ; read only
  3200.         mov     dx,offset dgroup:_tmpfn; point to file name
  3201.         int     21H             ; open the file
  3202.         call    errundo         ; check for undo error
  3203.         mov     dl,_mpab        ; get current mpab status
  3204.         push    dx              ; save on stack
  3205.         or      _mpab,15        ; force all
  3206.         call    lodmod0         ; do the rest
  3207.         pop     dx              ; get mpab status
  3208.         mov     _mpab,dl        ; restore
  3209. lodmodq:ret                     ; exit
  3210. ;--------------------------------------------------------------
  3211. ; load modules with filename already setup (as lodmod, above)
  3212. ;
  3213. lodmod0:
  3214.         push    ax              ; save file handle
  3215.         mov     bx,ax           ; set up file handle
  3216.         mov     ah,3fh          ; dos read file command
  3217.         mov     dx,offset dgroup:_header; point to header
  3218.         mov     cx,128          ; 128 byte header
  3219.         int     21h             ; load it
  3220.         call    erropr          ; check for disk error
  3221.         ;
  3222.         cmp     _header,version; right version?
  3223.         jnz     lodmodz         ; no, exit
  3224.         cmp     _header+1,release; right release
  3225.         jz      lodmod1         ; yes, go on
  3226. lodmodz:test    _mpab,1         ; want to load MODS
  3227.         jz      lodmod1         ; no, then it's ok
  3228.         and     _mpab,0feh      ; zip the MOD bit
  3229.         call    dompab          ; show new mpab
  3230.         mov     dx,offset dgroup:_errver; else give message
  3231.         call    errmsg          ; /
  3232.         ;
  3233. lodmod1:test    _mpab,8         ; want to do this?
  3234.         jz      lodmod2         ; no, branch
  3235.         ;
  3236.         pop     bx              ; get handle
  3237.         push    bx              ; save it again
  3238.         mov     ah,3fh          ; dos read file command
  3239.         push    ds              ; save data seg
  3240.         mov     dx,seg bufsp    ; set small seq seg
  3241.         mov     ds,dx           ; /
  3242.         mov     dx,0            ; page offset is 0
  3243.         mov     cx,4096         ; 16 seq's of 256 bytes each
  3244.         push    cx              ; save number of read bytes
  3245.         int     21h             ; load them
  3246.         pop     cx              ; get number of read bytes
  3247.         pop     ds              ; restore data seg
  3248.         call    errqrd          ; check for disk error
  3249.         ;
  3250. lodmod2:test    _mpab,4         ; want to do this?
  3251.         jz      lodmod3         ; no, branch
  3252.         pop     bx              ; yes, set file pointer
  3253.         push    bx              ; handle
  3254.         mov     cx,0            ; ms word of pointer
  3255.         mov     dx,4096+128     ; ls word of pointer
  3256.         mov     al,0            ; offset from start of file
  3257.         mov     ah,42H          ; Move File Pointer
  3258.         int     21H             ; dos call
  3259.         ;
  3260.         pop     bx              ; get handle
  3261.         push    bx              ; save it again
  3262.         mov     ah,3fh          ; dos read file command
  3263.         push    ds              ; save data seg
  3264.         mov     dx,seg buffs    ; set large seq seg
  3265.         mov     ds,dx           ; /
  3266.         mov     dx,0            ; page offset is 0
  3267.         mov     cx,8000H        ; load half at a time
  3268.         push    cx              ; save read bytes
  3269.         int     21h             ; load first half
  3270.         pop     cx              ; restore read bytes
  3271.         pop     ds              ; restore data seg
  3272.         call    errqrd          ; check for disk error
  3273.         pop     bx              ; get handle
  3274.         push    bx              ; save it again
  3275.         mov     ah,3fh          ; dos read file command
  3276.         push    ds              ; save data seg
  3277.         mov     dx,seg buffs    ; set large seq seg
  3278.         mov     ds,dx           ; /
  3279.         mov     dx,8000h        ; page offset for 2nd half
  3280.         mov     cx,8000H        ; load half at a time
  3281.         push    cx              ; save read bytes
  3282.         int     21h             ; load first half
  3283.         pop     cx              ; restore read bytes
  3284.         pop     ds              ; restore data seg
  3285.         call    errqrd          ; check for disk error
  3286.         ;
  3287. lodmod3:test    _mpab,2         ; want to do this?
  3288.         jz      lodmod4         ; no, branch
  3289.         pop     bx              ; yes, set file pointer
  3290.         push    bx              ; handle
  3291.         mov     cx,1            ; ms word of pointer
  3292.         mov     dx,4096+128     ; ls word of pointer
  3293.         mov     al,0            ; offset from start of file
  3294.         mov     ah,42H          ; Move File Pointer
  3295.         int     21H             ; dos call
  3296.         ;
  3297.         pop     bx              ; get handle
  3298.         push    bx              ; save it again
  3299.         mov     ah,3fh          ; dos read file command
  3300.         push    ds              ; save data seg
  3301.         mov     dx,seg bufpa    ; set large seq seg
  3302.         mov     ds,dx           ; /
  3303.         mov     dx,0            ; page offset is 0
  3304.         mov     cx,8000h        ; load half at a time
  3305.         push    cx              ; save read bytes
  3306.         int     21h             ; load first half
  3307.         pop     cx              ; restore read bytes
  3308.         pop     ds              ; restore data seg
  3309.         call    errqrd          ; check for disk error
  3310.         pop     bx              ; get handle
  3311.         push    bx              ; save it again
  3312.         mov     ah,3fh          ; dos read file command
  3313.         push    ds              ; save data seg
  3314.         mov     dx,seg bufpa    ; set large seq seg
  3315.         mov     ds,dx           ; /
  3316.         mov     dx,8000h        ; page offset for 2nd half
  3317.         mov     cx,8000h        ; load half at a time
  3318.         push    cx              ; save read bytes
  3319.         int     21h             ; load first half
  3320.         pop     cx              ; restore read bytes
  3321.         pop     ds              ; restore data seg
  3322.         call    errqrd          ; check for disk error
  3323.         ;
  3324. lodmod4:test    _mpab,1         ; want to do this?
  3325.         jnz     lodmod5         ; yes, branch
  3326.         jmp     lodmodx         ; no, just go to exit
  3327. lodmod5:pop     bx              ; yes, set file pointer
  3328.         push    bx              ; handle
  3329.         mov     cx,2            ; ms word of pointer
  3330.         mov     dx,4096+128     ; ls word of pointer
  3331.         mov     al,0            ; offset from start of file
  3332.         mov     ah,42H          ; Move File Pointer
  3333.         int     21H             ; dos call
  3334.         ;
  3335.         pop     bx              ; get handle
  3336.         push    bx              ; save it again
  3337.         mov     ah,3fh          ; dos read file command
  3338.         push    ds              ; save data seg
  3339.         mov     dx,0bc00h       ; set page 4 seg
  3340.         mov     ds,dx           ; /
  3341.         mov     dx,0            ; page offset is 0
  3342.         mov     cx,4000H        ; 4 screens of 4K bytes
  3343.         push    cx              ; save read bytes
  3344.         int     21h             ; load first half
  3345.         pop     cx              ; restore read bytes
  3346.         pop     ds              ; restore data seg
  3347.         call    errxrd          ; check for disk error
  3348.         ;
  3349.         pop     bx              ; get handle
  3350.         push    bx              ; save it again
  3351.         mov     ah,3fh          ; dos read file command
  3352.         push    ds              ; save data seg
  3353.         mov     dx,0b800h       ; set page 0 seg
  3354.         mov     ds,dx           ; /
  3355.         mov     dx,0            ; page offset is 0
  3356.         mov     cx,4000H        ; 8 screens of 4K bytes
  3357.         push    cx              ; save read bytes
  3358.         int     21h             ; load first half
  3359.         pop     cx              ; restore read bytes
  3360.         pop     ds              ; restore data seg
  3361.         call    errxrd          ; check for disk error
  3362.         ;
  3363.         pop     bx              ; get handle
  3364.         push    bx              ; save it again
  3365.         mov     ah,3fh          ; dos read file command
  3366.         mov     dx,offset dgroup:valsav; point to values
  3367.         mov     cx,valend-valsav; cx = bytes to load
  3368.         push    cx              ; save read bytes
  3369.         int     21h             ; load first half
  3370.         pop     cx              ; restore read bytes
  3371.         call    errxrd          ; check for disk error
  3372.         ;
  3373.         pop     bx              ; get handle
  3374.         push    bx              ; save it again
  3375.         mov     ah,3fh          ; dos read file command
  3376.         mov     dx,offset dgroup:mvlsav; point to values
  3377.         mov     cx,mvlnum       ; cx = bytes to load
  3378.         push    cx              ; save read bytes
  3379.         int     21h             ; load first half
  3380.         pop     cx              ; restore read bytes
  3381.         call    errxrd          ; check for disk error
  3382.         ;
  3383.         pop     bx              ; get handle
  3384.         push    bx              ; save it again
  3385.         mov     ah,3fh          ; dos read file command
  3386.         mov     dx,offset dgroup:_modsrc; point to module source table
  3387.         mov     cx,offset dgroup:_chrtbl; calc number of bytes
  3388.         sub     cx,dx           ; cx = bytes in modsrc table
  3389.         push    cx              ; save read bytes
  3390.         int     21h             ; load first half
  3391.         pop     cx              ; restore read bytes
  3392.         call    errxrd          ; check for disk error
  3393.         ;
  3394.         pop     bx              ; get handle
  3395.         push    bx              ; save it again
  3396.         mov     ah,3fh          ; dos read file command
  3397.         mov     dx,offset dgroup:_exetbl; module exec table
  3398.         mov     cx,2048         ; 512 modules @ 4 bytes each
  3399.         push    cx              ; save read bytes
  3400.         int     21h             ; load first half
  3401.         pop     cx              ; restore read bytes
  3402.         call    errxrd          ; check for disk error
  3403.         ;
  3404.         pop     bx              ; get handle
  3405.         push    bx              ; save it again
  3406.         mov     ah,3fh          ; dos read file command
  3407.         mov     dx,offset dgroup:vartbl; variable table
  3408.         mov     cx,varsiz       ; var table
  3409.         push    cx              ; save read bytes
  3410.         int     21h             ; load first half
  3411.         pop     cx              ; restore read bytes
  3412.         call    errxrd          ; check for disk error
  3413.         ;
  3414.         pop     bx              ; get handle
  3415.         push    bx              ; save it again
  3416.         mov     ah,3fh          ; dos read file command
  3417.         mov     dx,offset dgroup:_modtxt; module text
  3418.         mov     cx,offset dgroup:?modtxt; end of module text
  3419.         sub     cx,dx           ; cx = bytes in module text
  3420.         push    cx              ; save read bytes
  3421.         int     21h             ; load first half
  3422.         pop     cx              ; restore read bytes
  3423.         call    errxrd          ; check for disk error
  3424.         ;
  3425. lodmodx:
  3426.         pop     bx              ; get file handle
  3427.         mov     ah,3eh          ; dos close file
  3428.         int     21h             ; close the file
  3429.         call    errclr          ; check for disk error
  3430.         ret                     ; exit
  3431. ;--------------------------------------------------------------
  3432. ; delete temp file
  3433. ;
  3434. delmod: test    _tmpfn,-1       ; want to do it
  3435.         jz      delmodq         ; no, just exit
  3436.         mov     dx,offset dgroup:_tmpfn; delete the load file
  3437.         mov     ah,41h          ; dos delete function call
  3438.         int     21h             ; /
  3439. delmodq:ret
  3440. ;==============================================================
  3441. ; pointing device interface
  3442. ;--------------------------------------------------------------
  3443. ; The following pointing device interface assumes an interrupt
  3444. ; driven microsoft-compatable mouse.  When a the mouse position
  3445. ; changes, or a button is pushed, the interrupt routine sets
  3446. ; the new x, y and flag, but does no other processing.
  3447. ; The cursor update and other action is performed by the work
  3448. ; loop, thus allowing multiple page usage, and control over when
  3449. ; cursor updating should occur.
  3450. ;--------------------------------------------------------------
  3451. ; initialize pointing device
  3452. ;
  3453. initpd: 
  3454.         mov     ax,0            ; test for mouse
  3455.         mov     es,ax           ; /
  3456.         mov     bx,0cch         ; es:bx = mouse inte vector
  3457.         cmp     es:[bx],ax      ; int vector = 0?
  3458.         jz      pdng            ; yes, exit
  3459.         mov     ax,es:2[bx]     ; no, get the vector addr
  3460.         mov     bx,es:[bx]      ; /
  3461.         mov     es,ax           ; es:bx = vector addr
  3462.         cmp     byte ptr es:[bx],0cfh; pointing to return?
  3463.         jnz     pdok            ; no, go to it 
  3464. pdng:
  3465.         mov     dx,offset nopd$ ; no mouse, print message
  3466.         call    print$          ; /
  3467.         jmp     split1          ; exit program
  3468. pdok:   mov     ax,0            ; initialize
  3469.         int     33H             ; mouse driver inte
  3470.         mov     ah,1            ; turn dos cursor off
  3471.         mov     ch,32           ;     /
  3472.         mov     cl,0            ;   /
  3473.         int     10H             ; /
  3474.         ret
  3475. nopd$   db      'No Pointing Device$',cr,lf
  3476. ;--------------------------------------------------------------
  3477. ; this routine is called only by interrupt, when
  3478. ; the pd position or flag changes.
  3479. ;
  3480. pdupd   proc    far             ; called by interrupt
  3481.         mov     di,seg dgroup    ; set local seg
  3482.         mov     ds,di           ; /
  3483. ;        test    al,1EH          ; button change?
  3484. ;        jz      pdupd1          ; no, branch
  3485.         test    al,14H          ; button released
  3486.         jz      pdupd2          ; no, branch
  3487.         or      bl,80H          ; set bit 7 hi
  3488. pdupd2: mov     al,pdf          ; or with prev bit 7
  3489.         and     al,80H          ;   /
  3490.         or      bl,al           ; /
  3491.         mov     pdf,bl          ; store flags
  3492. pdupd1: mov     ax,dx           ; convert pixel xy to char xy
  3493.         mov     bx,cx           ;       /
  3494.         mov     cl,3            ;     /
  3495.         shr     ax,cl           ;   /
  3496.         shr     bx,cl           ; /
  3497.         mov     pdx,bl          ; save in pdx, pdy
  3498.         mov     pdy,al          ; /
  3499.         ;
  3500.         vxyadr                  ; convert vx,vy to offst in bx
  3501.         mov     ax,curadr       ; get last cursor address
  3502.         mov     curadr,bx       ; save the new one
  3503.         mov     es,vpage        ; point to current video page
  3504.         test    curflg,1        ; wanna do the normal cursor
  3505.         jnz     pdupd3          ; no, branch
  3506.         xchg    bx,ax           ; get addr of old cursor
  3507.         mov     dx,curdata      ; get old cursor data
  3508.         mov     es:[bx],dx      ; restore
  3509.         xchg    bx,ax           ; get addr of new cursor
  3510.         mov     dx,es:[bx]      ; get new data
  3511.         mov     curdata,dx      ; save it
  3512.         mov     dh,curcol       ; get cursor color
  3513.         or      dh,dh           ; doing it?
  3514.         jz      pdupd3          ; no, branch
  3515.         mov     ch,pdf          ; yes, get flag info
  3516.         mov     cl,5            ; show it
  3517.         shl     ch,cl           ;   /
  3518.         or      dh,ch           ; /
  3519. pdupd4: mov     es:[bx],dx      ; display cursor
  3520.         ;
  3521. pdupd3: mov     cx,execur       ; get cursor exe address
  3522.         or      cx,cx           ; only do if nz
  3523.         jz      pdupdx          ;   /
  3524.         jmp     cx              ; /
  3525. pdupdx: ret                     ; exit
  3526. pdupd   endp
  3527.  
  3528. ;--------------------------------------------------------------
  3529. ; show cursor
  3530. ;
  3531.         public  curon
  3532. curon   proc    near
  3533.         mov     es,vpage        ; point to current video page
  3534.         test    curflg,1        ; special cursor?
  3535.         jz      curon0          ; no, branch
  3536.         ;
  3537.         mov     di,modchar      ; get char table
  3538.         mov     cx,[di]         ; get number of lines
  3539.         add     di,4            ; point to 1st char
  3540.         mov     bx,curadr       ; cursor address
  3541.         dec     bx              ; shift for module
  3542.         dec     bx              ; /
  3543.         call    shomod$         ; show the module
  3544.         jmp     short curon2    ; branch around regular stuff
  3545.         ;
  3546. curon0: mov     bx,curadr       ; get last cursor address
  3547.         mov     dx,curdata      ; get cursor data
  3548.         test    curonf,1        ; want to restore?
  3549.         jz      curon1          ; no, branch
  3550.         mov     curonf,0        ; yes, clear flag
  3551.         mov     dx,es:[bx]      ; use screen character
  3552.         mov     curdata,dx      ; /
  3553.         ;
  3554. curon1: mov     dh,curcol       ; get cursor color
  3555.         or      dh,dh           ; doing it?
  3556.         jz      curon2          ; no, branch
  3557.         mov     ch,pdf          ; yes, get flag info
  3558.         mov     cl,5            ; show it
  3559.         shl     ch,cl           ;   /
  3560.         or      dh,ch           ; /
  3561.         mov     es:[bx],dx      ; display cursor
  3562.         ;
  3563. curon2: mov     cx,1fh          ; inte on any change
  3564.         mov     ax,12           ; "set call mask"
  3565.         mov     dx,cs           ; seg of pd update routine
  3566.         mov     es,dx           ; /
  3567.         mov     dx,offset pdupd ; address of pd update         
  3568.         int     33H             ; set the mask
  3569.         ret                     ; exit
  3570. curon   endp
  3571. ;--------------------------------------------------------------
  3572. ; hide cursor
  3573. ; turn off pd interrupts
  3574. ; must be called upon program exit
  3575. ;
  3576.         public  curoff 
  3577. curoff  proc    near
  3578.         mov     es,vpage        ; point to current video page
  3579.         test    curflg,1        ; special cursor?
  3580.         jz      curoff0         ; no, branch
  3581.         ;
  3582.         mov     di,modchar      ; get char table
  3583.         mov     cx,[di]         ; get number of lines
  3584.         mov     bx,curadr       ; cursor address
  3585.         dec     bx              ; shift for module
  3586.         dec     bx              ; /
  3587.         call    fixmod$         ; restore the screen
  3588.         ;
  3589.         mov     bx,curadr       ; save cursor
  3590.         push    ds              ; save data seg
  3591.         mov     ax,seg buffv    ; get back buffer seg
  3592.         mov     ds,ax           ; /
  3593.         mov     ax,es:[bx]      ; get current screen info
  3594.         mov     [bx],ax         ; put it in back buffer
  3595.         pop     ds              ; get data seg back
  3596.         mov     curdata,ax      ; update cursor data
  3597.         jmp     short curoff1   ; jump around regular stuff
  3598.         ;
  3599. curoff0:mov     bx,curadr       ; get last cursor address
  3600.         mov     dx,curdata      ; get cursor data
  3601.         mov     es:[bx],dx      ; display cursor
  3602.         ;
  3603. curoff1:mov     cx,0            ; mask intes
  3604.         mov     ax,12           ; "set call mask"
  3605.         mov     dx,cs           ; seg of pd update routine
  3606.         mov     es,dx           ; /
  3607.         mov     dx,offset pdupd ; address of pd update         
  3608.         int     33H             ; set the mask
  3609.         ret                     ; exit
  3610. curoff  endp
  3611. ;==============================================================
  3612. ; video display routines
  3613. ;--------------------------------------------------------------
  3614. ; module cursor
  3615. ; call with with ax= old curadr, bx:es=current curadr
  3616. ; addr of character list is in modchar
  3617. ;
  3618. modcur  proc far
  3619.         push    bx              ; save new curadr
  3620.         mov     bx,ax           ; get old curadr
  3621.         dec     bx              ; modules at vx-1
  3622.         dec     bx              ; /
  3623.         mov     di,modchar      ; point to module char source
  3624.         mov     cx,[di]         ; get the line count
  3625.         push    cx              ; save for later
  3626.         add     di,4            ; point to first char
  3627.         push    di              ; save for later
  3628.         call    fixmod$         ; restore the old stuff
  3629.         pop     di              ; it's later
  3630.         pop     cx              ; get count
  3631.         pop     bx              ; get new curadr
  3632.         push    bx              ; save it again
  3633.         dec     bx              ; modules at vx-1
  3634.         dec     bx              ; /
  3635.         call    shomod$         ; show the modules
  3636.         pop     bx              ; get new curadr
  3637.         or      byte ptr es:1[bx],18H ; cursor
  3638.         ret                     ; exit
  3639. modcur  endp
  3640. ;--------------------------------------------------------------
  3641. ; draw modules to screen
  3642. ; call with:    di=module character array
  3643. ;               cx=count of module char lines
  3644. ;               es:bx=video page:offset of 1st char
  3645. ;   
  3646. shomod$ proc    near
  3647.         push    bp              ; save bp
  3648.         mov     bp,ds           ; bp = data seg
  3649.         mov     dx,seg buffv    ; dx = back buffer seg
  3650. shomod1:mov     ax,[di]    ; get first char
  3651.         xchg    ax,es:[bx]      ; put it on the screen
  3652.         mov     ds,dx           ; set buffer seg
  3653.         mov     ds:[bx],ax      ; save the old one
  3654.         mov     ds,bp           ; restore data seg
  3655.         inc     di              ; point to next
  3656.         inc     di              ; /
  3657.         mov     ax,[di]         ; get 2nd character
  3658.         xchg    ax,es:2[bx]     ; put it on the screen
  3659.         mov     ds,dx           ; set buffer seg
  3660.         mov     ds:2[bx],ax     ; save the old one
  3661.         mov     ds,bp           ; restore data seg
  3662.         inc     di              ; point to next
  3663.         inc     di              ; /
  3664.         mov     ax,[di]         ; get 3rd char
  3665.         xchg    ax,es:4[bx]     ; put it on the screen
  3666.         mov     ds,dx           ; set buffer seg
  3667.         mov     ds:4[bx],ax     ; save the old one
  3668.         mov     ds,bp           ; restore data seg
  3669.         inc     di              ; point to next
  3670.         inc     di              ; /
  3671.         add     bx,160          ; next line
  3672.         loop    shomod1         ; do all of module
  3673.         pop     bp              ; restore bp
  3674.         ret
  3675. shomod$ endp
  3676. ;--------------------------------------------------------------
  3677. ; restore screen from modules previously drawn
  3678. ; call with:    di=module character array
  3679. ;               cx=count of module char lines
  3680. ;               es:bx=video page:offset of 1st char
  3681. ;   
  3682. fixmod$ proc    near
  3683.         push    ds              ; save data seg
  3684.         mov     ax,seg buffv    ; set ds to back buffer
  3685.         mov     ds,ax           ; /
  3686. fixmod1:mov     ax,ds:[bx]      ; get the old char
  3687.         mov     es:[bx],ax      ; put it back on the screen
  3688.         mov     ax,ds:2[bx]     ; get the old char
  3689.         mov     es:2[bx],ax     ; put it back on the screen
  3690.         mov     ax,ds:4[bx]     ; get the old char
  3691.         mov     es:4[bx],ax     ; put it back on the screen
  3692.         add     bx,160          ; next line
  3693.         loop    fixmod1         ; do all of module
  3694.         pop     ds              ; restore data seg
  3695.         ret
  3696. fixmod$ endp
  3697. ;--------------------------------------------------------------
  3698. ; erase module from screen
  3699. ; call with es:bx = module tag addr
  3700. ;           cx = count of char lines
  3701. ;
  3702. eramod$ proc    near 
  3703.         mov     word ptr es:[bx],0  ; erase center char
  3704.         mov     word ptr es:2[bx],0 ; erase right char
  3705.         mov     word ptr es:-2[bx],0; erase left char
  3706.         add     bx,160          ; next line
  3707.         loop    eramod$         ; loop til done
  3708.         ret                     ; exit
  3709. eramod$ endp
  3710. ;--------------------------------------------------------------
  3711. ; fix blink bit for a blinking module
  3712. ; call with es:bx = module tag addr
  3713. ;           cx = count of char lines
  3714. ;
  3715. unblink proc    near 
  3716.         and     byte ptr es:1[bx],07fh ; fix center char
  3717.         and     byte ptr es:3[bx],07fh ; fix right char
  3718.         and     byte ptr es:-1[bx],07fh; fix left char
  3719.         add     bx,160          ; next line
  3720.         loop    unblink         ; loop til done
  3721.         ret                     ; exit
  3722. unblink endp
  3723. ;==============================================================
  3724. ; get file name, if any, from command line
  3725. ;
  3726. getfn   proc    near
  3727.         mov     es,_bases               ; es = base seg
  3728.         mov     di,80h                  ; di = offset of cmd line
  3729.         mov     si,offset dgroup:_savfn ; si = save file name buffer
  3730.         mov     cl,es:[di]              ; get the number of bytes
  3731.         cmp     cl,9                    ; 8 bytes maximum
  3732.         jbe     getfn3                  ;  /
  3733.         mov     cl,9                    ; /
  3734. getfn3: mov     ch,0                    ; /
  3735.         or      cl,cl                   ; exit if no name given
  3736.         jnz     getfna                  ; /
  3737.         clc                             ; cy clr means no name
  3738.         ret                             ; /
  3739. getfna: inc     di                      ; point to start of text
  3740. getfn0: mov     al,es:[di]              ; get first char
  3741.         cmp     al,' '                  ; ignore spaces
  3742.         jz      getfn1                  ; /
  3743.         cmp     al,'.'                  ; stop on dot or 0
  3744.         jz      getfn2                  ;   /
  3745.         cmp     al,0                    ;  /
  3746.         jz      getfn2                  ; /
  3747.         mov     [si],al                 ; put char in save file name buffer
  3748.         inc     si                      ; bump fn pointer
  3749. getfn1: inc     di                      ; bump cmd line pointer
  3750.         loop    getfn0                  ; loop to max of input chars
  3751.         ;
  3752. getfn2: mov     byte ptr [si],'.'       ; set up extension
  3753.         mov     byte ptr 1[si],'M'      ;    /
  3754.         mov     byte ptr 2[si],'B'      ;   /
  3755.         mov     byte ptr 3[si],' '      ;  /
  3756.         mov     byte ptr 4[si],0        ; /
  3757.         stc                             ; cy set means fn given
  3758.         ret                             ; exit
  3759. getfn   endp
  3760. ;--------------------------------------------------------------
  3761. ; show save file name on screen 0
  3762.  
  3763. showfn:
  3764.         mov     dx,0b800h               ; es = page 0
  3765.         mov     es,dx                   ; /
  3766.         mov     di,0a46h                ; di = char addr
  3767.         mov     si,offset dgroup:_savfn ; si = temp file name buffer
  3768.         mov     cx,8                    ; 8 chars to do
  3769.         mov     dl,0                    ; flag for end of name
  3770. showfn1:test    dl,1                    ; reached end of name?
  3771.         jnz     showfn2                 ; yes, branch
  3772.         mov     al,[si]                 ; get the char
  3773.         call    touc                    ; convert to upper case
  3774.         cmp     al,'.'                  ; end of name
  3775.         jnz     showfn3                 ; no, branch
  3776.         mov     dl,1                    ; yes, set flag
  3777. showfn2:mov     al,' '                  ; set char to blank
  3778. showfn3:mov     es:[di],al              ; write the char
  3779.         inc     di                      ; bump pointers
  3780.         inc     di                      ;  /
  3781.         inc     si                      ; /
  3782.         loop    showfn1                 ; do 8 chars
  3783.         ret
  3784. ;==============================================================
  3785. ; get a string from the keyboard to _inbuf
  3786. ; call with first byte of _inbuf set to max chars
  3787. ;
  3788. getkey:
  3789.         mov     ah,1            ; turn dos cursor on
  3790.         mov     ch,6            ;   /
  3791.         mov     cl,7            ;  /
  3792.         int     10H             ; /
  3793.         ;
  3794.         mov     dx,offset dgroup:_inbuf
  3795.         mov     ah,0ah          ; dos read buffer line function
  3796.         int     21h             ; /
  3797.         ;
  3798.         mov     ah,1            ; turn dos cursor off
  3799.         mov     ch,32           ;   /
  3800.         mov     cl,0            ;  /
  3801.         int     10H             ; /
  3802.         ;
  3803.         ret     
  3804. ;==============================================================
  3805. ; read directory into the filename area
  3806. ;
  3807. getdir: call    clrdir          ; clear the directory area
  3808.         ;
  3809.         mov     dx,offset dgroup:_dirfn; now read the name
  3810.         mov     cx,0            ; attribute "normal"
  3811.         mov     ah,4eh          ; read first
  3812.         int     21h             ; dos call
  3813.         jc      getdirx         ; exit if no match
  3814.         call    dodir0          ; else print it
  3815.         ;
  3816.         mov     cx,30           ; 30+first+room max
  3817. getdir1:push    cx              ; save count
  3818.         mov     ah,4fh          ; read next
  3819.         int     21h             ; dos call
  3820.         pop     cx              ; get count
  3821.         jc      getdirx         ; exit if no match
  3822.         push    cx              ; save count
  3823.         call    dodir           ; else print it
  3824.         pop     cx              ; get count
  3825.         loop    getdir1         ; do until done or limit
  3826. getdirx:
  3827.         ;
  3828.         mov     ah,36h          ; get free disk space
  3829.         mov     dl,0            ; default drive
  3830.         int     21h             ; dos call
  3831.         mul     cx              ; find out in bytes
  3832.         mul     bx              ; result in dx:ax
  3833.         mov     ax,dx           ; /65K
  3834.         mov     cl,2            ; /4 = 256K/file
  3835.         shr     ax,cl           ; /
  3836.         push    ax              ; save result
  3837.         ;
  3838.         mov     ax,0b800h       ; set up video seg
  3839.         mov     es,ax           ; /
  3840.         mov     ax,diradr       ; current offset
  3841.         add     ax,0612h        ; ah=x
  3842.         mov     bl,ah           ; al=y, bl=x
  3843.         mov     bh,0            ; /
  3844.         vxyadr                  ; bx = video page address
  3845.         mov     colr,grey
  3846.         mov     word ptr es:[bx],gry+'['; set up brackets
  3847.         mov     word ptr es:8[bx],gry+']'
  3848.         add     bx,2
  3849.         ;
  3850.         pop     ax              ; get numb of files
  3851.         mov     room,al         ; save the room number
  3852.         mov     ah,0            ; 50 MB is enough
  3853.         call    toddec          ; print them
  3854.         ;
  3855.         ret                     ; split
  3856. ;--------------------------------------------------------------
  3857. ; read from _inbuf into the filename area
  3858. ; do 4 names, then bump to next column
  3859. ; call dodir0 to initialize, then call dodir
  3860. ;
  3861. dodir0: mov     diradr,0        ; initialize address
  3862. dodir:  mov     ax,0b800h       ; set up video seg
  3863.         mov     es,ax           ; /
  3864.         mov     ax,diradr       ; current offset
  3865.         add     ax,0612h        ; ah=x
  3866.         mov     bl,ah           ; al=y, bl=x
  3867.         mov     bh,0            ; /
  3868.         vxyadr                  ; bx = video page address
  3869.         mov     di,9eh          ; point to source
  3870.         push    ds              ; save local data seg
  3871.         mov     ds,_bases       ; get system data seg
  3872.         mov     cx,8            ; 8 max to do
  3873. dodir1: mov     al,[di]         ; get the char
  3874.         cmp     al,'.'          ; extension ?
  3875.         jz      dodir2
  3876.         mov     es:[bx],al      ; no, write the char
  3877.         inc     bx              ; bump pointers
  3878.         inc     bx              ;  /
  3879.         inc     di              ; /
  3880.         loop    dodir1          ; loop
  3881.         ;
  3882. dodir2: pop     ds              ; get local ds back
  3883.         mov     ax,diradr       ; bump screen address
  3884.         inc     al              ; bump y
  3885.         test    al,4            ; 3 max
  3886.         jz      dodir3          ; branch if < 4
  3887.         mov     al,0            ; else reset y   
  3888.         add     ah,9            ; .. bump x
  3889. dodir3: mov     diradr,ax       ; put it away
  3890.         ret
  3891. ;--------------------------------------------------------------
  3892. ; clear the directory filename area
  3893. ;
  3894. clrdir: mov     ax,0b800h       ; set up video seg
  3895.         mov     es,ax           ; /
  3896.         mov     di,0b4ch        ; point to 1st char
  3897.         mov     dl,4            ; 4 lines
  3898.         mov     ax,yel          ; set color
  3899. clrdir0:mov     bx,0            ; /
  3900.         mov     cx,72           ; 72 words per line
  3901. clrdir1:mov     es:[bx+di],ax   ; set the word
  3902.         inc     bx              ; bump
  3903.         inc     bx              ; /
  3904.         loop    clrdir1         ; do the line
  3905.         add     di,160          ; next line
  3906.         dec     dl              ;  /
  3907.         jnz     clrdir0         ; /
  3908.         ret
  3909. ;==============================================================
  3910. ; show the current path
  3911. ;
  3912. dopath: mov     ah,19h          ; get current disk drive
  3913.         int     21h             ; dos call
  3914.         add     al,'A'          ; make it a letter
  3915.         mov     _inbuf,al       ; put it away
  3916.         mov     byte ptr _inbuf+1,':' ; send colon & slash
  3917.         mov     byte ptr _inbuf+2,'\' ; /
  3918.         ;
  3919.         mov     ah,47H          ; get current directory
  3920.         mov     dl,0            ; 0 = default drive
  3921.         mov     si,offset dgroup:_inbuf+3; put it in inbuf
  3922.         int     21h             ; dos call
  3923.         jc      dopathx         ; exit if error
  3924.         ;
  3925.         mov     ax,0b800h       ; set up video seg
  3926.         mov     es,ax           ; /
  3927.         mov     bx,58H+(16*160) ; offset for line
  3928.         mov     ax,yel          ; set color
  3929.         mov     cx,35           ; words in line
  3930. dopath1:mov     es:[bx],ax      ; set the word
  3931.         inc     bx              ; bump
  3932.         inc     bx              ; /
  3933.         loop    dopath1         ; do the line
  3934.         ;
  3935.         mov     bx,58H+(16*160) ; offset for line
  3936.         mov     di,offset dgroup:_inbuf; dir text
  3937. dopath2:mov     al,[di]         ; get the char
  3938.         or      al,al           ; end?
  3939.         jz      dopathx         ; yes, exit
  3940.         mov     es:[bx],al      ; no, output to screen
  3941.         inc     di              ; bump pointers
  3942.         inc     bx              ;  /
  3943.         inc     bx              ; /
  3944.         jmp     short dopath2   ; loop
  3945. dopathx:ret                     ; exit
  3946. ;==============================================================
  3947. ; critical error handeling (trapped DOS int 24H )
  3948. ;
  3949. cerror: 
  3950.         push    bx              ; save cpu state
  3951.         push    cx              ;       /
  3952.         push    dx              ;      /
  3953.         push    di              ;     /
  3954.         push    si              ;    /
  3955.         push    bp              ;   /
  3956.         push    ds              ;  /
  3957.         push    es              ; /
  3958.         mov     al,0            ; setup to ignore
  3959.         test    ah,80h          ; disk error ?
  3960.         jnz     cerrorx         ; no, exit
  3961.         push    di              ; save error cond
  3962.         ;
  3963.         mov     dx,seg dgroup   ; set up data seg
  3964.         mov     ds,dx           ; /
  3965.         ;
  3966.         mov     dx,offset dgroup:_err_wp;write protect ermsg
  3967.         pop     ax              ; check for write protect
  3968.         or      al,al           ; write protect
  3969.         jz      cerror1         ; yes, branch
  3970.         mov     dx,offset dgroup:_err_dx; general ermsg
  3971. cerror1:call    errmsg          ; do the message
  3972.         ;
  3973.         mov     ah,al           ; put result in ah
  3974.         mov     al,0            ; ...to Ignore
  3975.         cmp     ah,'I'          ; wanna?
  3976.         jz      cerrorx         ; yes, go do it
  3977.         inc     al              ; ...to Retry
  3978.         cmp     ah,'R'          ;  /
  3979.         jz      cerrorx         ; /
  3980.         ;
  3981.         call    curoff          ; this is serious
  3982.         call    cls             ; clear screen
  3983.         mov     ah,2            ; set cursor to top of screen
  3984.         mov     dx,0            ;     /
  3985.         mov     bh,dh           ;   /
  3986.         int     10H             ; /
  3987.         mov     ah,1            ; turn dos cursor on
  3988.         mov     ch,6            ;     /
  3989.         mov     cl,7            ;   /
  3990.         int     10H             ; /
  3991.         call    stopt           ; stop system timer
  3992.         call    stopm           ; stop mpu ints
  3993.         mov     al,2            ; Quit
  3994.         ;
  3995. cerrorx:pop     es              ; restore cpu state
  3996.         pop     ds              ;       /
  3997.         pop     bp              ;      /
  3998.         pop     si              ;     /
  3999.         pop     di              ;    /
  4000.         pop     dx              ;   /
  4001.         pop     cx              ;  /
  4002.         pop     bx              ; /
  4003.         iret
  4004. ;==============================================================
  4005. ; Error message handler
  4006. ; call with errormsg in dx
  4007. ; returns with al = I, R, or Q
  4008. ;
  4009. errmsg:
  4010.         push    dx              ; save message addr
  4011.         mov     vpagen,1        ; set page 1 as swap
  4012.         mov     al,0            ; set page 0 active
  4013.         call    page            ; /
  4014.         ;
  4015.         mov     ax,0b800h       ; set up video seg
  4016.         mov     es,ax           ; /
  4017.         mov     si,58H+(16*160) ; offset for line
  4018.         mov     di,offset dgroup:_foo; scratch buffer
  4019.         mov     bx,0            ; clear index
  4020.         mov     cx,35           ; words in line
  4021. errmsg0:
  4022.         mov     ax,es:[bx+si]   ; get the char
  4023.         mov     [bx+di],ax      ; save it
  4024.         inc     bx              ; bump
  4025.         inc     bx              ; /
  4026.         loop    errmsg0         ; do the line
  4027.         ;
  4028.         mov     ah,2            ; bios set cursor position
  4029.         mov     bh,0            ; page 0
  4030.         mov     dx,102CH        ; x,y of cursor
  4031.         int     10H             ; do bios int
  4032.         ;
  4033.         pop     dx              ; get the message
  4034.         mov     ah,9            ; print line
  4035.         int     21H             ; dos call
  4036.         ;
  4037. errmsg1:mov     ah,8            ; get a key response
  4038.         int     21h             ; dos call
  4039.         call    touc            ; convert to uppercase
  4040.         cmp     al,'I'          ; check for "I", "R", or "Q"
  4041.         jz      errmsg2         ; ...and branch if ok
  4042.         cmp     al,'E'          ;      /
  4043.         jz      errmsg2         ;     /
  4044.         cmp     al,'R'          ;    /
  4045.         jz      errmsg2         ;   /
  4046.         cmp     al,'Q'          ;  /
  4047.         jnz     errmsg1         ; /
  4048. errmsg2:push    ax              ; save result
  4049.         ;
  4050.         mov     ax,0b800h       ; set up video seg
  4051.         mov     es,ax           ; /
  4052.         mov     si,58H+(16*160) ; offset for line
  4053.         mov     di,offset dgroup:_foo; scratch buffer
  4054.         mov     bx,0            ; clear index
  4055.         mov     cx,35           ; words in line
  4056.         ;
  4057. errmsg3:
  4058.         mov     ax,[bx+di]      ; get the char
  4059.         mov     es:[bx+si],ax   ; restore it
  4060.         inc     bx              ; bump
  4061.         inc     bx              ; /
  4062.         loop    errmsg3         ; do the line
  4063.         ;
  4064.         mov     ah,2            ; bios set cursor position
  4065.         mov     bh,0            ; page 0
  4066.         mov     dx,102CH        ; x,y of cursor
  4067.         int     10H             ; do bios int
  4068.         ;
  4069.         pop     ax              ; return kbd input
  4070.         ret                     ; exit
  4071. ;--------------------------------------------------------------
  4072. ; errwrt: check for error while writing
  4073. ; call with cx = proper file size
  4074. ;
  4075. errwrt: jnc     errwrt1         ; branch if no error
  4076.         or      errflg,1        ; set flag
  4077.         mov     errwrd,ax       ; save message
  4078.         ret
  4079. errwrt1:cmp     ax,cx           ; correct size
  4080.         jz      errwrtx         ; yes, exit
  4081.         or      errflg,2        ; no, set flag
  4082. errwrtx:ret
  4083. ;--------------------------------------------------------------
  4084. ; check for error while opening write file
  4085. ;
  4086. erropw: mov     errflg,0        ; clear error flag
  4087.         jnc     erropwx         ; exit if no error
  4088.         or      errflg,4        ; set flag
  4089.         mov     errwrd,ax       ; save message
  4090. erropwx:ret
  4091. ;--------------------------------------------------------------
  4092. ; check for error while closing write file
  4093. ;
  4094. errclw: jnc     errclwx         ; exit if no error
  4095.         or      errflg,8        ; set flag
  4096.         mov     errwrd,ax       ; save message
  4097. errclwx:ret
  4098. ;--------------------------------------------------------------
  4099. ; check for error while opening read file
  4100. ;
  4101. erropr: mov     errflg,0        ; clear error flag
  4102.         jnc     erroprx         ; exit if no error
  4103.         or      errflg,40H      ; set flag
  4104.         mov     errwrd,ax       ; save message
  4105. erroprx:ret
  4106. ;--------------------------------------------------------------
  4107. ; check for error while closing read file
  4108. ;
  4109. errclr: jnc     errclrx         ; exit if no error
  4110.         or      errflg,80h      ; set flag
  4111.         mov     errwrd,ax       ; save message
  4112. errclrx:ret
  4113. ;--------------------------------------------------------------
  4114. ; errxrt: check for non fatal error while reading
  4115. ; call with cx = proper file size
  4116. ;
  4117. errqrd: jnc     errqrd1         ; exit if no error
  4118.         or      errflg,10h      ; set flag
  4119.         mov     errwrd,ax       ; save message
  4120.         ret
  4121. errqrd1:cmp     ax,cx           ; correct size
  4122.         jz      errqrdx         ; yes, exit
  4123.         or      errflg,20h      ; no, set flag
  4124. errqrdx:ret
  4125. ;--------------------------------------------------------------
  4126. ; errxrt: check for fatal error while reading
  4127. ;
  4128. errxrd: jnc     errxrd1         ; exit if no error
  4129. errxrd0:mov     ax,offset dgroup:_errmod; yes, give parting shot
  4130.         mov     byemsg,ax       ; /
  4131.         jmp     split           ; exit
  4132. errxrd1:cmp     ax,cx           ; correct size 
  4133.         jnz     errxrd0         ; no, split
  4134.         ret
  4135. ;--------------------------------------------------------------
  4136. ; errundo: check for undo open error
  4137. errundo:
  4138.         jnc     errundx         ; exit if no error
  4139.         mov     ax,offset dgroup:_opundo; yes, give parting shot
  4140.         mov     byemsg,ax       ; /
  4141.         jmp     split           ; exit
  4142. errundx:ret
  4143. ;==============================================================
  4144. ; debugging routines
  4145.         if      debug
  4146. ;--------------------------------------------------------------
  4147. _DATA   SEGMENT
  4148.         public show0,show1,show2,show3,showq
  4149. show0   dw      0               ; debug show words
  4150. show1   dw      1               ;
  4151. show2   dw      2               ;
  4152. show3   dw      -1              ;
  4153. showq   dw      22 dup (0)
  4154.         dw      0
  4155.  
  4156. _DATA   ENDS
  4157. ;--------------------------------------------------------------
  4158. ; move 16 words, starting with ds:[bx] into show array
  4159. ; all registers preserved
  4160. ;
  4161. showw   proc    near
  4162.         push    es
  4163.         push    ds
  4164.         push    ax
  4165.         push    bx
  4166.         push    cx
  4167.         push    di
  4168.         mov     ax,seg dgroup
  4169.         mov     ds,ax
  4170.         mov     di,offset dgroup:showq
  4171.         mov     cx,44
  4172. showwl: mov     al,[bx]
  4173.         mov     [di],al
  4174.         inc     bx
  4175.         inc     di
  4176.         loop    showwl
  4177. showw2:
  4178.         pop     di
  4179.         pop     cx
  4180.         pop     bx
  4181.         pop     ax
  4182.         pop     ds
  4183.         pop     es
  4184. showw   endp
  4185. ;--------------------------------------------------------------
  4186. ; show 16 memory values starting with SHOW0
  4187. ; all registers preserved
  4188. ;
  4189. show    proc    near
  4190.         cmp     word ptr vpage,0b800h; don't show 0
  4191.         jnz     showa           ;     /
  4192.         ret                     ;    /
  4193. showa:  cmp     word ptr vpage,0bf00h; don't show 7
  4194.         jnz     showb           ;  /
  4195.         ret                     ; /
  4196. showb:  push    ax              ; preserve all registers
  4197.         push    bx              ;
  4198.         push    cx              ;
  4199.         push    dx              ;
  4200.         push    di              ;
  4201.         push    es              ;
  4202.         push    ds              ;
  4203.         mov     es,vpage        ; seg of screen
  4204.         mov     ax,seg dgroup    ; seg of SHO0
  4205.         mov     ds,ax           ; /
  4206.         mov     di,offset dgroup:show0 ; address of show0
  4207.         mov     bx,152          ; addr of 76,0
  4208.         mov     cx,25           ; 25 words
  4209.         mov     dh,yellow       ; color
  4210. showl:  mov     al,1[di]        ; get hi byte
  4211.         tohex                   ; convert it to hex
  4212.         mov     dl,ah           ; get hi nybble
  4213.         mov     es:[bx],dx      ; send hi nybble
  4214.         mov     dl,al           ; get low nybble
  4215.         mov     es:2[bx],dx     ; send low nybble
  4216.         mov     al,[di]         ; get low byte
  4217.         tohex                   ; convert it to hex
  4218.         mov     dl,ah           ; get hi nybble
  4219.         mov     es:4[bx],dx     ; send hi nybble
  4220.         mov     dl,al           ; get low nybble
  4221.         mov     es:6[bx],dx     ; send low nybble
  4222.         add     bx,160          ; move down
  4223.         add     di,2            ; bump index
  4224.         loop    showl           ; do 24 bytes
  4225.         pop     ds              ; restore registers
  4226.         pop     es
  4227.         pop     di
  4228.         pop     dx
  4229.         pop     cx
  4230.         pop     bx
  4231.         pop     ax
  4232.         ret
  4233. show    endp
  4234.         endif   ; end of debug routines
  4235. ;==============================================================
  4236. _TEXT   ENDS
  4237. ;==============================================================
  4238.         end _doit       ; change to END if withc
  4239.  
  4240.