Advertisement
KenzoMe92

INIT.ASM

Jul 1st, 2016
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. TITLE   COMMAND Initialization
  2.  
  3.         INCLUDE COMSW.ASM
  4.  
  5. .xlist
  6. .xcref
  7.         INCLUDE DOSSYM.ASM
  8.         INCLUDE DEVSYM.ASM
  9.         INCLUDE COMSEG.ASM
  10. .list
  11. .cref
  12.  
  13.         INCLUDE COMEQU.ASM
  14.  
  15. ENVIRONSIZ EQU  0A0H            ;Must agree with values in EVIRONMENT segment
  16. ENVIRONSIZ2 EQU 092H
  17.  
  18. CODERES SEGMENT PUBLIC
  19.         EXTRN   RSTACK:WORD,SETVECT:NEAR,LODCOM:NEAR,CONTC:NEAR,INT_2E:NEAR
  20.         EXTRN   LOADCOM:NEAR,CHKSUM:NEAR
  21.  
  22.         IF      IBMVER
  23.         EXTRN   EXECHK:NEAR,SYSCALL:NEAR
  24.         ENDIF
  25.  
  26. CODERES ENDS
  27.  
  28. DATARES SEGMENT PUBLIC
  29.         EXTRN   DATARESEND:BYTE,LTPA:WORD,MYSEG:WORD,MYSEG1:WORD,MYSEG2:WORD
  30.         EXTRN   MEMSIZ:WORD,TRNSEG:WORD,ENVIRSEG:WORD,RSWITCHAR:BYTE
  31.         EXTRN   COMDRV:BYTE,COMLET:BYTE,PERMCOM:BYTE,SINGLECOM:WORD
  32.         EXTRN   PARENT:WORD,IO_SAVE:WORD,COM_PTR:DWORD,COM_FCB1:DWORD
  33.         EXTRN   COM_FCB2:DWORD,SUM:WORD,BATCH:WORD,COMSPEC:BYTE
  34.  
  35.         IF      IBMVER
  36.         EXTRN   SYS_CALL:DWORD,EXESEG:WORD,EXESUM:WORD
  37.         ENDIF
  38.  
  39. DATARES ENDS
  40.  
  41. ENVIRONMENT SEGMENT PUBLIC
  42.         EXTRN   ENVIREND:BYTE,PATHSTRING:BYTE,ECOMSPEC:BYTE
  43. ENVIRONMENT ENDS
  44.  
  45. TRANCODE        SEGMENT PUBLIC
  46.         EXTRN   DATINIT:FAR
  47. TRANCODE        ENDS
  48.  
  49. TRANSPACE       SEGMENT PUBLIC
  50.         EXTRN   TRANSPACEEND:BYTE
  51. TRANSPACE       ENDS
  52.  
  53. ZEXEC_DATA      SEGMENT PUBLIC
  54.         IF      IBM
  55.         EXTRN   ZEXECDATAEND:BYTE
  56.         ENDIF
  57. ZEXEC_DATA      ENDS
  58.  
  59. ; *******************************************************************
  60. ; START OF INIT PORTION
  61. ; This code is overlayed the first time the TPA is used.
  62.  
  63. INIT    SEGMENT PUBLIC PARA
  64.  
  65.         EXTRN   HEADER:BYTE
  66.         EXTRN   BADCOMLKMES:BYTE
  67.  
  68.         PUBLIC  CONPROC
  69.  
  70. ASSUME  CS:RESGROUP,DS:RESGROUP,ES:RESGROUP,SS:RESGROUP
  71.  
  72.         ORG     0
  73. ZERO    =       $
  74.  
  75. CONPROC:
  76.         MOV     SP,OFFSET RESGROUP:RSTACK
  77.  
  78.         IF      HIGHMEM
  79.         MOV     BX,WORD PTR DS:[PDB_block_len]
  80.         MOV     AX,OFFSET RESGROUP:ENVIREND + 15
  81.         MOV     CL,4
  82.         SHR     AX,CL
  83.         PUSH    AX                         ; Save size to alloc
  84.         INC     AX                         ; Plus one for arena
  85.         SUB     BX,AX                      ; Subtract size of resident
  86.         MOV     WORD PTR DS:[PDB_block_len],BX
  87.         MOV     AX,CS
  88.         SUB     BX,AX
  89.         MOV     AH,SETBLOCK
  90.         INT     21H
  91.         POP     BX                          ; Get back size to alloc
  92.         MOV     AH,ALLOC
  93.         INT     21H
  94.         MOV     [REALRES],AX
  95.         MOV     ES,AX
  96.         XOR     SI,SI
  97.         MOV     DI,SI
  98.         MOV     CX,OFFSET RESGROUP:ENVIREND
  99.         SHR     CX,1          ; Length of resident and environment in words
  100.                               ; Last byte doesn't matter
  101.         REP     MOVSW                   ; Move to end of memory
  102.         MOV     DS,AX
  103.         MOV     BX,AX
  104.         MOV     AH,SET_CURRENT_PDB
  105.         INT     21H
  106.         MOV     AX,BX
  107.         MOV     BX,OFFSET RESGROUP:DATARESEND + 15
  108.         MOV     CL,4
  109.         SHR     BX,CL           ; BX is size for SETBLOCK
  110.         MOV     WORD PTR DS:[PDB_block_len],BX
  111.         ADD     WORD PTR DS:[PDB_block_len],AX
  112.         MOV     [LTPA],CS
  113.         MOV     AH,SETBLOCK
  114.         INT     21H             ;Shrink to not include environment
  115.         MOV     BX,(ENVIRONSIZ + 15) / 16
  116.         MOV     AH,ALLOC
  117.         INT     21H             ;Allocate the environment
  118.         MOV     [ENVIRSEG],AX
  119.         MOV     CS:[ENVIRSEGSAV],AX
  120.         MOV     ES,AX
  121. ASSUME  ES:ENVIRONMENT
  122.         XOR     DI,DI
  123.         MOV     SI,OFFSET RESGROUP:PATHSTRING
  124.         MOV     CX,ENVIRONSIZ
  125.         REP     MOVSB
  126.         MOV     AX,WORD PTR CS:[PDB_block_len]
  127.         ENDIF
  128.  
  129.         IF      NOT HIGHMEM
  130.         MOV     AX,OFFSET RESGROUP:ENVIREND + 15
  131.         MOV     CL,4
  132.         SHR     AX,CL
  133.         MOV     CX,CS
  134.         ADD     AX,CX                         ; Compute segment of TPA
  135.         MOV     [LTPA],AX                     ; Good enough for the moment
  136.         MOV     AX,WORD PTR DS:[PDB_block_len]
  137.         ENDIF
  138.  
  139.         MOV     [MYSEG1],DS
  140.         MOV     [MYSEG2],DS
  141.         MOV     [MYSEG],DS
  142.         MOV     [MEMSIZ],AX
  143.  
  144.         MOV     DX,OFFSET TRANGROUP:TRANSPACEEND + 15
  145.         MOV     CL,4
  146.         SHR     DX,CL
  147.  
  148.         IF      IBM
  149.         PUSH    DX
  150.         MOV     DX,OFFSET EGROUP:ZEXECDATAEND + 15
  151.         MOV     CL,4
  152.         SHR     DX,CL
  153.         POP     CX
  154.         ADD     DX,CX
  155.         ENDIF
  156.  
  157.         SUB     AX,DX
  158.         MOV     [TRNSEG],AX                     ; Read it in here
  159.         MOV     AX,DS:[PDB_environ]
  160.         OR      AX,AX
  161.         JZ      BUILDENV                        ; Need to make an environment
  162.  
  163.         IF      HIGHMEM
  164.         INC     BYTE PTR CS:[CHUCKENV]          ; Flag no ENVIRONSEG
  165.         ELSE
  166.         INC     BYTE PTR [CHUCKENV]             ; Flag no ENVIRONSEG
  167.         ENDIF
  168.  
  169.         JMP     SHORT ENVIRONPASSED
  170.  
  171. BUILDENV:
  172.  
  173.         IF      NOT HIGHMEM
  174.         MOV     AX,OFFSET RESGROUP:PATHSTRING   ; Figure environment pointer
  175.         MOV     CL,4
  176.         SHR     AX,CL
  177.         MOV     DX,DS
  178.         ADD     AX,DX
  179.         ELSE
  180.         JMP     SHORT GOTTHEENVIR
  181.         ENDIF
  182.  
  183. ENVIRONPASSED:
  184.         MOV     [ENVIRSEG],AX
  185.  
  186.         IF      HIGHMEM
  187.         DEC     AX
  188.         MOV     ES,AX
  189.         INC     AX
  190.         MOV     ES:[arena_owner],DS             ; Adjust owner of passed envir
  191.         ENDIF
  192.  
  193.         MOV     ES,AX
  194. ASSUME  ES:ENVIRONMENT
  195.  
  196. GOTTHEENVIR:
  197.         MOV     AX,CHAR_OPER SHL 8
  198.         INT     int_command
  199.         MOV     [RSWITCHAR],DL
  200.  
  201.         CMP     DL,'/'
  202.         JNZ     IUSESLASH
  203.  
  204.         IF      HIGHMEM
  205.         MOV     CS:[COMSPECT],'\'
  206.         ELSE
  207.         MOV     [COMSPECT],'\'
  208.         ENDIF
  209.  
  210.         IF      HIGHMEM
  211.         CMP     BYTE PTR CS:[CHUCKENV],0
  212.         ELSE
  213.         CMP     BYTE PTR [CHUCKENV],0
  214.         ENDIF
  215.  
  216.         JNZ     IUSESLASH
  217.  
  218.         MOV     ES:[ECOMSPEC-10H],'\'
  219. IUSESLASH:
  220.  
  221. IF IBMVER
  222.         PUSH    ES
  223.         MOV     AX,(Get_interrupt_vector SHL 8) + int_command
  224.         INT     int_command
  225.         MOV     WORD PTR [SYS_CALL],BX
  226.         MOV     WORD PTR [SYS_CALL+2],ES
  227.         MOV     DX,OFFSET RESGROUP:SYSCALL
  228.         MOV     AX,(Set_interrupt_vector SHL 8) + int_command
  229.         INT     int_command
  230.         POP     ES
  231. ENDIF
  232.  
  233.         MOV     AL,BYTE PTR DS:[FCB]         ; get drive spec for default
  234.         MOV     AH,DRVCHAR
  235.         MOV     [COMDRV],AL
  236.         ADD     AL,40H                  ; Convert to letter
  237.         CMP     AL,40H
  238.         JZ      NOCOMDRV
  239.         STD
  240.         IF      HIGHMEM
  241.         CMP     BYTE PTR CS:[CHUCKENV],0
  242.         ELSE
  243.         CMP     BYTE PTR [CHUCKENV],0
  244.         ENDIF
  245.  
  246.         JNZ     NOTWIDENV
  247.  
  248.         PUSH    DS
  249.         PUSH    ES
  250.         POP     DS
  251.         MOV     DI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 1 - 10H
  252.         MOV     SI,OFFSET ENVIRONMENT:ECOMSPEC + ENVIRONSIZ2 - 3 - 10H
  253.         MOV     CX,ENVIRONSIZ2 - 2
  254.         REP     MOVSB
  255.  
  256.         POP     DS
  257.         MOV     WORD PTR ES:[ECOMSPEC-10H],AX
  258.  
  259. NOTWIDENV:
  260.         CLD
  261.         IF      HIGHMEM
  262.         MOV     WORD PTR CS:[AUTOBAT],AX
  263.         ELSE
  264.         MOV     WORD PTR [AUTOBAT],AX
  265.         ENDIF
  266.  
  267.         MOV     [COMLET],AL
  268. NOCOMDRV:
  269.         CALL    SETVECT         ; Set the vectors
  270.  
  271.         MOV     SI,80H
  272.         LODSB
  273.         MOV     CL,AL
  274.         XOR     CH,CH
  275.         JCXZ    COMRETURNSJ     ; No parameters
  276.         MOV     SI,81H          ; Start of parms
  277. CHKARG:
  278.         LODSB
  279.         CMP     AL,' '
  280.         JZ      NEXTCH
  281.         CMP     AL,9            ; Tab only other delimiter
  282.         JZ      NEXTCH
  283.         CMP     AL,[RSWITCHAR]   ; Switch?
  284.         JNZ     CHKOTHERARGS    ; No
  285.         DEC     CX
  286.         JCXZ    ARGSDONEJ       ; oops
  287.         LODSB
  288.         OR      AL,20H          ; Lower case
  289.         CMP     AL,'p'          ; PERMCOM switch
  290.         JNZ     NEXTCH
  291.         JMP     SETPERM
  292.  
  293. NEXTCH:
  294.         CMP     AL,'d'
  295.         JNZ     NEXTCH3
  296.  
  297.         IF      HIGHMEM
  298.         MOV     BYTE PTR CS:[PRDATTM],1  ; User explicitly says no date time
  299.         ELSE
  300.         MOV     BYTE PTR [PRDATTM],1     ; User explicitly says no date time
  301.         ENDIF
  302.  
  303.         LOOP    CHKARG
  304.         JMP     SHORT ARGSDONEJ
  305. NEXTCH3:
  306.         CMP     AL,'c'
  307.         JNZ     NEXTCH2         ; SINGLECOM switch 2
  308.         MOV     [SINGLECOM],SI  ; Point to the rest of the command line
  309.         MOV     [PERMCOM],0     ; A SINGLECOM must not be a PERMCOM
  310.  
  311.         IF      HIGHMEM
  312.         MOV     BYTE PTR CS:[PRDATTM],1  ; No date or time either, explicit
  313.         ELSE
  314.         MOV     BYTE PTR [PRDATTM],1     ; No date or time either, explicit
  315.         ENDIF
  316.  
  317. ARGSDONEJ:
  318.         JMP  ARGSDONE
  319.  
  320. NEXTCH2:
  321.         LOOP    CHKARG
  322.  
  323. COMRETURNSJ:
  324.         JMP COMRETURNS
  325.  
  326. CHKOTHERARGS:
  327.         DEC     SI
  328.         MOV     DX,SI
  329.         PUSH    CX
  330.         PUSH    SI
  331. CONTRLOOP:
  332.         LODSB
  333.         DEC     CX
  334.         CMP     AL,' '
  335.         JZ      SETCDEV
  336.         CMP     AL,9
  337.         JZ      SETCDEV
  338.         JCXZ    SETCDEVA
  339.         JMP     SHORT CONTRLOOP
  340.  
  341. SETCDEVA:
  342.         INC     SI
  343. SETCDEV:
  344.         MOV     BYTE PTR [SI-1],0
  345.         MOV     AX,(OPEN SHL 8) OR 2    ; Read and write
  346.         INT     int_command
  347.         JC      CHKSRCHSPEC             ; Wasn't a file
  348.         MOV     BX,AX
  349.         MOV     AX,IOCTL SHL 8
  350.         INT     int_command
  351.         TEST    DL,80H
  352.         JNZ     ISADEVICE
  353.         MOV     AH,CLOSE       ; Close initial handle, wasn't a device
  354.         INT     int_command
  355.         JMP     CHKSRCHSPEC
  356.  
  357. ISADEVICE:
  358.         XOR     DH,DH
  359.         OR      DL,3            ; Make sure has CON attributes
  360.         MOV     AX,(IOCTL SHL 8) OR 1
  361.         INT     int_command
  362.         MOV     DX,BX           ; Save new handle
  363.         POP     BX              ; Throw away saved SI
  364.         POP     BX              ; Throw away saved CX
  365.         PUSH    CX
  366.         MOV     CX,3
  367.         XOR     BX,BX
  368. RCCLLOOP:                                ; Close 0,1 and 2
  369.         MOV     AH,CLOSE
  370.         INT     int_command
  371.         INC     BX
  372.         LOOP    RCCLLOOP
  373.         MOV     BX,DX           ; New device handle
  374.         MOV     AH,XDUP
  375.         INT     int_command             ; Dup to 0
  376.         MOV     AH,XDUP
  377.         INT     int_command             ; Dup to 1
  378.         MOV     AH,XDUP
  379.         INT     int_command             ; Dup to 2
  380.         MOV     AH,CLOSE
  381.         INT     int_command             ; Close initial handle
  382.         POP     CX
  383.         JCXZ    ARGSDONEJ2
  384.         JMP     CHKARG
  385.  
  386. CHKSRCHSPEC:                    ; Not a device, so must be directory spec
  387.  
  388.         IF      HIGHMEM
  389.         MOV     BYTE PTR CS:[CHUCKENV],0    ; If search specified -- no inheritance
  390.         MOV     AX,CS:[ENVIRSEGSAV]
  391.         MOV     [ENVIRSEG],AX
  392.         ELSE
  393.         MOV     BYTE PTR [CHUCKENV],0    ; If search specified -- no inheritance
  394.         MOV     AX,OFFSET RESGROUP:PATHSTRING   ; Figure environment pointer
  395.         MOV     CL,4
  396.         SHR     AX,CL
  397.         MOV     DX,DS
  398.         ADD     AX,DX
  399.         MOV     [ENVIRSEG],AX
  400.         ENDIF
  401.  
  402.         MOV     ES,AX
  403.         MOV     BYTE PTR [SI-1],' '
  404.         POP     SI                      ; Remember location
  405.         POP     CX                      ; and count
  406.  
  407.         IF      HIGHMEM
  408.         MOV     DI,CS:[ECOMLOC]
  409.         ELSE
  410.         MOV     DI,[ECOMLOC]
  411.         ENDIF
  412.  
  413. COMTRLOOP:
  414.         LODSB
  415.         DEC     CX
  416.         CMP     AL,' '
  417.         JZ      SETCOMSR
  418.         CMP     AL,9
  419.         JZ      SETCOMSR
  420.         STOSB
  421.  
  422.         IF      KANJI
  423.         XOR     AH,AH
  424.         ENDIF
  425.  
  426.         JCXZ    SETCOMSR
  427.  
  428.         IF      KANJI
  429.         CALL    ITESTKANJ
  430.         JZ      COMTRLOOP
  431.         DEC     CX
  432.         MOVSB
  433.         INC     AH
  434.         JCXZ    SETCOMSR
  435.         ENDIF
  436.  
  437.         JMP     SHORT COMTRLOOP
  438.  
  439. SETCOMSR:
  440.         PUSH    SI
  441.         PUSH    CX
  442.  
  443.         PUSH    DS
  444.  
  445.         IF      HIGHMEM
  446.         PUSH    CS
  447.         POP     DS
  448.         ENDIF
  449.  
  450.         MOV     SI,OFFSET RESGROUP:COMSPECT
  451.         MOV     CX,14
  452.  
  453.         MOV     AL,ES:[DI-1]
  454.  
  455.         IF      KANJI
  456.         OR      AH,AH
  457.         JNZ     INOTROOT        ; Last char was KANJI second byte, might be '\'
  458.         ENDIF
  459.  
  460.         CALL    PATHCHRCMPR
  461.         JNZ     INOTROOT
  462.         INC     SI              ; Don't make a double /
  463.         DEC     CX
  464. INOTROOT:
  465.         REP     MOVSB
  466.  
  467.         MOV     DX,[ECOMLOC]    ; Now lets make sure its good!
  468.         PUSH    ES
  469.         POP     DS
  470.  
  471.         MOV     AX,OPEN SHL 8
  472.         INT     int_command             ; Open COMMAND.COM
  473.         POP     DS
  474.         JC      SETCOMSRBAD     ; No COMMAND.COM here
  475.         MOV     BX,AX           ; Handle
  476.         MOV     AH,CLOSE
  477.         INT     int_command             ; Close COMMAND.COM
  478. SETCOMSRRET:
  479.         POP     CX
  480.         POP     SI
  481. ARGSDONEJ2:
  482.         JCXZ    ARGSDONE
  483.         JMP     CHKARG
  484.  
  485. SETCOMSRBAD:
  486.  
  487.         IF      HIGHMEM
  488.         PUSH    DS
  489.         PUSH    CS
  490.         POP     DS
  491.         ENDIF
  492.  
  493.         MOV     DX,OFFSET RESGROUP:BADCOMLKMES
  494.         MOV     AH,STD_CON_STRING_OUTPUT
  495.         INT     int_command
  496.         MOV     SI,OFFSET RESGROUP:COMSPECT
  497.         MOV     DI,[ECOMLOC]
  498.         MOV     CX,14
  499.         REP     MOVSB           ; Get my default back
  500.  
  501.         IF      HIGHMEM
  502.         POP     DS
  503.         ENDIF
  504.  
  505.         JMP     SHORT SETCOMSRRET
  506.  
  507. CHKARGJ:
  508.         JMP    CHKARG
  509.  
  510. SETPERM:
  511.         INC     [PERMCOM]
  512.  
  513.         IF      HIGHMEM
  514.         CMP     BYTE PTR CS:[PRDATTM],-1
  515.         ELSE
  516.         CMP     BYTE PTR [PRDATTM],-1
  517.         ENDIF
  518.  
  519.         JNZ     LOOPIT
  520.  
  521.         IF      HIGHMEM
  522.         MOV     BYTE PTR CS:[PRDATTM],0          ; If not set explicit, set to prompt
  523.         ELSE
  524.         MOV     BYTE PTR [PRDATTM],0             ; If not set explicit, set to prompt
  525.         ENDIF
  526.  
  527. LOOPIT:
  528.         LOOP    CHKARGJ
  529. ARGSDONE:
  530.         CMP     [PERMCOM],0
  531.         JZ      COMRETURNS
  532.         PUSH    ES                      ; Save environment pointer
  533.         MOV     AH,SET_CURRENT_PDB
  534.         MOV     BX,DS
  535.         MOV     ES,BX
  536.         INT     int_command                     ; Current process is me
  537.         MOV     DI,PDB_Exit             ; Diddle the addresses in my header
  538.         MOV     AX,OFFSET RESGROUP:LODCOM
  539.         STOSW
  540.         MOV     AX,DS
  541.         STOSW
  542.         MOV     AX,OFFSET RESGROUP:CONTC
  543.         STOSW
  544.         MOV     AX,DS
  545.         STOSW
  546.         MOV     WORD PTR DS:[PDB_Parent_PID],DS ; Parent is me forever
  547.         MOV     DX,OFFSET RESGROUP:INT_2E
  548.         MOV     AX,(SET_INTERRUPT_VECTOR SHL 8) OR 02EH
  549.         INT     int_command                     ;Set magic interrupt
  550.         POP     ES                              ;Remember environment
  551. COMRETURNS:
  552.         MOV     AX,WORD PTR DS:[PDB_Parent_PID]
  553.         MOV     [PARENT],AX                     ; Save parent
  554.         MOV     WORD PTR DS:[PDB_Parent_PID],DS ; Parent is me
  555.         MOV     AX,WORD PTR DS:[PDB_JFN_Table]
  556.         MOV     [IO_SAVE],AX                    ; Get the default stdin and out
  557.         MOV     WORD PTR [COM_PTR+2],DS         ; Set all these to resident
  558.         MOV     WORD PTR [COM_FCB1+2],DS
  559.         MOV     WORD PTR [COM_FCB2+2],DS
  560.         MOV     DI,OFFSET RESGROUP:COMSPEC
  561.  
  562.         IF      HIGHMEM
  563.         MOV     SI,CS:[ECOMLOC]
  564.         CMP     BYTE PTR CS:[CHUCKENV],0
  565.         ELSE
  566.         MOV     SI,[ECOMLOC]
  567.         CMP     BYTE PTR [CHUCKENV],0
  568.         ENDIF
  569.  
  570.         MOV     AX,DS                   ; XCHG ES,DS
  571.         PUSH    ES
  572.         POP     DS
  573.         MOV     ES,AX
  574.  
  575.         JZ      COPYCOMSP               ; All set up for copy
  576.  
  577.         PUSH    CS
  578.         POP     DS
  579.  
  580.         MOV     SI,OFFSET RESGROUP:COMSPSTRING
  581.         PUSH    ES
  582.         PUSH    DI
  583.         CALL    IFINDE
  584.         MOV     SI,DI
  585.         PUSH    ES
  586.         POP     DS
  587.         POP     DI
  588.         POP     ES
  589.         JNC     COPYCOMSP
  590. COMSPECNOFND:
  591.  
  592.         IF      HIGHMEM
  593.         MOV     DS,CS:[ENVIRSEG]
  594.         MOV     SI,CS:[ECOMLOC]
  595.         ELSE
  596.         MOV     SI,[ECOMLOC]
  597.         ADD     SI,OFFSET RESGROUP:PATHSTRING
  598.         PUSH    CS
  599.         POP     DS
  600.         ENDIF
  601.  
  602. COPYCOMSP:
  603.         LODSB
  604.         STOSB
  605.         OR      AL,AL
  606.         JNZ     COPYCOMSP
  607.  
  608.         IF      HIGHMEM
  609.         MOV     DS,CS:[REALRES]
  610.         PUSH    CS
  611.         POP     ES
  612.         MOV     AH,DEALLOC
  613.         INT     21H
  614.         CMP     BYTE PTR CS:[CHUCKENV],0
  615.         JZ      GOTENVIR                ; Environment is ok
  616.         MOV     ES,CS:[ENVIRSEGSAV]
  617.         MOV     AH,DEALLOC
  618.         INT     21H
  619.         ELSE
  620.         PUSH    CS
  621.         POP     DS
  622.         MOV     BX,OFFSET RESGROUP:DATARESEND + 15
  623.         MOV     CL,4
  624.         SHR     BX,CL
  625.         MOV     AH,SETBLOCK
  626.         INT     int_command                     ; Shrink me to the resident only
  627.         CMP     BYTE PTR [CHUCKENV],0
  628.         JNZ     GOTENVIR                ; Environment was passed
  629.         MOV     BX,(ENVIRONSIZ + 15) /16
  630.         MOV     AH,ALLOC
  631.         INT     int_command                     ; "ALLOCATE" the environment
  632.         MOV     DS,[ENVIRSEG]
  633.         MOV     [ENVIRSEG],AX
  634.         MOV     ES,AX
  635.         XOR     SI,SI
  636.         MOV     DI,SI
  637.         MOV     CX,ENVIRONSIZ
  638.         REP     MOVSB
  639.         PUSH    CS
  640.         POP     DS
  641.         ENDIF
  642.  
  643. GOTENVIR:
  644.         CALL    LOADCOM                 ; Load the transient in the right place
  645.         CALL    CHKSUM                  ; Compute the checksum
  646.         MOV     [SUM],DX                ; Save it
  647. IF IBM
  648.         MOV     AX,[MEMSIZ]
  649.         MOV     DX,OFFSET EGROUP:ZEXECDATAEND + 15
  650.         MOV     CL,4
  651.         SHR     DX,CL
  652.         SUB     AX,DX
  653.         MOV     [EXESEG],AX
  654.         CALL    EXECHK
  655.         MOV     [EXESUM],DX
  656. ENDIF
  657.         IF MSVER
  658.         CMP     [SINGLECOM],0
  659.         JNZ     NOPHEAD                 ; Don't print header if SINGLECOM
  660.         IF      HIGHMEM
  661.         PUSH    DS
  662.         PUSH    CS
  663.         POP     DS
  664.         ENDIF
  665.         MOV     DX,OFFSET RESGROUP:HEADER
  666.         MOV     AH,STD_CON_STRING_OUTPUT
  667.         INT     int_command
  668.         IF      HIGHMEM
  669.         POP     DS
  670.         ENDIF
  671. NOPHEAD:
  672.         ENDIF
  673.  
  674.         IF      HIGHMEM
  675.         CMP     BYTE PTR CS:[PRDATTM],0
  676.         ELSE
  677.         CMP     BYTE PTR [PRDATTM],0
  678.         ENDIF
  679.  
  680.         JNZ     NODTTM                  ; Don't do AUTOEXEC or date time
  681.         MOV     BX,3                    ; 48 BYTES ENOUGH
  682.         MOV     AH,ALLOC
  683.         INT     int_command
  684.         JC      DODTTM                  ; PRETEND NO BATCH
  685.         MOV     [BATCH],AX
  686.         MOV     ES,AX
  687.         XOR     DI,DI
  688.  
  689.         IF      HIGHMEM
  690.         CMP     BYTE PTR CS:[AUTOBAT],0
  691.         ELSE
  692.         CMP     BYTE PTR [AUTOBAT],0
  693.         ENDIF
  694.  
  695.         JNZ     NOAUTSET
  696.         MOV     AH,GET_DEFAULT_DRIVE
  697.         INT     int_command
  698.         ADD     AL,'A'
  699.  
  700.         IF      HIGHMEM
  701.         MOV     CS:[AUTOBAT],AL
  702.         ELSE
  703.         MOV     [AUTOBAT],AL
  704.         ENDIF
  705.  
  706. NOAUTSET:
  707.  
  708.         IF      HIGHMEM
  709.         PUSH    DS
  710.         PUSH    CS
  711.         POP     DS
  712.         ENDIF
  713.  
  714.         MOV     SI,OFFSET RESGROUP:AUTOBAT
  715.         MOV     CX,8
  716.         REP     MOVSW   ; NAME
  717.         MOV     AX,-1
  718.         MOV     CL,10
  719.         REP     STOSW   ; PARMS
  720.         MOV     DX,OFFSET RESGROUP:AUTOBAT
  721.         MOV     AX,OPEN SHL 8
  722.         INT     int_command                      ; See if AUTOEXEC.BAT exists
  723.         JC      NOABAT
  724.         MOV     BX,AX
  725.         MOV     AH,CLOSE
  726.         INT     int_command
  727.  
  728.         IF      HIGHMEM
  729.         POP     DS
  730.         ENDIF
  731.  
  732.         JMP     SHORT DRV0
  733.  
  734. NOABAT:
  735.  
  736.         IF      HIGHMEM
  737.         POP     DS
  738.         ENDIF
  739.  
  740.         MOV     ES,[BATCH]      ; Not found--turn off batch job
  741.         MOV     AH,DEALLOC
  742.         INT     int_command
  743.         MOV     [BATCH],0       ; AFTER DEALLOC in case of ^C
  744. DODTTM:
  745.  
  746.         IF      HIGHMEM
  747.         MOV     AX,OFFSET TRANGROUP:DATINIT
  748.         MOV     WORD PTR CS:[INITADD],AX
  749.         MOV     AX,[TRNSEG]
  750.         MOV     WORD PTR CS:[INITADD+2],AX
  751.         CALL    DWORD PTR CS:[INITADD]
  752.         ELSE
  753.         MOV     AX,OFFSET TRANGROUP:DATINIT
  754.         MOV     WORD PTR[INITADD],AX
  755.         MOV     AX,[TRNSEG]
  756.         MOV     WORD PTR[INITADD+2],AX
  757.         CALL    DWORD PTR [INITADD]
  758.         ENDIF
  759.  
  760. NODTTM:
  761.  
  762.         IF IBMVER
  763.         CMP     [SINGLECOM],0
  764.         JNZ     DRV0                    ; Don't print header if SINGLECOM
  765.         MOV     DX,OFFSET RESGROUP:HEADER
  766.         MOV     AH,STD_CON_STRING_OUTPUT
  767.         INT     int_command
  768.         ENDIF
  769.  
  770. DRV0:
  771.         IF      HIGHMEM
  772.         PUSH    DS
  773.         MOV     AX,OFFSET RESGROUP:LODCOM
  774.         PUSH    AX
  775. MQQ     PROC    FAR
  776.         RET
  777. MQQ     ENDP
  778.         ELSE
  779.         JMP     LODCOM                  ; Allocate the transient
  780.         ENDIF
  781.  
  782. PATHCHRCMPR:
  783.         CMP     [RSWITCHAR],'/'
  784.         JZ      RNOSLASHT
  785.         CMP     AL,'/'
  786.         JZ      RET41
  787. RNOSLASHT:
  788.         CMP     AL,'\'
  789. RET41:
  790.         RET
  791.  
  792.  
  793. IFINDE:
  794.         CALL    IFIND                    ; FIND THE NAME
  795.         JC      IFIND2                   ; CARRY MEANS NOT FOUND
  796.         JMP     ISCASB1                  ; SCAN FOR = SIGN
  797. ;
  798. ; On return of FIND1, ES:DI points to beginning of name
  799. ;
  800. IFIND:
  801.         CLD
  802.  
  803.         CALL    ICOUNT0                  ; CX = LENGTH OF NAME
  804.  
  805.         IF      HIGHMEM
  806.         MOV     ES,CS:[REALRES]
  807. ASSUME  ES:RESGROUP
  808.         MOV     ES,ES:[ENVIRSEG]
  809. ASSUME  ES:NOTHING
  810.         ELSE
  811.         MOV     ES,[ENVIRSEG]
  812.         ENDIF
  813.  
  814.         XOR     DI,DI
  815. IFIND1:
  816.         PUSH    CX
  817.         PUSH    SI
  818.         PUSH    DI
  819. IFIND11:
  820.         LODSB
  821.  
  822.         IF      KANJI
  823.         CALL    ITESTKANJ
  824.         JZ      NOTKANJ4
  825.         DEC     SI
  826.         LODSW
  827.         INC     DI
  828.         INC     DI
  829.         CMP     AX,ES:[DI-2]
  830.         JNZ     IFIND12
  831.         DEC     CX
  832.         LOOP    IFIND11
  833.         JMP     SHORT IFIND12
  834.  
  835. NOTKANJ4:
  836.         ENDIF
  837.  
  838.         CALL    IUPCONV
  839.         INC     DI
  840.         CMP     AL,ES:[DI-1]
  841.         JNZ     IFIND12
  842.         LOOP    IFIND11
  843. IFIND12:
  844.         POP     DI
  845.         POP     SI
  846.         POP     CX
  847.         JZ      IFIND2
  848.         PUSH    CX
  849.         CALL    ISCASB2                  ; SCAN FOR A NUL
  850.         POP     CX
  851.         CMP     BYTE PTR ES:[DI],0
  852.         JNZ     IFIND1
  853.         STC                             ; INDICATE NOT FOUND
  854. IFIND2:
  855.         RET
  856.  
  857. ICOUNT0:
  858.         PUSH    DS
  859.         POP     ES
  860.         MOV     DI,SI
  861.  
  862.         PUSH    DI                      ; COUNT NUMBER OF CHARS UNTIL "="
  863.         CALL    ISCASB1
  864.         JMP     SHORT ICOUNTX
  865.         PUSH    DI                      ; COUNT NUMBER OF CHARS UNTIL NUL
  866.         CALL    ISCASB2
  867. ICOUNTX:
  868.         POP     CX
  869.         SUB     DI,CX
  870.         XCHG    DI,CX
  871.         RET
  872.  
  873. ISCASB1:
  874.         MOV     AL,"="                  ; SCAN FOR AN =
  875.         JMP     SHORT ISCASBX
  876. ISCASB2:
  877.         XOR     AL,AL                   ; SCAN FOR A NUL
  878. ISCASBX:
  879.         MOV     CX,100H
  880.         REPNZ   SCASB
  881.         RET
  882.  
  883.         IF      KANJI
  884. ITESTKANJ:
  885.         CMP     AL,81H
  886.         JB      NOTLEAD
  887.         CMP     AL,9FH
  888.         JBE     ISLEAD
  889.         CMP     AL,0E0H
  890.         JB      NOTLEAD
  891.         CMP     AL,0FCH
  892.         JBE     ISLEAD
  893. NOTLEAD:
  894.         PUSH    AX
  895.         XOR     AX,AX           ;Set zero
  896.         POP     AX
  897.         RET
  898.  
  899. ISLEAD:
  900.         PUSH    AX
  901.         XOR     AX,AX           ;Set zero
  902.         INC     AX              ;Reset zero
  903.         POP     AX
  904.         RET
  905.         ENDIF
  906.  
  907. IUPCONV:
  908.         CMP     AL,"a"
  909.         JB      IRET22
  910.         CMP     AL,"z"
  911.         JA      IRET22
  912.         SUB     AL,20H          ; Lower-case changed to upper-case
  913. IRET22:
  914.         RET
  915.  
  916. ICONDEV LABEL BYTE
  917.         DB      "/DEV/"
  918.         DB      "CON",0,0,0,0,0,0          ; Room for 8 char device
  919. BADCSPFL DB     0
  920. COMSPECT DB     "/COMMAND.COM",0,0
  921. AUTOBAT DB      0,":\AUTOEXEC.BAT",0
  922.  
  923. PRDATTM DB      -1                      ;Init not to prompt for date time
  924. INITADD DD      ?
  925. CHUCKENV DB     0
  926. ECOMLOC DW      OFFSET ENVIRONMENT:ECOMSPEC-10H
  927.  
  928.         IF      HIGHMEM
  929. REALRES DW      ?
  930. ENVIRSEGSAV DW  ?
  931.         ENDIF
  932.  
  933. COMSPSTRING DB  "COMSPEC="
  934.  
  935.  
  936. INIT    ENDS
  937.  
  938.         END
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement