home *** CD-ROM | disk | FTP | other *** search
/ MS DOS Archives 1 / MS-DOS_Archives_Volume_One_Walnut_Creek.iso / msdos / at / 800ks.arc / 800K.ASM next >
Assembly Source File  |  1988-02-17  |  7KB  |  464 lines

  1. CODE    SEGMENT
  2.     ASSUME    CS:CODE
  3.     ORG    100H
  4.  
  5. START:    JMP    DOSVER
  6.  
  7. OLD13    DD    0
  8. AFLAG    DB    0
  9. BFLAG    DB    0
  10.  
  11. ;-------------------------------------------
  12.  
  13. INT13    PROC    FAR
  14.  
  15.     STI
  16.  
  17.     PUSH    ES
  18.     PUSH    AX
  19.     MOV    AX,40H
  20.     MOV    ES,AX
  21.  
  22.     CMP    AFLAG,0
  23.     JE    INT13A
  24.  
  25.     MOV    AL,BYTE PTR ES:[90H]
  26.     AND    AL,0DFH
  27.     OR    AL,07H
  28.     MOV    BYTE PTR ES:[90H],AL
  29.  
  30. INT13A:
  31.     CMP    BFLAG,0
  32.     JE    INT13B
  33.  
  34.     MOV    AL,BYTE PTR ES:[91H]
  35.     AND    AL,0DFH
  36.     OR    AL,07H
  37.     MOV    BYTE PTR ES:[91H],AL
  38.  
  39. INT13B:
  40.     POP    AX
  41.     POP    ES
  42.  
  43.     PUSHF
  44.     CLI
  45.     CALL    OLD13
  46.  
  47.     PUSHF
  48.  
  49.     PUSH    ES
  50.     PUSH    AX
  51.     MOV    AX,40H
  52.     MOV    ES,AX
  53.  
  54.     CMP    AFLAG,0
  55.     JE    INT13C
  56.  
  57.     MOV    AL,BYTE PTR ES:[90H]
  58.     AND    AL,0DFH
  59.     OR    AL,07H
  60.     MOV    BYTE PTR ES:[90H],AL
  61.  
  62. INT13C:
  63.     CMP    BFLAG,0
  64.     JE    INT13D
  65.  
  66.     MOV    AL,BYTE PTR ES:[91H]
  67.     AND    AL,0DFH
  68.     OR    AL,07H
  69.     MOV    BYTE PTR ES:[91H],AL
  70.  
  71. INT13D:
  72.     POP    AX
  73.     POP    ES
  74.  
  75.     POPF
  76.  
  77.     RET    2
  78.  
  79. INT13    ENDP
  80.  
  81. ;-------------------------------------------
  82.  
  83. MULTIPLEX_NUMBER  EQU  0EEH
  84. OLD2F    DD    0
  85. MULTIPLEX_NAME    DB    '800K    '
  86.  
  87. ;multiplex interrupt -- tests for installed
  88. ; state of program by passed string of
  89. ; length 8 pointed to by DS:SI
  90.  
  91. INT2F    PROC    FAR
  92.  
  93.     CMP    AH,MULTIPLEX_NUMBER
  94.     JNE    INT2FX
  95.  
  96.     PUSH    ES
  97.     PUSH    DI
  98.     PUSH    SI
  99.     PUSH    CX
  100.  
  101.     MOV    CX,CS
  102.     MOV    ES,CX
  103.  
  104.     CLD
  105.     MOV    CX,4
  106.     LEA    DI,MULTIPLEX_NAME
  107.     REPE    CMPSW
  108.  
  109.     POP    CX
  110.     POP    SI
  111.     POP    DI
  112.     POP    ES
  113.  
  114.     JNE    INT2FX
  115.  
  116. ;our address verified, test for which function
  117.  
  118.     CMP    AL,0
  119.     JE    INT2FA
  120.  
  121.     CMP    AL,1
  122.     JE    INT2FB
  123.  
  124. ;AL = 2  -->  un-install
  125.  
  126.     PUSH    ES
  127.     PUSH    DS
  128.     PUSH    DX
  129.     PUSH    AX
  130.     LDS    DX,OLD13
  131.     MOV    AX,2513H
  132.     INT    21H
  133.     LDS    DX,OLD2F
  134.     MOV    AX,252FH
  135.     INT    21H
  136.     MOV    ES,CS:[2CH]
  137.     MOV    AH,49H
  138.     INT    21H
  139.     PUSH    CS
  140.     POP    ES
  141.     MOV    AH,49H
  142.     INT    21H
  143.     POP    AX
  144.     POP    DX
  145.     POP    DS
  146.     POP    ES
  147.     SUB    AL,AL
  148.     IRET
  149.  
  150. ;AL = 1  -->  update A/B flags
  151.  
  152. INT2FB:
  153.     MOV    AFLAG,DH
  154.     MOV    BFLAG,DL
  155.     IRET
  156.  
  157. ;AL = 0  -->  signal installed state
  158.  
  159. INT2FA:
  160.     MOV    AL,0FFH
  161.     IRET
  162.  
  163. INT2FX:
  164.     JMP    CS:OLD2F
  165.  
  166. INT2F    ENDP
  167.  
  168. ;-------------------------------------------
  169.  
  170. CUTOFF    LABEL    BYTE
  171.  
  172. ;-------------------------------------------
  173.  
  174. ;on completion: 1=sw found
  175.  
  176. SW1FLG    DB    0
  177. SW2FLG    DB    0
  178. SW3FLG    DB    0
  179.  
  180. ;on completion: contains string following
  181. ; colon after switch, terminated by 20h,
  182. ; slash, or <cr> in command line
  183. ; and 00h here
  184. ;
  185. ;example: PROGRAM /A/B:1234/C XYZ
  186. ; SW2PARM would contain 31h,32h,33h,34h,00h,
  187. ; etc.
  188.  
  189. SW1PARM    DB    64 DUP (0)
  190. SW2PARM    DB    64 DUP (0)
  191. SW3PARM    DB    64 DUP (0)
  192.  
  193. ;lower case in command line converted
  194. ; to upper case
  195.  
  196. SWLIST    DB    'ABU'
  197.  
  198. SWLSTLEN EQU    3
  199.  
  200. ;it is assumed that DS and ES both point
  201. ; to the PSP.
  202.  
  203. SWSCAN    PROC
  204.  
  205.     CLD
  206.     MOV    DI,80H
  207.     MOV    CL,[DI]
  208.     SUB    CH,CH
  209.     INC    DI
  210.  
  211.     CMP    CX,1
  212.     JBE    SWSCAN1
  213.  
  214. ;search for "/" character
  215.  
  216. SWSCAN3:
  217.     MOV    AL,'/'
  218.     REPNE    SCASB
  219.     JCXZ    SWSCAN1
  220.  
  221. ;compare next character to list
  222.  
  223.     MOV    AL,[DI]
  224.     CMP    AL,61H
  225.     JB    SWSCAN4
  226.     SUB    AL,20H
  227. SWSCAN4: PUSH    DI
  228.     PUSH    CX
  229.     LEA    DI,SWLIST
  230.     MOV    CX,SWLSTLEN
  231.     REPNE    SCASB
  232.     JNE    SWSCAN2
  233.     LEA    AX,SWLIST
  234.     DEC    DI
  235.     SUB    DI,AX
  236.     MOV    BX,DI
  237.     LEA    AX,SW1FLG
  238.     ADD    DI,AX
  239.     MOV    BYTE PTR [DI],1
  240. SWSCAN2: POP    CX
  241.     POP    DI
  242.  
  243. ;convert the two characters to blanks
  244.  
  245.     MOV    WORD PTR [DI-1],2020H
  246.  
  247. ;is next character a colon?
  248.  
  249.     INC    DI
  250.     CMP    BYTE PTR [DI],":"
  251.     JNE    SWSCAN5
  252.  
  253. ;blank it
  254.  
  255.     MOV    BYTE PTR [DI],20H
  256.     DEC    CX
  257.     JCXZ    SWSCAN1
  258.  
  259. ;set a pointer to the parm area
  260.  
  261.     PUSH    CX
  262.     MOV    CL,6
  263.     SHL    BX,CL
  264.     POP    CX
  265.     LEA    AX,SW1PARM
  266.     ADD    BX,AX
  267.  
  268. ;transfer bytes until terminating character
  269.     
  270. SWSCAN6:
  271.     INC    DI
  272.     CMP    BYTE PTR [DI],20H
  273.     JBE    SWSCAN5
  274.     CMP    BYTE PTR [DI],"/"
  275.     JE    SWSCAN5
  276.     MOV    AL,[DI]
  277.     MOV    BYTE PTR [DI],20H
  278.     MOV    [BX],AL
  279.     INC    BX
  280.     LOOP    SWSCAN6
  281.     JMP    SWSCAN1
  282.  
  283. ;loop back & continue scan
  284.  
  285. SWSCAN5:
  286.     JMP    SWSCAN3
  287.  
  288. ;exit
  289.  
  290. SWSCAN1:
  291.     RET
  292.  
  293. SWSCAN    ENDP
  294.  
  295. ;-------------------------------------------
  296.  
  297. HELP DB 0Ah,'800K - Version 1.0  --  Copyright (C) 1987, Alan D. Jones'
  298.  DB 0Dh,0Ah,0Ah
  299.  DB 'This is a memory-resident program which allows diskettes',0Dh,0Ah
  300.  DB 'formatted with the companion program 800KFMAT to be written',0Dh,0Ah
  301.  DB 'and read in the normal manner by DOS. It must be un-installed',0Dh,0Ah
  302.  DB '(with the /U switch) to restore operation with conventionally',0Dh,0Ah
  303.  DB 'formatted diskettes.',0Dh,0Ah,0Ah
  304.  DB 'This program hooks INT 13h and modifies the "diskette state',0Dh,0Ah
  305.  DB 'machine" bytes at 40:90 and 40:91 to prevent BIOS from',0Dh,0Ah
  306.  DB 'double-stepping the high density diskette drive after detecting',0Dh,0Ah
  307.  DB 'the presence of a diskette formatted to 300kbs density.',0Dh,0Ah,0Ah
  308.  DB 'Syntax:  To install for drive A:  800K/A',0Dh,0Ah
  309.  DB '         To install for drive B:  800K/B',0Dh,0Ah
  310.  DB '         To install for both:     800K/A/B',0Dh,0Ah
  311.  DB '         To un-install:           800K/U',0Dh,0Ah,0Ah,24h
  312.  
  313. EMSG1    DB    '800K was not installed.',0Dh,0Ah,24h
  314. MSG1    DB    '800K has been un-installed.',0Dh,0Ah,24h
  315. EMSG2    DB    'Requires DOS 3.3 or later.',0Dh,0Ah,24h
  316. MSG2    DB    'A/B switch settings adjusted.',0Dh,0Ah,24h
  317. MSG3    DB    '800K is now installed.',0Dh,0Ah,24h
  318.  
  319. ;check DOS version number
  320.  
  321. DOSVER:
  322.     MOV    AH,30H
  323.     INT    21H
  324.     XCHG    AL,AH
  325.     CMP    AX,031EH
  326.     JAE    GETSWITCH
  327.  
  328. ;wrong version, display message & exit
  329.  
  330.     MOV    DX,OFFSET EMSG2
  331.     MOV    AH,9
  332.     INT    21H
  333.     MOV    AX,4C01H
  334.     INT    21H
  335.  
  336. ;get command line switches
  337.  
  338. GETSWITCH:
  339.     CALL    SWSCAN
  340.     MOV    AL,SW1FLG
  341.     MOV    AFLAG,AL
  342.     MOV    AL,SW2FLG
  343.     MOV    BFLAG,AL
  344.  
  345. ;are any switches set?
  346.  
  347.     MOV    AL,SW1FLG
  348.     ADD    AL,SW2FLG
  349.     ADD    AL,SW3FLG
  350.     CMP    AL,0
  351.     JNE    TESTINS
  352.  
  353. ;no, so just display "help" message
  354.  
  355.     MOV    DX,OFFSET HELP
  356.     MOV    AH,9
  357.     INT    21H
  358.     MOV    AX,4C00H
  359.     INT    21H
  360.  
  361. ;test for already installed
  362.  
  363. TESTINS:
  364.     MOV    SI,OFFSET MULTIPLEX_NAME
  365.     MOV    AH,MULTIPLEX_NUMBER
  366.     MOV    AL,0
  367.     INT    2FH
  368.  
  369. ;branch based on whether installed or not
  370.  
  371.     CMP    AL,0FFH
  372.     JE    ITSTHERE
  373.  
  374. ;not installed
  375.  
  376. ;requesting un-install?
  377.  
  378.     CMP    SW3FLG,1
  379.     JNE    INSTALL
  380.  
  381. ;display error message
  382.  
  383.     MOV    DX,OFFSET EMSG1
  384.     MOV    AH,9
  385.     INT    21H
  386.     MOV    AX,4C00H
  387.     INT    21H
  388.  
  389. ;hook vectors and do a TSR
  390.  
  391. INSTALL:
  392.     MOV    AX,3513H
  393.     INT    21H
  394.     MOV    WORD PTR OLD13,BX
  395.     MOV    WORD PTR OLD13+2,ES
  396.     MOV    DX,OFFSET INT13
  397.     MOV    AX,2513H
  398.     INT    21H
  399.  
  400.     MOV    AX,352FH
  401.     INT    21H
  402.     MOV    WORD PTR OLD2F,BX
  403.     MOV    WORD PTR OLD2F+2,ES
  404.     MOV    DX,OFFSET INT2F
  405.     MOV    AX,252FH
  406.     INT    21H
  407.  
  408.     MOV    DX,OFFSET MSG3
  409.     MOV    AH,9
  410.     INT    21H
  411.  
  412.     MOV    DX,OFFSET CUTOFF
  413.     ADD    DX,0FH
  414.     MOV    CL,4
  415.     SHR    DX,CL
  416.     MOV    AX,3100H
  417.     INT    21H
  418.  
  419. ;already present
  420.  
  421. ITSTHERE:
  422.  
  423. ;requesting un-install?
  424.  
  425.     CMP    SW3FLG,1
  426.     JNE    ALTERFLAGS
  427.  
  428. ;make multiplex interrupt call for un-install
  429.  
  430.     MOV    SI,OFFSET MULTIPLEX_NAME
  431.     MOV    AH,MULTIPLEX_NUMBER
  432.     MOV    AL,2
  433.     INT    2FH
  434.  
  435. ;display informatory message
  436.  
  437.     MOV    DX,OFFSET MSG1
  438.     MOV    AH,9
  439.     INT    21H
  440.     MOV    AX,4C00H
  441.     INT    21H
  442.  
  443. ;requesting A/B flag alteration, make appropriate
  444. ; multiplex interrupt call
  445.  
  446. ALTERFLAGS:
  447.     MOV    SI,OFFSET MULTIPLEX_NAME
  448.     MOV    AH,MULTIPLEX_NUMBER
  449.     MOV    DH,AFLAG
  450.     MOV    DL,BFLAG
  451.     MOV    AL,1
  452.     INT    2FH
  453.  
  454. ;display informatory message
  455.  
  456.     MOV    DX,OFFSET MSG2
  457.     MOV    AH,9
  458.     INT    21H
  459.     MOV    AX,4C00H
  460.     INT    21H
  461.  
  462. CODE    ENDS
  463.     END    START
  464.