651 lines
28 KiB
Plaintext
651 lines
28 KiB
Plaintext
|
;******************************************************************************
|
|||
|
;* *
|
|||
|
;* P C D I O *
|
|||
|
;* *
|
|||
|
;* D i r e c t I B M D O S C a l l s F r o m P L / I - 8 6 *
|
|||
|
;* *
|
|||
|
;******************************************************************************
|
|||
|
|
|||
|
DSEG
|
|||
|
extrn ?begin:word ;beginning of free list
|
|||
|
|
|||
|
CSEG
|
|||
|
public dfcb0 ;return address of default fcb 0
|
|||
|
public dfcb1 ;return address of default fcb 1
|
|||
|
public dbuff ;return address of default buffer
|
|||
|
|
|||
|
public memptr ;return pointer to base of free memory
|
|||
|
public memsiz ;return size of memory in bytes
|
|||
|
public memwds ;return size of memory in words
|
|||
|
|
|||
|
public reboot ;program terminate (reboot) (#0)
|
|||
|
public rdcon ;keyboard input (#1)
|
|||
|
public wrcon ;display output (#2)
|
|||
|
public rdrdr ;auxiliary input (#3)
|
|||
|
public wrpun ;auxiliary output (#4)
|
|||
|
public wrlst ;printer output (#5)
|
|||
|
public coninp ;direct console input (#6a)
|
|||
|
public conout ;direct console output (#6b)
|
|||
|
public din1 ;direct console input w/o echo (#7)
|
|||
|
public din2 ;console input w/o echo (#8)
|
|||
|
public wrstr ;print string (#9)
|
|||
|
public rdbuf ;buffered keyboard input (#10)
|
|||
|
public break ;check keyboard status (#11)
|
|||
|
public clrkb1 ;clear keyboard buffer & invoke fcn 1,6,7, or 8 (#12a)
|
|||
|
public clrkb2 ;clear keyboard buffer & invoke fcn 10 (#12b)
|
|||
|
public reset ;disk reset (#13)
|
|||
|
public select ;select disk (#14)
|
|||
|
public open ;open file (#15)
|
|||
|
public close ;close file (#16)
|
|||
|
public sear ;search for first entry (#17)
|
|||
|
public searn ;search for next entry (#18)
|
|||
|
public delete ;delete file (#19)
|
|||
|
public rdseq ;sequential read (#20)
|
|||
|
public wrseq ;sequential write (#21)
|
|||
|
public make ;create file (#22)
|
|||
|
public rename ;rename file (#23)
|
|||
|
;not used (#24)
|
|||
|
public curdsk ;current disk (#25)
|
|||
|
public setdma ;set disk transfer address (#26)
|
|||
|
public alltbl ;allocation table address (#27)
|
|||
|
;not used (#28-32)
|
|||
|
public rdran ;random read (#33)
|
|||
|
public wrran ;random write (#34)
|
|||
|
public filsiz ;file size (#35)
|
|||
|
public setrec ;set random record field (#36)
|
|||
|
;public setint ;set interrupt vector (#37) NOT IMPLEMENTED
|
|||
|
public newseg ;create new program segment (#38)
|
|||
|
public blockrd ;random block read (#39)
|
|||
|
public blockwr ;random block write (#40)
|
|||
|
public parsfn ;parse filename (#41)
|
|||
|
public getdate ;get date (#42)
|
|||
|
public setdate ;set date (#43)
|
|||
|
public gettime ;get time (#44)
|
|||
|
public settime ;set time (#45)
|
|||
|
public setver ;set/reset verify switch (#46)
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* F u n c t i o n N u m b e r s & O t h e r E q u a t e s *
|
|||
|
;******************************************************************************
|
|||
|
rdkeyf equ 1 ;keyboard input (#1)
|
|||
|
writc equ 2 ;display output (#2)
|
|||
|
rdauxf equ 3 ;auxiliary input (#3)
|
|||
|
wrauxf equ 4 ;auxiliary output (#4)
|
|||
|
prtf equ 5 ;printer output (#5)
|
|||
|
diof equ 6 ;direct console I/O (#6)
|
|||
|
din1f equ 7 ;direct console input w/o echo (#7)
|
|||
|
din2f equ 8 ;console input w/o echo (#8)
|
|||
|
printf equ 9 ;print string (#9)
|
|||
|
rdbufr equ 10 ;buffered keyboard input (#10)
|
|||
|
statf equ 11 ;check keyboard status (#11)
|
|||
|
clrbuff equ 12 ;clear keyboard buffer (#12)
|
|||
|
resetf equ 13 ;disk reset (#13)
|
|||
|
seldf equ 14 ;select disk (#14)
|
|||
|
openf equ 15 ;open file (#15)
|
|||
|
closef equ 16 ;close file (#16)
|
|||
|
serchf equ 17 ;search for first entry (#17)
|
|||
|
serchn equ 18 ;search for next entry (#18)
|
|||
|
deletf equ 19 ;delete file (#19)
|
|||
|
readf equ 20 ;sequential read (#20)
|
|||
|
writf equ 21 ;sequential write (#21)
|
|||
|
makef equ 22 ;create file (#22)
|
|||
|
renamf equ 23 ;rename file (#23)
|
|||
|
cdiskf equ 25 ;current disk (#25)
|
|||
|
setdtf equ 26 ;set disk transfer address (#26)
|
|||
|
getalf equ 27 ;allocation table address (#27)
|
|||
|
rdranf equ 33 ;random read (#33)
|
|||
|
wrranf equ 34 ;random write (#34)
|
|||
|
filszf equ 35 ;file size (#35)
|
|||
|
setrcf equ 36 ;set random record field (#36)
|
|||
|
setintf equ 37 ;set interrupt vector (#37)
|
|||
|
newsgf equ 38 ;create new program segment (#38)
|
|||
|
blkrdf equ 39 ;random block read (#39)
|
|||
|
blkwrf equ 40 ;random block write (#40)
|
|||
|
parsf equ 41 ;parse filename (#41)
|
|||
|
gdatef equ 42 ;get date (#42)
|
|||
|
sdatef equ 43 ;set date (#43)
|
|||
|
gtimef equ 44 ;get time (#44)
|
|||
|
stimef equ 45 ;set time (#45)
|
|||
|
setverf equ 46 ;set/reset verify switch (#46)
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* *
|
|||
|
;* G e n e r a l P u r p o s e R o u t i n e s *
|
|||
|
;* *
|
|||
|
;******************************************************************************
|
|||
|
|
|||
|
?pcdos: ;the call to IBM DOS
|
|||
|
int 21h ;DOS interrupt number
|
|||
|
ret
|
|||
|
|
|||
|
getp1: ;get single byte parameter to register DL
|
|||
|
mov bx,[bx] ;BX = pointer to char
|
|||
|
mov dl,[bx] ;to register DL
|
|||
|
ret
|
|||
|
|
|||
|
getp2: ;get single word value to DX
|
|||
|
getp2i: ;(equivalent to getp2)
|
|||
|
mov bx,[bx]
|
|||
|
mov dx,[bx]
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* *
|
|||
|
;* T h e I B M D O S R o u t i n e s *
|
|||
|
;* *
|
|||
|
;******************************************************************************
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* M E M P T R *
|
|||
|
;******************************************************************************
|
|||
|
memptr: ;return pointer to base of free storage
|
|||
|
mov bx,?begin
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* M E M S I Z *
|
|||
|
;******************************************************************************
|
|||
|
memsiz: ;return size of free memory in bytes
|
|||
|
mov bx,word ptr .6 ;top of available memory
|
|||
|
sub bx,?begin ;subtract beginning of free storage
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* M E M W D S *
|
|||
|
;******************************************************************************
|
|||
|
memwds: ;return size of free memory in words
|
|||
|
call memsiz ;BX = size in bytes
|
|||
|
shr bx,1 ;BX = size in words
|
|||
|
ret ;with words in BX
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* D F C B 0 *
|
|||
|
;******************************************************************************
|
|||
|
dfcb0: ;return address of default fcb 0
|
|||
|
mov bx,5ch
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* D F C B 1 *
|
|||
|
;******************************************************************************
|
|||
|
dfcb1: ;return address of default fcb 1
|
|||
|
mov bx,6ch
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* D B U F F *
|
|||
|
;******************************************************************************
|
|||
|
dbuff: ;return address of default buffer
|
|||
|
mov bx,80h
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* REBOOT #0 *
|
|||
|
;******************************************************************************
|
|||
|
reboot: ;system reboot (#0)
|
|||
|
;Location 40h in the base page has the INT 20h needed to
|
|||
|
;reboot. This routine sets up an offset of 0 with that
|
|||
|
;segment and jumps to it, executing the INT 20.
|
|||
|
mov word ptr .3eh,0 ;set up an offset of zero...
|
|||
|
jmpf dword ptr .3eh ;jump to it
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R D C O N #1 *
|
|||
|
;******************************************************************************
|
|||
|
rdcon: ;read console character (#1)
|
|||
|
;return character value to stack
|
|||
|
mov ah,rdkeyf ;function number
|
|||
|
jmps chrin ;common code to read char
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* W R C O N #2 *
|
|||
|
;******************************************************************************
|
|||
|
wrcon: ;write console character(#2)
|
|||
|
mov ah,writc ;console write function
|
|||
|
jmps chrout ;to write the character
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R D R D R #3 *
|
|||
|
;******************************************************************************
|
|||
|
rdrdr: ;read reader character (#3)
|
|||
|
mov ah,rdauxf ;reader function
|
|||
|
chrin:
|
|||
|
;common code for character input
|
|||
|
call ?pcdos ;value returned to AL
|
|||
|
chrin2: pop bx ;return address
|
|||
|
mov ah,al ;char to AH
|
|||
|
push ax ;character to stack
|
|||
|
inc sp ;delete garbage byte
|
|||
|
mov al,1 ;character length is 1
|
|||
|
jmp bx ;back to calling routine
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* W R P U N #4 *
|
|||
|
;******************************************************************************
|
|||
|
wrpun: ;write punch character (#4)
|
|||
|
mov ah,wrauxf ;punch output function
|
|||
|
jmps chrout ;common code to write chr
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* W R L S T #5 *
|
|||
|
;******************************************************************************
|
|||
|
wrlst: ;write list character (#5)
|
|||
|
mov ah,prtf ;list output function
|
|||
|
chrout:
|
|||
|
;common code to write character
|
|||
|
call getp1 ;output char to register DL
|
|||
|
jmp ?pcdos ;to write and return
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* C O N I N P #6A *
|
|||
|
;******************************************************************************
|
|||
|
coninp: ;perform console input, char returned in stack (#6a)
|
|||
|
;returns a zero if no char is ready.
|
|||
|
mov ah,diof
|
|||
|
mov dl,0ffh
|
|||
|
call ?pcdos ;value returned to AL
|
|||
|
jnz chrin2 ;if a char ready,send it back
|
|||
|
mov al,0 ;otherwise, return a 0
|
|||
|
jmp chrin2 ;use common input-return code
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* C O N O U T #6B *
|
|||
|
;******************************************************************************
|
|||
|
conout: ;direct console output (#6b)
|
|||
|
call getp1 ;get parameter to DL
|
|||
|
mov ah,diof ;direct console I/O
|
|||
|
jmp ?pcdos
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* D I N 1 #7 *
|
|||
|
;******************************************************************************
|
|||
|
din1: ;direct console input without echo (#7)
|
|||
|
mov ah,din1f
|
|||
|
jmps chrin ;value returned to AL
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* D I N 2 #8 *
|
|||
|
;******************************************************************************
|
|||
|
din2: ;console input without echo (#8)
|
|||
|
mov ah,din2f
|
|||
|
jmps chrin ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* W R S T R #9 *
|
|||
|
;******************************************************************************
|
|||
|
wrstr: ;write string (#9)
|
|||
|
call getp2 ;get parameter value to DX
|
|||
|
mov ah,printf ;print string function
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R D B U F #10 *
|
|||
|
;******************************************************************************
|
|||
|
rdbuf: ;read console buffer (#10)
|
|||
|
call getp2i ;DX = pointer to buff
|
|||
|
mov ah,rdbufr ;read console function
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* B R E A K #11 *
|
|||
|
;******************************************************************************
|
|||
|
break: ;check keyboard status (#11)
|
|||
|
;returns FFh if char ready at keyboard, 0 otherwise
|
|||
|
mov ah,statf
|
|||
|
jmp ?pcdos ;return thru DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* C L R K B 1 #12A *
|
|||
|
;******************************************************************************
|
|||
|
clrkb1: ;clear keyboard buffer & invoke input fcn 1,6,7,8 (#12a)
|
|||
|
;NOTE: this function does NOT check to make sure only functions
|
|||
|
;1,6,7,8 are used, as PCDOS will when the call is made.
|
|||
|
call getp1 ;get function number...
|
|||
|
mov al,dl ;...to AL
|
|||
|
mov ah,clrbuff ;function number
|
|||
|
;fcns 1,7,8 can be done by same code; 6 is different
|
|||
|
cmp al,1 ;fcn 1?
|
|||
|
jz chrin ;yes, go do it
|
|||
|
cmp al,7 ;fcn 7?
|
|||
|
jz chrin ;do it
|
|||
|
cmp al,8 ;fcn 8?
|
|||
|
jz chrin ;do it
|
|||
|
;must be function 6
|
|||
|
mov dl,0ffh
|
|||
|
call ?pcdos ;value returned to AL
|
|||
|
jnz chrin2 ;if a char ready,send it back
|
|||
|
mov al,0 ;otherwise, return a 0
|
|||
|
jmp chrin2 ;use common input-return code
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* C L R K B 2 #12B *
|
|||
|
;******************************************************************************
|
|||
|
clrkb2: ;clear keyboard buffer & invoke input fcn 10 (#12b)
|
|||
|
;this routine is different from the above in that function 10
|
|||
|
;requires a pointer to an input buffer.
|
|||
|
mov si,[bx] ;get ptr to 1st parm (fcn#)
|
|||
|
mov ax,[si] ;fcn# to AL
|
|||
|
mov si,2[bx] ;ptr to 2nd parm (input buffer pointer)
|
|||
|
mov dx,[si] ;pointer to input buffer to DX
|
|||
|
mov ah,clrbuff ;function number
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R E S E T #13 *
|
|||
|
;******************************************************************************
|
|||
|
reset: ;reset disk system (#13)
|
|||
|
mov ah,resetf
|
|||
|
jmp ?pcdos
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E L E C T #14 *
|
|||
|
;******************************************************************************
|
|||
|
select: ;select disk (#14)
|
|||
|
call getp1 ;disk number to DL
|
|||
|
mov ah,seldf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* O P E N #15 *
|
|||
|
;******************************************************************************
|
|||
|
open: ;open file (#15)
|
|||
|
call getp2i ;fcb address to DX
|
|||
|
mov ah,openf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* C L O S E #16 *
|
|||
|
;******************************************************************************
|
|||
|
close: ;close file (#16)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,closef
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E A R #17 *
|
|||
|
;******************************************************************************
|
|||
|
sear: ;search for file (#17)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,serchf
|
|||
|
jmp ?pcdos
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E A R N #18 *
|
|||
|
;******************************************************************************
|
|||
|
searn: ;search for next (#18)
|
|||
|
call getp2 ;get pointer to FCB
|
|||
|
mov ah,serchn ;search next function
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* D E L E T E #19 *
|
|||
|
;******************************************************************************
|
|||
|
delete: ;delete file (#19)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,deletf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R D S E Q #20 *
|
|||
|
;******************************************************************************
|
|||
|
rdseq: ;sequential read (#20)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,readf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* W R S E Q #21 *
|
|||
|
;******************************************************************************
|
|||
|
wrseq: ;sequential write (#21)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,writf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* M A K E #22 *
|
|||
|
;******************************************************************************
|
|||
|
make: ;create file (#22)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,makef
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R E N A M E #23 *
|
|||
|
;******************************************************************************
|
|||
|
rename: ;rename file (#23)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,renamf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* C U R D S K #25 *
|
|||
|
;******************************************************************************
|
|||
|
curdsk: ;return current disk number (#25)
|
|||
|
mov ah,cdiskf
|
|||
|
jmp ?pcdos ;return value in AL
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E T D M A #26 *
|
|||
|
;******************************************************************************
|
|||
|
setdma: ;set DMA address (#26)
|
|||
|
call getp2 ;dma address to DX
|
|||
|
mov ah,setdtf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* A L L T B L #27 *
|
|||
|
;******************************************************************************
|
|||
|
alltbl: ;return address of allocation table (#27)
|
|||
|
;first get pointer to FAT to set up destination
|
|||
|
mov si,[bx] ;get pointer to 1st parm
|
|||
|
mov di,[si] ;get offset into DI...
|
|||
|
push ds ;get segment into ES...
|
|||
|
pop es ;now destination is set
|
|||
|
;now do the call to PCDOS
|
|||
|
push bx ;save current BX (will be overwritten)
|
|||
|
push ds ;save current DS (will be overwritten)
|
|||
|
mov ah,getalf ;function number
|
|||
|
call ?pcdos ;do it
|
|||
|
;set up the source
|
|||
|
mov bp,ds ;move DS value to BP
|
|||
|
mov si,bx ;SI gets offset, DS already contains segment
|
|||
|
;move the FAT
|
|||
|
push cx ;save CX for later
|
|||
|
mov cx,512 ;number of bytes to move (size of FAT)
|
|||
|
rep movsb ;move it
|
|||
|
;table is moved, now send back other info
|
|||
|
pop cx ;get back former CX
|
|||
|
pop ds ;get back former DS
|
|||
|
pop bx ;and the old BX
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm
|
|||
|
mov si,[si] ;get parm
|
|||
|
mov [si],dx ;put no. of alloc units in 2nd parm
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm
|
|||
|
mov si,[si] ;get parm
|
|||
|
mov [si],al ;put #recs/alloc unit in 3rd parm
|
|||
|
mov si,6[bx] ;get pointer to 4th parm
|
|||
|
mov si,[si] ;get parm
|
|||
|
mov [si],cx ;put size of phys. sect. in 4th parm
|
|||
|
ret ;done!
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* R D R A N #33 *
|
|||
|
;******************************************************************************
|
|||
|
rdran: ;random read (#33)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,rdranf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* W R R A N #34 *
|
|||
|
;******************************************************************************
|
|||
|
wrran: ;random write (#34)
|
|||
|
call getp2i ;FCB pointer to DX
|
|||
|
mov ah,wrranf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* F I L S I Z #35 *
|
|||
|
;******************************************************************************
|
|||
|
filsiz: ;compute file size (#35)
|
|||
|
call getp2 ;FCB pointer to DX
|
|||
|
mov ah,filszf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E T R E C #36 *
|
|||
|
;******************************************************************************
|
|||
|
setrec: ;set random record position (#36)
|
|||
|
call getp2 ;FCB pointer to DX
|
|||
|
mov ah,setrcf
|
|||
|
jmp ?pcdos ;return through DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E T I N T #37 *
|
|||
|
;******************************************************************************
|
|||
|
;setint: ;set interrupt vector (#37)
|
|||
|
;NOT IMPLEMENTED
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* N E W S E G #38 *
|
|||
|
;******************************************************************************
|
|||
|
newseg: ;create new program segment (#38)
|
|||
|
; WARNING: This procedure has NOT been tested. Use it at your own risk!
|
|||
|
call getp2 ;get segment where new prog will start
|
|||
|
mov ah,newsgf ;function number
|
|||
|
jmp ?pcdos ;return thru DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* B L O C K R D #39 *
|
|||
|
;******************************************************************************
|
|||
|
blockrd: ; Random Block Read (#39)
|
|||
|
;call blockrd(fcbptr,count,actualptr,retptr)
|
|||
|
mov si,[bx] ;get pointer to 1st parm (FCB ptr)
|
|||
|
mov dx,[si] ;put pointer to FCB in DX
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm (count)
|
|||
|
mov cx,[si] ;move count to CX
|
|||
|
mov AH,blkrdf ;random block read function number
|
|||
|
call ?pcdos ;do it
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm (actual count)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],cx ;put actual count in 3rd parm
|
|||
|
mov si,6[bx] ;get pointer to 4th parm (return code)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],al ;put return code in 4th parm
|
|||
|
ret ;done!
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* B L O C K W R #40 *
|
|||
|
;******************************************************************************
|
|||
|
blockwr: ;random block write (#40)
|
|||
|
;call blockwr(fcbptr,count,actualptr,retptr)
|
|||
|
mov si,[bx] ;get pointer to 1st parm (FCB ptr)
|
|||
|
mov dx,[si] ;put pointer to FCB in DX
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm (count)
|
|||
|
mov cx,[si] ;move count to CX
|
|||
|
mov AH,blkwrf ;block write function number
|
|||
|
call ?pcdos ;do it
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm (actual count)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],cx ;put actual count in 3rd parm
|
|||
|
mov si,6[bx] ;get pointer to 4th parm (return code)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],al ;put return code in 4th parm
|
|||
|
ret ;done!
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* P A R S F N #41 *
|
|||
|
;******************************************************************************
|
|||
|
parsfn: ;parse file name (#41)
|
|||
|
;this function will update the two pointers passed in and return a code
|
|||
|
;ret_code = PARSFN(addr(comptr),addr(fcbptr),action)
|
|||
|
mov si,[bx] ;
|
|||
|
mov si,[si] ;get ptr to ptr to command line...
|
|||
|
mov si,[si] ;now get ptr to command line in SI
|
|||
|
mov di,4[bx] ;get 3rd parm
|
|||
|
mov al,[di] ;move it to AL
|
|||
|
mov di,2[bx] ;get 2nd parameter...
|
|||
|
mov di,[di] ;...pointer to pointer to new FCB...
|
|||
|
mov di,[di] ;...and pointer to new FCB in DI
|
|||
|
push ds ;copy current DS...
|
|||
|
pop es ;...to ES
|
|||
|
mov ah,parsf ;function number
|
|||
|
jmp ?pcdos ;do it, return through PCDOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* G E T D A T E #42 *
|
|||
|
;******************************************************************************
|
|||
|
getdate: ;get date (#42)
|
|||
|
mov ah,gdatef ;function number
|
|||
|
call ?pcdos ;do it
|
|||
|
mov si,[bx] ;get pointer to 1st parm (yr)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],cx ;store year
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm (mo)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],dh ;store month
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm (day)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],dl ;store day
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E T D A T E #43 *
|
|||
|
;******************************************************************************
|
|||
|
setdate: ;set date (#43)
|
|||
|
mov si,[bx] ;get pointer to 1st parm (yr)
|
|||
|
mov cx,[si] ;put year in CX
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm (mo)
|
|||
|
mov dh,[si] ;put month in DH
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm (day)
|
|||
|
mov dl,[si] ;put day in DL
|
|||
|
mov ah,sdatef ;function number
|
|||
|
jmp ?pcdos ;return thru DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* G E T T I M E #44 *
|
|||
|
;******************************************************************************
|
|||
|
gettime: ;get time (#44)
|
|||
|
mov ah,gtimef ;function number
|
|||
|
call ?pcdos ;do it
|
|||
|
mov si,[bx] ;get pointer to 1st parm (hrs)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],ch ;store hours
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm (min)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],cl ;store minutes
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm (sec)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],dh ;store seconds
|
|||
|
mov si,6[bx] ;get pointer to 4th parm (1/100 sec)
|
|||
|
mov si,[si] ;
|
|||
|
mov [si],dl ;store 1/100 sec.
|
|||
|
ret
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E T T I M E #45 *
|
|||
|
;******************************************************************************
|
|||
|
settime: ;set time (#45)
|
|||
|
mov si,[bx] ;get pointer to 1st parm (hrs)
|
|||
|
mov ch,[si] ;put hours in CH
|
|||
|
mov si,2[bx] ;get pointer to 2nd parm (min)
|
|||
|
mov cl,[si] ;put minutes in CL
|
|||
|
mov si,4[bx] ;get pointer to 3rd parm (sec)
|
|||
|
mov dh,[si] ;put seconds in DH
|
|||
|
mov si,6[bx] ;get pointer to 4th parm (1/100 sec)
|
|||
|
mov dl,[si] ;put 1/100 sec in DL
|
|||
|
mov ah,stimef ;function number
|
|||
|
jmp ?pcdos ;return thru DOS
|
|||
|
|
|||
|
;******************************************************************************
|
|||
|
;* S E T V E R #46 *
|
|||
|
;******************************************************************************
|
|||
|
setver: ;set/reset verify switch (#46)
|
|||
|
call getp1 ;get parm...
|
|||
|
mov al,dl ;to AL
|
|||
|
mov dl,0 ;DL must be zero for call
|
|||
|
mov ah,setverf ;function number
|
|||
|
jmp ?pcdos ;return thru DOS
|
|||
|
|
|||
|
end
|
|||
|
|