Category : Files from Magazines
Archive   : PCTJ8809.ZIP
Filename : ASKSYS.ASM

 
Output of file : ASKSYS.ASM contained in archive : PCTJ8809.ZIP
; ASKSYS.ASM - Implements dual-boot w/timeout for DOS & OS/2
;
; Copyright (C) 1988 Ziff Communications Co. and PC Tech Journal
; Written by Ted Mirecki
;
; Set default system by value of label DEFAULT
; Set timeout interval by value of label SECONDS

OS2 equ 13 ;Enter key starts OS/2
DOS equ 27 ;Esc key starts DOS
DEFAULT equ DOS ;If neither key pressed
SECONDS equ 15 ;Timeout interval

group1 group code,data
assume cs:group1, ds:group1

code segment byte public ;establish code segment first
code ends

data segment word ;but define data seg first
time dw SECONDS*18
oldint8 label dword
int8off dw 0
int8seg dw 0
bootaddr dd 7C00h ;0000:7C00h
msg$ db "OS/2 - DOS Dual Boot feature", 0Dh, 0Ah
db "Copyright (C) 1988 Ziff Communications Co. "
db "and PC Tech Journal", 0Dh, 0Ah, 0Ah
db "Boot: Enter = OS/2, Esc = DOS", 0Dh, 0Ah, 7, 0
even
dosboot db 'QQQQ' ;marker for patching in boot rec
db 508 dup (0) ;space for rest of boot rec
os2boot db 512 dup (0) ;space for other bootrec
data ends

code segment byte public ;resume same code segment
asksys proc
push ax
push bx
push cx
push si
push di
push ds
push es
mov ax,cs ;set ds to code segment
mov ds,ax
lea si,msg$ ;get address of message
boot1: lodsb
or al,al ;null byte = end of message
jz boot2
mov ah,0Eh ;write TTY function
int 10h ;BIOS video call
jmp boot1 ;loop til end of message
int8 = 8*4 ;address of int 8 vector
boot2: xor ax,ax
mov es,ax ;ES --> interrupt table
mov ax,es:int8 ;get int 8 address
mov bx,es:int8+2
mov int8off,ax ;save it
mov int8seg,bx
lea bx,timertick ;address of timer routine
cli ;hold off interrupts
mov es:int8,bx ;set timer interrupt
mov es:int8+2,cs
sti ;allow interrupts
boot3: mov ah,1 ;get keyboard status
int 16h
jnz boot4 ;key pressed if no zero flag
cmp time,0 ;else test for timeout
jg boot3 ;no timeout: test kb again
mov al,DEFAULT ;set default keystroke
jmp short boot5 ;go process it
boot4: xor ah,ah ;get the keystroke
int 16h
cmp al,27 ;is it escape?
je boot5
cmp al,13 ;is it return?
jne boot3 ;if neither, read kb again
boot5: mov bx,int8off ;get original int 8 vector
mov cx,int8seg
cli
mov es:int8,bx ;restore it in vector table
mov es:int8+2,cx
sti
lea si,dosboot ;load DOS boot record address
cmp al,27 ;escape = DOS
je boot6
lea si,os2boot ;else load OS2 boot rec address
boot6: les di,bootaddr ;ES:DI --> load addr for boot rec
mov cx,256 ;length of boot rec in words
rep movsw ;insert boot rec at boot address
pop es ;exit sequence
pop ds
pop di
pop si
pop cx
pop bx
pop ax
jmp cs:bootaddr ;branch to boot record
asksys endp

; Int 8, timer tick hardware interrupt, is repointed here.
; This routine counts down a time value and chains to original INT 8.

timertick proc
dec cs:time
jmp cs:oldint8
timertick endp
code ends
end


  3 Responses to “Category : Files from Magazines
Archive   : PCTJ8809.ZIP
Filename : ASKSYS.ASM

  1. Very nice! Thank you for this wonderful archive. I wonder why I found it only now. Long live the BBS file archives!

  2. This is so awesome! 😀 I’d be cool if you could download an entire archive of this at once, though.

  3. But one thing that puzzles me is the “mtswslnkmcjklsdlsbdmMICROSOFT” string. There is an article about it here. It is definitely worth a read: http://www.os2museum.com/wp/mtswslnk/