home *** CD-ROM | disk | FTP | other *** search
/ Black Box 4 / BlackBox.cdr / progasm / filename.arj / FILENAME.ASM next >
Encoding:
Assembly Source File  |  1991-06-01  |  26.2 KB  |  851 lines

  1. ; FILENAME.ASM
  2. ; special version for PCPLUS
  3. ; this directory only
  4.  
  5. CODE SEGMENT PARA PUBLIC 'code'
  6.  
  7. SCREENBUFFER    EQU     OFFSET LASTBYTE
  8. FILEBUFFER      EQU     SCREENBUFFER+4000
  9. WHITE           EQU     7
  10. BRIGHT          EQU     15
  11. REVERSE         EQU     70H
  12. BREVERSE        EQU     78H
  13. RECLEN          EQU     12
  14.  
  15. PRINT   MACRO   MESSAGE
  16.                 MOV     DX,OFFSET MESSAGE
  17.                 MOV     AH,9
  18.                 INT     21H
  19.                 ENDM
  20.  
  21. ORG             100H
  22. ASSUME  DS:CODE, cs:code
  23.  
  24. BEGIN:          JMP     INIT
  25.                 DB      8,8,8,'FILENAME (c) Clockwork Software 1991 UK ',13,10,26
  26. MAINLOCATION    DW      60*2
  27. COLORSCHEME     DB      0
  28.  
  29. STRINGNAME      DB      'FILENAME='
  30. STRING          DB      13 DUP(0)
  31.  
  32. FILESPEC        DW      OFFSET STARDOT
  33. STARDOT         DB      '*.*',0,'$'
  34. TOPFILE         DW      2A00H
  35. VIDEO           DW      0B000H
  36. LOCATION        DW      160+65*2
  37. HANDLE          DW      ?
  38. CURSORLINE      DW      0       ; current file
  39. RECSTART        DW      ?
  40. LINESTART       DW      ?
  41. ;ATTRIB          DB      7+16    ; carrier
  42. ATTRIB1         DB      7+16    ; text
  43. ATTRIB2         DB      2+16    ; FRAME
  44. ATTRIB3         DB      15+4*16 ; CURSOR
  45. ATTRIB4         DB      2*16    ; help
  46. ATTRIB5         DB      14+2*16 ; help highlite
  47. ;                       TEXT    FRAME   CURSOR  HELP  HILITE
  48. COLORSCHEME1    DB      7+16,   2+16,   15+4*16,2*16, 14+2*16
  49.                 DB      7*16,   7*16,   7,      7,      15
  50.                 DB      6*16,   6*16+7, 7,      2*16, 14+2*16
  51.                 DB      7+4*16, 4*16,   4+7*16, 5*16, 15+5*16
  52.  
  53. DEEP            DW      22
  54. WIDE            EQU     14
  55. NOFILEMSG1      DB      'No matching files',0
  56. PRESSANYMSG     DB      ' Press any key ',0
  57. REDRAW          DB      4
  58. WASCURSORSIZ    DW      ?
  59. WASCURSORPOS    DW      ?
  60. BOXCHARS        DB      '╔═╗║ ║╚═╝'
  61. FILECOUNT       DW      0
  62. BADENVMSG       DB      "Could not find DOS environment - FILENAME terminated",13,10,'$'
  63. SMALLENVMSG     DB      "No room in environment - FILENAME terminated",13,10,'$'
  64. ENVSEG          DW      ?
  65. ENVSIZE         DW      ?
  66. DOUBLEZERO      DW      ?
  67. BOTTOMLOC       DW      ?
  68. F1MSG           DB      ' F1-help ',0
  69. PCPLUSMSG       DB      ' PCPlus ',0
  70. HELPMSG         DB      ' Clockwork FILENAME (c) 1991 UK ',0
  71.                 db      'A file selector for PCPlus readers -',0
  72.                 db      '  execute with:  FILENAME [filespec]',0
  73.                 db      '                    the default filespec is *.*',0
  74.                 db      'Live commands are:',0
  75.                 db      '            home end pgup pgdn move cursor',0
  76.                 db      '          Ret select filename',0
  77.                 db      '          Esc quit (without selecting)',0
  78.                 db      '          
  79.  move display',0
  80.                 db      '          Colour change',0
  81.                 db      '          Save colour and position as defaults.',0
  82.                 db      ' ',0
  83.                 db      'The program creates an environment string from',0
  84.                 db      '  the selected filename as    FILENAME=xxxxxx',0
  85.                 db      ' ',0
  86.                 db      'Examine environment strings with the SET command.',0
  87.                 db      ' ',0
  88.                 db      'Use filename string in batch files between % %s.',0
  89.                 db      '  e.g. ECHO file selected is %FILENAME%',0
  90.                 db      '    or DEL %FILENAME%',0
  91.                 db      ' ',0
  92.                 db      "This is a cutdown version of Clockwork's CDIR.",0
  93.                 db      '      Why not ask for a software catalogue ?',0
  94.                 db      ' CLOCKWORK SOFTWARE, Bidbury House, HAVANT, PO9 3JG',0
  95.                 db      '═══════ tel 0705-483217 ══ fax 0705-454233 ',0,0
  96.  
  97.  
  98.  
  99.  
  100.  
  101. INIT:           MOV     AX,CS
  102.                 MOV     DX,AX           ; remember this segment
  103.                 CALL    SETCOLOR
  104.  
  105.                 CALL    GETENV
  106.                 JNC     INIT5
  107.                 PRINT   BADENVMSG
  108.                 JMP     BADEXIT
  109.  
  110. INIT5:          MOV     AH,0FH
  111.                 INT     10H
  112.                 CMP     AL,7
  113.                 JZ      INIT10
  114.                 MOV     VIDEO,0B800H
  115.  
  116. INIT10:         CALL    SAVESCREEN
  117.  
  118.                 mov     si,80h                  ; start at command tail
  119. GETFILESPEC:    INC     SI
  120.                 CMP     BYTE PTR [SI],' '
  121.                 Jb      NOTAIL
  122.                 JZ      GETFILESPEC
  123.                 MOV     FILESPEC,SI
  124. GETFILESPEC10:  LODSB
  125.                 CMP     AL,' '
  126.                 JA      GETFILESPEC10
  127.                 MOV     WORD PTR[SI-1],256*'$'
  128.  
  129. NOTAIL:         CALL    GATHER
  130.  
  131. BADEXIT:        MOV     BP,4C01H
  132.                 JMP     SHORT EXIT
  133. GOODEXIT:       MOV     BP,4C00H
  134. EXIT:           CALL    REPLACESCREEN
  135.                 CALL    REPLACECURSOR
  136.                 MOV     AX,BP
  137.                 INT     21H
  138.  
  139. ; -----------------------------------------------
  140. CAPITALISEAL:   CMP     AL,'a'
  141.                 JB      CAPITALISE20
  142.                 CMP     AL,'z'
  143.                 JA      CAPITALISE20
  144.                 AND     AL,11011111B
  145. CAPITALISE20:   RET
  146.  
  147. ;------------------------------------------------------------
  148. ; FROM DIRECTORY
  149. ; filespec
  150. ;------------------------------------------------------------
  151. GATHER:         MOV     REDRAW,5
  152.                 MOV     AX,CS
  153.                 MOV     ES,AX
  154.                 MOV     DS,AX
  155.  
  156.                 MOV     AH,1AH          ; set the DTA area
  157.                 MOV     DX,80H
  158.                 INT     21H
  159.  
  160.                 CLD
  161.                 MOV     FILECOUNT,0
  162.  
  163.                 MOV     DX,FILESPEC
  164.                 MOV     AH,4EH          ; search first match
  165.                 MOV     CX,6;ATTRIBMASK   ; attribute
  166.                 INT     21H
  167.                 JC      GATHER30
  168.                 CALL    GETREST
  169.  
  170. GATHER30:       CMP     FILECOUNT,1
  171.                 Jb      GATHER40
  172.                 Ja      SORT              ; only one
  173.                 MOV     TOPFILE,0
  174.                 JMP     CR
  175.  
  176. GATHER40:       MOV     DI,MAINLOCATION
  177.                 CMP     DI,58*2
  178.                 JBE     GATHER45
  179.                 MOV     DI,58*2
  180.  
  181. GATHER45:       mov     AH,ATTRIB1
  182.                 MOV     CX,19+256
  183.                 PUSH    DI
  184.                 call    BOX
  185.                 POP     DI
  186.                 ADD     DI,164
  187.                 MOV     SI,OFFSET NOFILEMSG1
  188.                 CALL    COLORPRINT80
  189.                 MOV     SI,OFFSET PRESSANYMSG
  190.                 ADD     DI,160-16*2
  191.                 CALL    COLORPRINT80
  192.                 CALL    PIP
  193.                 call    GETCAPS
  194.                 JMP     BADEXIT
  195.  
  196. ;════════════════════════════════════════════════════════
  197.  
  198. ; SORT INTO ORDER
  199. ; FILECOUNT PASSES
  200. SORT:           MOV     AX,FILECOUNT
  201.                 DEC     AX
  202.                 MOV     CURSORLINE,AX           ; used as a counter
  203. SORT20:         MOV     BX,FILECOUNT
  204.                 DEC     BX
  205.  
  206. SORT30:         MOV     SI,FILEBUFFER           ; compare and swap
  207.                 MOV     AX,RECLEN               ; set up pointers
  208.                 MUL     BL
  209.                 ADD     SI,AX                   ; this name
  210.                 MOV     DI,SI
  211.                 SUB     DI,RECLEN
  212.                 PUSH    SI                      ; remember
  213.                 PUSH    DI
  214.  
  215.                 MOV     CX,RECLEN
  216. SORT40:         MOV     AL,[SI]
  217.                 CMP     AL,[DI]
  218.                 JB      SORT70           ; SWAP
  219.                 JA      SORT50           ; OK
  220.                 INC     SI
  221.                 INC     DI
  222.                 LOOP    SORT40
  223.  
  224. SORT50:         POP     SI              ; OK
  225.                 POP     DI
  226. SORT60:         DEC     BL
  227.                 JNZ     SORT30
  228.                 DEC     CURSORLINE
  229.                 JNZ     SORT20
  230.                 JMP     SELECTER
  231.  
  232. SORT70:         POP     SI               ; exchange
  233.                 POP     DI
  234.                 MOV     CX,RECLEN
  235. SORT80:         MOV     AL,[SI]
  236.                 XCHG    AL,[DI]
  237.                 XCHG    AL,[SI]
  238.                 INC     SI
  239.                 INC     DI
  240.                 LOOP    SORT80
  241.                 JMP     SORT60
  242.  
  243. ;════════════════════════════════════════════════════════
  244. ; no more files, so display them
  245. ; have MAINLOCATION, FILECOUNT, DEEP
  246. SELECTER:       MOV     CURSORLINE,0       ; absolute
  247.                 MOV     TOPFILE,0
  248. SELECTER2:      MOV     CX,23
  249.                 CMP     CX,FILECOUNT
  250.                 JB      SELECTER3
  251.                 MOV     CX,FILECOUNT
  252. SELECTER3:      MOV     DEEP,CX
  253.                 MOV     CH,CL
  254.  
  255. SELECTER5:      CMP     REDRAW,4
  256.                 JB      SELECTER6
  257.                 MOV     AH,ATTRIB2      ; redraw box etc
  258.                 MOV     DI,MAINLOCATION
  259.                 MOV     CX,DEEP
  260.                 MOV     CH,CL
  261.                 MOV     CL,WIDE
  262.                 CALL    BOX
  263.                 SUB     DI,160-6
  264.                 MOV     SI,OFFSET F1MSG
  265.                 CALL    COLORPRINT80
  266.                 MOV     DI,MAINLOCATION
  267.                 ADD     DI,2*4
  268.                 MOV     SI,OFFSET PCPLUSMSG
  269.                 CALL    COLORPRINT80
  270.  
  271. ; redraw box with new TOPFILE
  272.  
  273. selecter6:      MOV     ES,VIDEO
  274.                 MOV     BP,DEEP                 ; max display lines
  275.                 CMP     FILECOUNT,BP
  276.                 JA      SELECTER7
  277.                 MOV     BP,FILECOUNT
  278.  
  279. SELECTER7:      CMP     REDRAW,2
  280.                 JB      SELECTER20
  281.                 MOV     REDRAW,0
  282.                 MOV     AX,TOPFILE              ; redraw
  283.                 MOV     CX,RECLEN
  284.                 MUL     CL
  285.                 ADD     AX,FILEBUFFER
  286.                 MOV     RECSTART,AX
  287.                 MOV     DI,MAINLOCATION
  288.                 ADD     DI,160+2*2
  289.                 MOV     LINESTART,DI
  290. SELECTER10:     CALL    DRAWLINE
  291.  
  292.                 ADD     LINESTART,160
  293.                 ADD     RECSTART,RECLEN
  294.                 DEC     BP
  295.                 JNZ     SELECTER10
  296.  
  297. SELECTER20:     PUSH    MAINLOCATION
  298.                 POP     LOCATION
  299.                 CALL    CURSOR
  300.  
  301.  
  302. SELECTER45:     CALL    GETCAPS
  303.  
  304.                 PUSH    CS
  305.                 POP     ES
  306.                 MOV     DI,OFFSET OPTIONS
  307.                 MOV     AL,AH
  308.                 MOV     CX,MAXOPTIONS
  309.                 REPNZ   SCASB
  310.                 JCXZ    SELECTER45      ; nothing
  311.                 MOV     BX,DI
  312.                 SUB     BX,OFFSET OPTIONS
  313.                 DEC     BX
  314.                 ADD     BX,BX
  315.                 CALL    DESTINATIONS [BX]
  316.                 JMP     SELECTER5
  317.  
  318. ;════════════════════════════════════════════════════════
  319. PIP:            MOV     AX,0E07H
  320.                 INT     10H
  321.                 RET
  322. ;════════════════════════════════════════════════════════
  323. ; store record, and read remainder
  324. GETREST:        MOV     AX,CS
  325.                 MOV     ES,AX
  326.                 MOV     DS,AX
  327.  
  328.                 MOV     AX,FILECOUNT
  329.                 MOV     CX,RECLEN
  330.                 MUL     CX
  331.                 MOV     DI,FILEBUFFER
  332.                 ADD     DI,AX
  333.  
  334.                 PUSH    DI              ; clean record
  335.                 MOV     CX,RECLEN
  336.                 MOV     AL,0
  337.                 REP     STOSB
  338.                 POP     DI
  339.  
  340.                 MOV     SI,80H + 30       ; store details from DTA
  341.                 MOV     CX,RECLEN
  342. GETREST10:      REP     MOVSB
  343.  
  344. GETREST20:      INC     FILECOUNT
  345.                 MOV     AH,4FH          ; search next
  346.                 INT     21H
  347.                 JNC     GETREST
  348.                 RET
  349.  
  350.                     ;  CR  ESC  UP  DOWN  PGUP  PGDN  HOME  END  F1  C  S left right
  351. OPTIONS         DB     28, 1,  72,  80,   73,   81,   71,   79,  59, 46,31,75,77,79
  352. MAXOPTIONS      EQU $-OFFSET OPTIONS
  353.  
  354. DESTINATIONS    DW      OFFSET CR
  355.                 DW      OFFSET BADEXIT
  356.                 DW      OFFSET UP
  357.                 DW      OFFSET DOWN
  358.                 DW      OFFSET PGUP
  359.                 DW      OFFSET PGDN
  360.                 DW      OFFSET HOME
  361.                 DW      OFFSET ENDER
  362.                 DW      OFFSET F1
  363.                 DW      OFFSET COLOR
  364.                 DW      OFFSET SAVE
  365.                 DW      OFFSET left
  366.                 DW      OFFSET right
  367.  
  368. ;════════════════════════════════════════════════════════
  369. UP:             CMP     CURSORLINE,0              ; if at top already
  370.                 JZ      UP20           ; nothing
  371.                 DEC     CURSORLINE     ; otherwise go up
  372. UPZ:            RET
  373.  
  374. UP20:           CMP     TOPFILE,0
  375.                 JZ      UPZ
  376.                 DEC     TOPFILE
  377.                 MOV     REDRAW,2
  378.                 RET
  379.  
  380. ;════════════════════════════════════════════════════════
  381. DOWN:           INC     CURSORLINE
  382.                 MOV     AX,CURSORLINE
  383.                 CMP     AX,DEEP
  384.                 JZ      DOWN10
  385. DOWNZ:          RET
  386.  
  387. DOWN10:         DEC     CURSORLINE
  388.                 ADD     AX,TOPFILE
  389.                 CMP     AX,FILECOUNT
  390.                 JZ      DOWNZ
  391.                 INC     TOPFILE
  392.                 MOV     REDRAW,2
  393.                 RET
  394.  
  395. ;════════════════════════════════════════════════════════
  396. PGUP:           MOV     CX,deep
  397. PGUP10:         CALL    UP
  398.                 LOOP    PGUP10
  399.                 RET
  400.  
  401. ;════════════════════════════════════════════════════════
  402. PGDN:           MOV     CX,DEEP
  403. PGDN10:         CALL    DOWN
  404.                 LOOP    PGDN10
  405.                 RET
  406.  
  407. ;════════════════════════════════════════════════════════
  408. HOME:           MOV     CURSORLINE,0
  409.                 MOV     TOPFILE,0
  410.                 MOV     REDRAW,4
  411. HOMEZ:          RET
  412.  
  413. ;════════════════════════════════════════════════════════
  414. ENDER:          MOV     CX,FILECOUNT
  415.                 JMP     PGDN10
  416.  
  417. ;════════════════════════════════════════════════════════
  418. LEFT:           CMP     MAINLOCATION,0
  419.                 JZ      HOMEZ
  420.                 SUB     MAINLOCATION,2
  421.                 JMP     SHORT F1Z
  422.  
  423. RIGHT:          CMP     MAINLOCATION,160-32
  424.                 JAE     HOMEZ
  425.                 ADD     MAINLOCATION,2
  426.                 JMP     SHORT F1Z
  427.  
  428. COLOR:          INC     COLORSCHEME
  429.                 AND     COLORSCHEME,3
  430. SETCOLOR:       MOV     CL,COLORSCHEME
  431.                 MOV     AX,5
  432.                 MUL     CL
  433.                 ADD     AX,OFFSET COLORSCHEME1
  434.                 MOV     SI,AX
  435.                 MOV     DI,OFFSET ATTRIB1
  436.                 MOV     CX,5
  437.                 PUSH    CS
  438.                 POP     ES
  439.                 REP     MOVSB
  440.                 MOV     REDRAW,4
  441.                 RET
  442.  
  443. ;════════════════════════════════════════════════════════
  444. F1:             XOR     DI,DI
  445.                 MOV     CX,55+23*256
  446.                 mov     ah,attrib4
  447.                 CALL    BOX
  448.                 MOV     DI,12*2
  449.                 MOV     SI,OFFSET HELPMSG
  450.                 CALL    colorprint80
  451.                 mov     di,164
  452.                 CALL    BLOCKPRINT
  453.                 CALL    GETKEYPRESS
  454.                 CMP     AH,46
  455.                 JNZ     F1Z
  456.                 CALL    COLOR
  457.                 JMP     F1
  458.  
  459. F1Z:            CALL    REPLACESCREEN
  460.                 MOV     REDRAW,4
  461.                 JMP     SELECTER5
  462.  
  463. ;════════════════════════════════════════════════════════
  464. SAVE:           MOV     ES,CS:[2CH]
  465.                 XOR     DI,DI
  466.                 MOV     AL,0
  467.                 MOV     CX,5000
  468. SAVE10:         REPNZ   SCASB
  469.                 CMP     AL,ES:[DI]
  470.                 JNZ     SAVE10
  471.                 ADD     DI,3
  472.                 MOV     DX,DI
  473.                 PUSH    ES
  474.                 POP     DS
  475.                 MOV     AX,3D01H        ; write access
  476.                 INT     21H
  477.                 PUSH    CS
  478.                 POP     DS
  479.                 JC      SAVEFAIL
  480.                 MOV     HANDLE,AX
  481.                 MOV     BX,AX
  482.                 MOV     AH,40H
  483.                 MOV     DX,100H
  484.                 MOV     CX,OFFSET COLORSCHEME-100H+1
  485.                 INT     21H
  486.                 MOV     BX,HANDLE
  487.                 MOV     AH,3EH
  488.                 INT     21H
  489.                 RET
  490.  
  491. SAVEFAIL:       MOV     AX,0E07H
  492.                 INT     10H
  493.                 RET
  494.  
  495. ;════════════════════════════════════════════════════════
  496. CR:             MOV     AX,TOPFILE
  497.                 ADD     AX,CURSORLINE
  498.                 MOV     CX,RECLEN
  499.                 MUL     CX
  500.                 ADD     AX,FILEBUFFER
  501.                 MOV     SI,AX
  502.                 MOV     DI,OFFSET STRING
  503.                 MOV     CX,12
  504.                 PUSH    CS
  505.                 POP     ES
  506.                 REP     MOVSB
  507. ; ═══════════════════════════════════════════════════════
  508. ; Look for name in environment
  509. ;
  510. ; ═══════════════════════════════════════════════════════
  511. FINDINENV:      MOV     ES,ENVSEG
  512.                 XOR     DI,DI
  513.                 MOV     AL,0
  514.                 MOV     CX,ENVSIZE
  515.                 CLD
  516.  
  517. FINDENVLEN10:   REPNZ   SCASB           ; find last point in environment
  518.                 JCXZ    FINDENVLEN12    ; error situation, but carry on
  519.                 CMP     ES:[DI],AL      ; 2nd zero
  520.                 JNZ     FINDENVLEN10
  521. FINDENVLEN12:   MOV     DOUBLEZERO,DI
  522.  
  523.                 MOV     CX,DI
  524.                 MOV     SI,OFFSET STRINGNAME
  525.                 MOV     DI,0            ; front of environment
  526.  
  527. FINDINENV20:    MOV     BX,0
  528.  
  529. FINDINENV30:    MOV     AL,[SI+BX]      ; can we agree the whole name?
  530.                 CMP     AL,ES:[DI+BX]
  531.                 JNZ     FINDINENV40       ; fail so try again
  532.                 CMP     AL,'='            ; success
  533.                 JZ      FINDINENV50
  534.                 INC     BX
  535.                 JMP     FINDINENV30
  536.  
  537. FINDINENV40:    MOV     AL,0
  538.                 REPNZ   SCASB
  539.                 JZ      FINDINENV20
  540.                 JMP     FINDINENVZ      ; hit double zero
  541.  
  542. FINDINENV50:    PUSH    DI              ; start of string
  543.                 MOV     AL,0
  544.                 REPNZ   SCASB
  545.                 MOV     SI,DI
  546.                 POP     DI
  547.                 MOV     CX,ENVSIZE
  548.                 SUB     CX,SI
  549.                 PUSH    ES
  550.                 POP     DS
  551.                 REP     MOVSB           ; stripout
  552.                 PUSH    CS
  553.                 POP     DS
  554.                 ADD     DOUBLEZERO,DI
  555.                 SUB     DOUBLEZERO,SI
  556.  
  557. FINDINENVZ:     PUSH    CS
  558.                 POP     DS
  559.  
  560. ASSIGNENV:      MOV     DI,DOUBLEZERO
  561.                 MOV     CX,ENVSIZE
  562.                 SUB     CX,DI           ; CX has spare
  563.                 CMP     CX,18
  564.                 JAE     ASSIGNENV5
  565.                 MOV     DX,OFFSET SMALLENVMSG
  566.                 MOV     AH,9
  567.                 INT     21H
  568.                 CALL    PIP
  569.                 CALL    GETCAPS
  570.                 JMP     BADEXIT
  571.  
  572. ASSIGNENV5:     MOV     SI,OFFSET STRINGNAME
  573.                 MOV     DI,DOUBLEZERO
  574.  
  575. ASSIGNENV10:    LODSB
  576.                 STOSB
  577.                 CMP     AL,0
  578.                 JNZ     ASSIGNENV10
  579.                 STOSB
  580.  
  581.                 JMP     GOODEXIT
  582.  
  583.  
  584. ;════════════════════════════════════════════════════════
  585. ; draw individual line using LINESTART and RECSTART
  586.  
  587. DRAWLINE:       MOV     DI,LINESTART            ; blank out line
  588.                 MOV     CX,12
  589.                 MOV     AH,ATTRIB1
  590.                 MOV     AL,' '
  591.                 REP     STOSW
  592.  
  593.                 MOV     CX,8                    ; filename
  594.                 MOV     DI,LINESTART
  595.                 MOV     SI,RECSTART
  596. DRAWLINE10:     LODSB                           ; copy up to dot
  597.                 CMP     AL,' '
  598.                 JB      DRAWLINE50
  599.                 CMP     AL,'.'
  600.                 JZ      DRAWLINE20
  601.                 STOSW
  602.                 LOOP    DRAWLINE10
  603.                 LODSB                           ; skip dot
  604. DRAWLINE20:     JCXZ    DRAWLINE30
  605.                 MOV     AL,' '
  606.                 REP     STOSW
  607.  
  608. DRAWLINE30:     MOV     AL,'.'
  609.                 STOSW
  610.                 MOV     CX,3
  611. DRAWLINE40:     LODSB
  612.                 CMP     AL,' '
  613.                 JB      DRAWLINE50
  614.                 STOSW
  615.                 LOOP    DRAWLINE40
  616. DRAWLINE50:     RET
  617. ;════════════════════════════════════════════════════
  618. CURSOR:         mov     ES,VIDEO
  619.                 MOV     BX,0
  620.                 MOV     DI,LOCATION
  621.                 ADD     DI,162
  622.  
  623. CURSOR10:       MOV     CX,WIDE
  624.                 PUSH    DI
  625.                 MOV     AH,ATTRIB1
  626.                 CMP     BX,CURSORLINE
  627.                 JNZ     CURSOR20
  628.                 MOV     AH,ATTRIB3
  629.  
  630. CURSOR20:       MOV     ES:[DI+1],AH
  631.                 ADD     DI,2
  632.                 LOOP    CURSOR20
  633.                 POP     DI
  634.                 ADD     DI,160
  635.                 INC     BX
  636.                 CMP     BX,DEEP
  637.                 JB      CURSOR10
  638.                 RET
  639. ;════════════════════════════════════════════════════
  640. ; COLOURPRINT   needs SI, ES:DI , terminates at CX=0, OR $
  641. ; ------------------------------------------------------------
  642.  
  643. COLORPRINT80:   MOV     CX,80
  644.                 MOV     ES,CS:VIDEO
  645.  
  646. COLORPRINT20:   LODSB
  647.                 CMP     AL,0
  648.                 JZ      COLORPRINT30
  649.                 CMP     AL,5
  650.                 JA      COLORPRINT28
  651.                 MOV     AH,CS:ATTRIB5
  652.                 JZ      COLORPRINT20
  653.                 MOV     AH,CS:ATTRIB4
  654.                 CMP     AL,3
  655.                 JA      COLORPRINT20
  656.                 MOV     AH,CS:ATTRIB3
  657.                 JZ      COLORPRINT20
  658.                 MOV     AH,CS:ATTRIB2
  659.                 CMP     AL,1
  660.                 JA      COLORPRINT20
  661.                 MOV     AH,CS:ATTRIB1
  662.                 JMP     COLORPRINT20
  663. COLORPRINT28:   STOSW
  664.                 LOOP    COLORPRINT20
  665. COLORPRINT30:   RET
  666. ; ═══════════════════════════════════════════════════════
  667. BLOCKPRINT:     PUSH    DI
  668.                 CALL    COLORPRINT80
  669.                 POP     DI
  670.                 ADD     DI,160
  671.                 CMP     BYTE PTR[SI],0
  672.                 JNZ     BLOCKPRINT
  673.                 RET
  674.  
  675.  
  676. ; =============================================
  677. GETCAPS:        CALL    GETKEYPRESS
  678.                 JMP     CAPITALISEAL
  679.  
  680. GETKEYPRESS:    MOV     AH,0
  681.                 INT     16H
  682.                 RET
  683. ; ═══════════════════════════════════════════════════════
  684. ; ═══════════════════════════════════════════════════════
  685.  
  686. BOX:            MOV     SI,OFFSET BOXCHARS
  687.                 MOV     ES,VIDEO
  688.                 MOV     BL,CH
  689.                 MOV     CH,0
  690.                 CALL    BOXLINE
  691.                 ADD     SI,3
  692. BOX10:          CALL    BOXLINE
  693.                 DEC     BL
  694.                 JNZ     BOX10
  695.                 ADD     SI,3
  696.                 CALL    BOXLINE
  697.                 RET
  698. ; ================================
  699. BOXLINE:        PUSH    SI
  700.                 PUSH    DI
  701.                 LODSB
  702.                 STOSW
  703.                 LODSB
  704.                 PUSH    CX
  705.                 REP     STOSW
  706.                 POP     CX
  707.                 LODSB
  708.                 STOSW
  709.                 POP     DI
  710.                 ADD     DI,160
  711.                 POP     SI
  712.                 RET
  713. ; ================================
  714. SAVESCREEN:     MOV     DI,SCREENBUFFER
  715.                 XOR     SI,SI
  716.                 MOV     CX,2000
  717.                 PUSH    CS
  718.                 POP     ES
  719.                 MOV     DS,CS:VIDEO
  720.                 REP     MOVSW
  721.                 PUSH    CS
  722.                 POP     DS
  723.  
  724.                 MOV     AH,3            ; get cursor
  725.                 XOR     BX,BX
  726.                 INT     10H
  727.  
  728.                 MOV     WASCURSORSIZ,CX
  729.                 MOV     WASCURSORPOS,DX
  730.  
  731.                 MOV     AH,1            ; hide cursor
  732.                 MOV     CH,20H
  733.                 INT     10H
  734.                 RET
  735.  
  736. ; ═══════════════════════════════════════════════════════
  737. REPLACESCREEN:  MOV     SI,SCREENBUFFER
  738.                 XOR     DI,DI
  739.                 MOV     CX,2000
  740.                 MOV     ES,VIDEO
  741.                 REP     MOVSW
  742.                 RET
  743.  
  744. REPLACECURSOR:  MOV     AH,1            ; set cursor
  745.                 MOV     CX,WASCURSORSIZ
  746.                 INT     10H
  747.  
  748.                 MOV     AH,2
  749.                 MOV     DX,WASCURSORPOS
  750.                 INT     10H
  751.                 RET
  752.  
  753.  
  754.  
  755. ; ═══════════════════════════════════════════════════════
  756. ; find the environment (all types and versions - I hope - catered for!)
  757. getenv:
  758.         mov     dx,cs
  759.         mov     cx,10
  760. getenv10:
  761.         mov     es,dx
  762.         cmp     dx,0A000h
  763.         ja      getenv15
  764.         cmp     dx,es:16h
  765.         mov     dx,es:16h
  766.         loopnz  getenv10
  767.         jcxz    getenvf
  768. getenv15:
  769.         mov     di,dx
  770.         mov     bx,es:[2Ch]
  771.         cmp     bx,0
  772.         jz      getenv20
  773.         mov     ah,30h
  774.         push    bx
  775.         int     21h
  776.         pop     bx
  777.         cmp     ax,0A03h
  778.         jz      getenv14
  779.         call    trydrdos
  780.         jc      getenv20
  781. getenv14:
  782.         mov     dx,bx
  783.         dec     dx
  784.         jmp     short getenv40
  785. getenv20:
  786.         dec     dx
  787.         mov     es,dx
  788. getenv30:
  789.         add     dx,es:[3]
  790.         inc     dx
  791.         mov     bx,cs
  792.         cmp     dx,bx
  793.         ja      getenvf
  794. getenv40:
  795.         mov     es,dx
  796.         cmp     di,es:[1]
  797.         jnz     getenv30
  798.         cmp     byte ptr es:[16],20h
  799.         jb      getenv30
  800.         mov     cx,es:[3]
  801.         inc     dx
  802.         mov     envseg,dx
  803.         mov     ax,16
  804.         mul     cx
  805.         mov     envsize,ax
  806.         clc
  807.         ret
  808. getenvf:
  809.         stc
  810.         ret
  811. drdosmsg        db      'OS=DR'
  812. trydrdos:
  813.         push    bx
  814.         push    dx
  815.         push    di
  816.         mov     es,cs:[2ch]
  817.         mov     si,offset drdosmsg
  818.         xor     di,di
  819.         mov     cx,2000
  820. trydrdos10:
  821.         xor     bx,bx
  822. trydrdos20:
  823.         mov     al,[si+bx]
  824.         cmp     al,es:[di+bx]
  825.         jnz     trydrdos30
  826.         inc     bx
  827.         cmp     bx,5
  828.         jb      trydrdos20
  829.         clc
  830. trydrdos25:
  831.         pop     di
  832.         pop     dx
  833.         pop     bx
  834.         ret
  835. trydrdos30:
  836.         xor     ax,ax
  837.         repnz   scasb
  838.         cmp     al,es:[di]
  839.         jnz     trydrdos10
  840.         stc
  841.         jmp     trydrdos25
  842.  
  843.  
  844. ; ═══════════════════════════════════════════════════════
  845.  
  846. LASTBYTE:
  847.  
  848. CODE            ENDS
  849.  
  850.                 END     BEGIN
  851.