programming-examples/assembly/Device Driver Header.asm

234 lines
7.3 KiB
NASM
Raw Normal View History

2019-11-15 12:59:38 +01:00
;-----------------------------------------------------------------------|
;
; Device Driver Library
; Device Driver Header
;
;-----------------------------------------------------------------------|
PAGE
;-----------------------------------------------------------------------|
; Equates
;-----------------------------------------------------------------------|
StkSiz EQU 2048 ; local stack size
PAGE
;-----------------------------------------------------------------------|
; Group Selection
;-----------------------------------------------------------------------|
PGROUP Group PROG, TAIL
DGROUP Group DATA, DTAIL
PROG Segment Para Public 'PROG'
PROG EndS
DATA Segment Para Public 'DATA' ; define first
DATA EndS
Assume CS:PROG, DS:DATA, ES:DATA, SS:DATA
PAGE
;-----------------------------------------------------------------------|
; Program Segment
;-----------------------------------------------------------------------|
PROG Segment Para Public 'PROG'
Extrn Init:Near, MediaChe:Near, BuildBPB:Near
Extrn IoCtlIn:Near, Input:Near, ndInput:Near
Extrn InputSta:Near, InputFlu:Near, Output:Near
Extrn OutVerif:Near, OutStatu:Near, OutFlush:Near
Extrn IoCtlOut:Near, DevOpen:Near, DevClose:Near
Extrn RemMedia:Near
ORG 0
HDR Proc Far
;-----------------------------------------------------------------------|
; Device Header
;-----------------------------------------------------------------------|
DD -1 ; -> next device
; DW theAttribute ; you must enter attribute field
DW 8000H ; character only device
DW Strategy ; -> device strategy
DW Interrupt ; -> device interrupt
; DB theName ; you must put something here
DB "MON " ; mono
;-----------------------------------------------------------------------|
; Code Segment Variables
;-----------------------------------------------------------------------|
RHptr DD (?) ; -> Request Header
ssEntry DW (?) ; entry SS
spEntry DW (?) ; entry SP
PAGE
;-----------------------------------------------------------------------|
; Device Strategy
;
; ENTRY : ES:BX -> Request Header
;
; EXIT : Request Header copied to ReqHdr
; all registers preserved
;
;-----------------------------------------------------------------------|
Strategy:
MOV Word Ptr CS:RHptr,BX ; save request header ptr
MOV Word Ptr CS:RHptr + 2,ES
PUSHF ; (+1) save the world
PUSH ES ; (+2)
PUSH DS ; (+3)
PUSH SI ; (+4)
PUSH DI ; (+5)
PUSH CX ; (+6)
PUSH BX ; (+7)
MOV SI,BX
MOV BX,ES
MOV DS,BX ; DS:SI -> Request Header
MOV BX,Offset PGROUP:TAIL
MOV CL,4
SHR BX,CL
MOV CX,CS
ADD BX,CX
MOV ES,BX
MOV DI,Offset DGROUP:ReqHdr ; ES:DI -> ReqHdr
CLD
XOR CH,CH
MOV CL,[SI]
REP MOVSB ; copy Request Header
POP BX ; (+6) restore
POP CX ; (+5)
POP DI ; (+4)
POP SI ; (+3)
POP DS ; (+2)
POP ES ; (+1)
POPF ; (+0)
RET
PAGE
;-----------------------------------------------------------------------|
; Device Interrupt
;
; ENTRY : anything
;
; EXIT : all registers preserved
;
;-----------------------------------------------------------------------|
Interrupt:
PUSH DS ; (+1) save the world
PUSH ES ; (+2)
PUSH AX ; (+3)
PUSH BX ; (+4)
PUSH CX ; (+5)
PUSH DX ; (+6)
PUSH SI ; (+7)
PUSH DI ; (+8)
PUSH BP ; (+9)
MOV CS:ssEntry,SS ; save entry SS
MOV CS:spEntry,SP ; and SP
MOV AX,Offset PGROUP:TAIL ; set our DS, SS, BP, and SP
MOV CL,4
SHR AX,CL
MOV CX,CS
ADD AX,CX
MOV BX,Offset DGROUP:MyStack
MOV DS,AX
MOV ES,AX
MOV SS,AX
MOV SP,BX
MOV BP,BX
;
; call our function
;
MOV AL,ReqHdr + 2 ; AL = Command Code
SHL AL,1
CBW
MOV SI,Offset DGROUP:FuncTab
ADD SI,AX
CALL Word Ptr [SI]
;
; copy back Request Header
;
LES DI,RHptr ; ES:DI -> original space
MOV SI,Offset DGROUP:ReqHdr ; DS:SI -> our (updated) copy
CLD
XOR CH,CH
MOV CL,[SI]
REP MOVSB ; copy Request Header
MOV SS,CS:ssEntry ; restore original stuff
MOV SP,CS:spEntry
POP BP ; (+8) restore
POP DI ; (+7)
POP SI ; (+6)
POP DX ; (+5)
POP CX ; (+4)
POP BX ; (+3)
POP AX ; (+2)
POP ES ; (+1)
POP DS ; (+0)
RET
HDR EndP
PROG EndS
TAIL Segment Public 'PROG' ; for finding end of code segment
TAIL EndS
PAGE
;-----------------------------------------------------------------------|
; Data Segment
;-----------------------------------------------------------------------|
DATA Segment Para Public 'DATA'
Public ReqHdr
DB StkSiz DUP (?) ; our stack, overflows into code
MyStack Label Word
FuncTab Label Word
DW Offset PGROUP:Init
DW Offset PGROUP:MediaChe
DW Offset PGROUP:BuildBPB
DW Offset PGROUP:IoCtlIn
DW Offset PGROUP:Input
DW Offset PGROUP:ndInput
DW Offset PGROUP:InputSta
DW Offset PGROUP:InputFlu
DW Offset PGROUP:Output
DW Offset PGROUP:OutVerif
DW Offset PGROUP:OutStatu
DW Offset PGROUP:OutFlush
DW Offset PGROUP:IoCtlOut
DW Offset PGROUP:DevOpen
DW Offset PGROUP:DevClose
DW Offset PGROUP:RemMedia
ReqHdr DB 256 DUP (?) ; copy of Request Header
DATA EndS
DTAIL Segment Public 'DATA' ; for finding end of data segment
DTAIL EndS
END HDR ; of HDR.ASM