home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / assemblr / library / os2dualb / asksys.asm < prev    next >
Assembly Source File  |  1989-02-28  |  6KB  |  121 lines

  1. ; ASKSYS.ASM  --  Written for Microsoft MASM 5.x
  2. ; Implements dual-boot with timeout for DOS and OS/2
  3. ; Last modification: 02-15-89
  4. ;
  5. ; Copyright (C) 1988 Ziff Communications Co. and PC Tech Journal
  6. ; Written by Ted Mirecki
  7. ;
  8. ; Modifications Copyright (C) 1989 BAB Enterprises
  9. ; Entered by Brad Berson
  10. ;
  11. ; This file must be assembled, linked and EXE2BIN'd to the name ASKSYS
  12. ; or ASKSYS.COM.  When making changes keep the target file size to 2048
  13. ; bytes or less to avoid file fragmentation when installing feature.
  14. ;
  15. ; Change equates in first section as necessary for selection keys,
  16. ; default selection and selection timeout.
  17.  
  18. OS2             equ     13                      ; <Ent> for OS/2,
  19. DOS             equ     27                      ; <Esc> for DOS,
  20. DEFAULT         equ     DOS                     ; Default to DOS
  21. SECONDS         equ     15                      ; after 15 seconds
  22.  
  23. group1          group   code,data
  24.                 assume  cs:group1, ds:group1
  25. code            segment byte public             ; Establish code segment first
  26. code            ends
  27.  
  28. data            segment word                    ; but define data segment first
  29. time            dw      SECONDS*18
  30. oldint8         label   dword
  31. int8off         dw      0
  32. int8seg         dw      0
  33. bootaddr        dd      7C00h
  34. msg$            db      "OS/2 - DOS Dual Boot Program", 0Dh, 0Ah, 0Ah
  35.                 db      "Copyright (C) 1988 Ziff Communications Co.", 0Dh, 0Ah
  36.                 db      "and PC Tech Journal Magazine", 0Dh, 0Ah
  37.                 db      "Modifications (C) 1989 BAB Enterprises", 0Dh, 0Ah
  38.                 db      "Technical Consulting Services", 0Dh, 0Ah, 0Ah
  39.                 db      "Boot: Enter = OS/2, Esc = DOS", 0Dh, 0Ah, 0Ah, 0
  40.                 even
  41. dosboot         db      128 dup ('DOS-')        ; Space for DOS boot record and
  42. os2boot         db      128 dup ('OS2-')        ; space for OS/2 boot record
  43. data            ends
  44.  
  45. code            segment byte public             ; Resume code segment
  46. asksys          proc
  47.                 push    ax
  48.                 push    bx
  49.                 push    cx
  50.                 push    si
  51.                 push    di
  52.                 push    ds
  53.                 push    es
  54.                 mov     ax,cs                   ; Set DS to code segment
  55.                 mov     ds,ax
  56.                 lea     si,msg$                 ; Get address of message,
  57. boot1:          lodsb
  58.                 or      al,al                   ; null byte = end of message
  59.                 jz      boot2
  60.                 mov     ah,0Eh                  ; Call BIOS TTY write,
  61.                 int     10h
  62.                 jmp     boot1                   ; loop until end of messsage
  63.                 int8 = 8*4                      ; Address of Int 8 vector
  64. boot2:          xor     ax,ax
  65.                 mov     es,ax                   ; Point ES to Int table,
  66.                 mov     ax,es:int8              ; get Int 8 address
  67.                 mov     bx,es:int8+2
  68.                 mov     int8off,ax              ; and save it.
  69.                 mov     int8seg,bx
  70.                 lea     bx,timertick            ; Address of timer routine,
  71.                 cli                             ; hold off ints,
  72.                 mov     es:int8,bx              ; set timer interrupt
  73.                 mov     es:int8+2,cs
  74.                 sti                             ; and allow interrupts
  75. boot3:          mov     ah,1                    ; Get KB status
  76.                 int     16h
  77.                 jnz     boot4                   ; Key pressed if no ZF
  78.                 cmp     time,0                  ; else test for timeout
  79.                 jg      boot3                   ; No timeout; test KB again
  80.                 mov     al,DEFAULT              ; Set default keystroke
  81.                 jmp     short boot5             ; and go for it
  82. boot4:          xor     ah,ah                   ; Get the keystroke
  83.                 int     16h
  84.                 cmp     al,DOS                  ; Was it for DOS?
  85.                 je      boot5
  86.                 cmp     al,OS2                  ; or for OS/2?
  87.                 jne     boot3                   ; If neither, read KB again
  88. boot5:          mov     bx,int8off              ; Get original Int 8 vector,
  89.                 mov     cx,int8seg
  90.                 cli
  91.                 mov     es:int8,bx              ; restore it in vector table
  92.                 mov     es:int8+2,cx
  93.                 sti
  94.                 lea     si,dosboot              ; Load DOS boot record address
  95.                 cmp     al,DOS                  ; Was it DOS?
  96.                 je      boot6
  97.                 lea     si,os2boot              ; else load OS/2 boot record -
  98. boot6:          les     di,bootaddr             ; ES:DI points to its address
  99.                 mov     cx,256                  ; Length of record in words
  100.                 rep     movsw                   ; Insert boot rec at boot addr
  101.                 pop     es                      ; Exit sequence
  102.                 pop     ds
  103.                 pop     di
  104.                 pop     si
  105.                 pop     cx
  106.                 pop     bx
  107.                 pop     ax
  108.                 jmp     cs:bootaddr             ; Branch to boot record
  109. asksys          endp
  110.  
  111. ; Int 8, timer tick interrupt, is repointed here.
  112. ; This routine counts down a time value and chains to original Int 8.
  113.  
  114. timertick       proc
  115.                 dec     cs:time
  116.                 jmp     cs:oldint8
  117. timertick       endp
  118. code            ends
  119.                 end
  120.  
  121.