Burnout

COMMENT *

  Demo (and semi-useful) program to read/set burnout device parameters.

  Usage: burnout [ticks] [C+-] [V+-] [H+-]

  Parameters can be separated by almost anything.
  With no parameters, program simply returns current status.

  Examples:
    burnout 5000                (sets time to 5000 ticks)
    burnout 5000H+              (time=5000, use hardware blanking)
    burnout 5000,h+             (ditto, separators don't matter)
    burnout c+h-v+              (continuous clear, software, monitor video)
    burnout /C+ /H- /V+         (ditto)
    burnout                     (return status only)

  Assembly/link:
    masm burnout;
    link burnout;  (ignore NO STACK warning message)
    exe2bin burnout burnout.com


stdout equ 1                            ; DOS output files
stderr equ 2

; ----- General equates
DOS         equ 21H                     ; DOS interrupt
TERMINATE   equ 20H                     ; Exit to DOS

PRINT       equ 09H                     ; DOS "print" string to stdout
FOPEN       equ 3D02H                   ; DOS file open, read/write
FREAD       equ 3FH                     ; DOS file read
FWRITE      equ 40H                     ; DOS file write

CR          equ 13                      ; ASCII carriage return
LF          equ 10                      ; ASCII line fine

code segment
assume cs:code,ds:code

org 80H                                 ; Parm storage area in PSP
ParmLength label byte                   ; Length of parms
org 81H
Parameters label byte                   ; Start of parms

org 100H                                ; Org for .COM
main proc far
        jmp start                       ; Hate to execute data

DevName         db 'BRNDEV',0           ; Burnout device name
handle          dw ?                    ; Storage for handle
Flush           db '@'                  ; Char to flush device I/O
Execute         db '#'                  ; Char to execute device commands

NotInstalled    db 'Burnout device is not installed',13,10
NotInstalledL   equ $ - NotInstalled

Status          db 'Current status: '   ; Status message
StatInsert      db 40 dup (?)           ; brndev will store status here

; ----- Open the device
start:
        mov dx,offset DevName           ; DS:DX => device name
        mov ax,FOPEN
        int DOS
        jnc A1                          ; Continue if no error
        mov bx,stderr                   ; Message to stderr
        mov cx,NotInstalledL
        mov dx,offset NotInstalled
        mov ah,FWRITE
        int DOS
        jmp exit

; ----- Flush any pending I/O to/from the device
A1:
        mov handle,ax                   ; Save device handle
        mov dx,offset Flush             ; Point to the "@"
        mov cx,1                        ; Writing one byte
        mov bx,handle                   ; Device handle
        mov ah,FWRITE                   ; Write "@" to device
        int DOS

; ----- Send and execute parameters if present
        mov cl,ParmLength               ; Parm length to CL
        or cl,cl                        ; Any parms present?
        jz A2                           ; Skip if not
        xor ch,ch                       ; CX = parm length
        mov dx,offset Parameters        ; DS:DX => parms
        mov bx,handle                   ; BX = device handle
        mov ah,FWRITE                   ; Write parms to device
        int DOS

        mov dx,offset Execute           ; Execute the parms
        mov cx,1                        ; Writing one byte
        mov bx,handle                   ; Device handle
        mov ah,FWRITE                   ; Write "#" to device
        int DOS


; ----- Get and display device status
A2:
        mov dx,offset StatInsert        ; DS:DX => where to put status
        mov cx,0FFH                     ; Ask for lots of data; DOS will ...
                                        ; ... fetch only until CR found.
        mov bx,handle                   ; Device handle
        mov ah,FREAD                    ; Read device info
        int DOS

        mov cx,ax                       ; CX = actual # bytes read
        mov di,offset StatInsert        ; Where the stat data is stored
        add di,cx                       ; Add length of input read
        mov al,CR                       ; Store a CR/LF/'$' at end
        cld
        stosb
        mov al,LF
        stosb
        mov al,'$'
        stosb
        mov dx,offset Status            ; Write status to stdout
        mov ah,PRINT
        int DOS

exit:
        int TERMINATE                   ; Exit to DOS
main endp
code ends
end main

Designed By Blogger Templates | Templatelib & Distributed By Blogspot Templates