programming-examples/assembly/Burnout.asm
2019-11-15 12:59:38 +01:00

127 lines
4.5 KiB
NASM

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