home *** CD-ROM | disk | FTP | other *** search
- PAGE 66,132
- TITLE RBBS-PC Assembly Language Subroutines Copyright 1986, by D. Thomas Mack
- ;
- ; Changes made by Scott McNay (1:395/11) July 26, 1992, to allow routine to be
- ; used with code compiled with BC's /Fs option. (Most) changes marked with
- ; ;BCFS0726. May have optimized some code also. This is a plug-in replacement
- ; for the original code.
- ;
- ; Also commented out RBBSDOS routine, since RBBS doesn't use it anymore.
-
- ;BCFS0801: Standardized code format. Made sure that DI, SI, BP, and DS are
- ; saved to meet requirements of BC 7.x.
-
- ;BCFS0913: Fixed bug that I accidentally introduced into the RBBSFREE routine.
-
- ;-----------------------------------------------------------------------;
- ;ROUTINE: RBBSFIND AUTHOR: D. Thomas Mack ;
- ; 10210 Oxfordshire Road ;
- ; Great Falls, Virginia 22066 ;
- ; ;
- ;DATE: June 29, 1986 VERSION: 1.0 ;
- ; ;
- ;FUNCTION: This routine supports calls from the IBM (MICROSOFT) ;
- ; BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0 ;
- ; compilers to find the date a file was created. ;
- ; ;
- ; CALL RBBSFIND (A$,ERROR%,YEAR%,MONTH%,DAY%) ;
- ; ;
- ; where A$ is the fully qualified file name to find the ;
- ; date for and all other parameters are zeroes. ;
- ; ;
- ; Offset Variable Description of Variable ;
- ; ;
- ; BP+14 BX = string descriptor address of the file name to ;
- ; find the creation date for where the string ;
- ; descriptor has the format: ;
- ; ;
- ; Bytes 0 and 1 contain the length of the string ;
- ; (0 to 32,767). ;
- ; Bytes 2 and 3 contain the lower and upper 8 bits ;
- ; of the string's starting address ;
- ; in string space (respectively). ;
- ; BP+12 ERROR% = Zero if no error was encountered. Non-zero if an ;
- ; error occurred. ;
- ; BP+10 YEAR% = number of years since 1980 when file was last ;
- ; modified. ;
- ; BP+8 MONTH% = month the file was last modified. ;
- ; BP+6 DAY% = day the file was last modified. ;
- ; ;
- ;-----------------------------------------------------------------------;
-
- Extrn StringAddress:far ;BCFS0726
-
- ;
- ; LIST OF PARAMETERS AS THEY APPEAR ON THE STACK
- ;
- PARMLIST STRUC
- SAVE_BP DW ? ;RETAINS CONTENTS OF BASE POINTER REGISTER
- RET_OFF DW ? ;RETURN ADDRESS OF CALLING PROGRAM
- RET_SEG DW ?
- PARM5 DW ? ;DAY FILE WAS CREATED
- PARM4 DW ? ;MONTH FILE WAS CREATED
- PARM3 DW ? ;YEAR FILE WAS CREATED (PAST 1980)
- PARM2 DW ? ;ERROR RETURN CODE
- PARM1 DW ? ;STRING DESCRIPTOR
- PARMLIST ENDS
- ;
- ; LET THE ASSEMBLER CALCULATE THE VALUE FOR RETURNING FROM SUBROUTINE WITH EQU
- ;
- PARMSIZE EQU OFFSET PARM1 - OFFSET RET_SEG
- ;
- ; DEFINE A STACK TO PUSH UP TO 3 ITEMS ON THE STACK AT ANY GIVEN TIME
- ;
- STACK SEGMENT WORD STACK 'STACK'
- DW 14 DUP(?)
- STACK ENDS
-
- RBBS_UTIL SEGMENT BYTE PUBLIC 'CODE'
- ASSUME CS:RBBS_UTIL
- SAVE_DTA_OFF DW ? ;ADDRESS OF CURRENT DISK TRANSFER AREA
- SAVE_DTA_SEG DW ?
- RBBSDTA DB 30 DUP(?) ;WORKING DTA (NOT BASIC'S)
- PATHFILE DB 64 DUP(?) ;PATH AND FILE NAME FOR SEARCH
- RBBSFIND PROC FAR ;LONG CALL
- PUBLIC RBBSFIND
- PUSH BP ;SAVE CALLER'S BASE POINTER REGISTER -- BP
- MOV BP,SP ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
- PUSH DS ;BCFS0726
- PUSH ES ;BCFS0801
- PUSH DI ;BCFS0726
- PUSH SI ;BCFS0726
- PUSH [BP].PARM1 ;GET A$ STRING DESCRIPTOR ADDRESS ;BCFS0726
- CALL StringAddress ;BCFS0726
- MOV SI,AX ;BCFS0726
- XOR AX,AX ;INDICATE NO ERROR CONDITIONS
- JCXZ FINISH ;EXIT ;BCFS0726
- PUSH DS ;BCFS0726
- MOV DS,DX ;BCFS0726
- PUSH CS ;BCFS0726
- POP ES ;BCFS0726
- MOV DI,offset PATHFILE ;MOVE PATH/FILE SPEC TO "PATHFILE" AREA
- CLD ;CLEAR DIRECTION FLAGS
- REP MOVSB ;END STRING WITH A BINARY ZERO FOR DOS CALL
- PUSH CS ;BCFS0726
- POP DS ;BCFS0726
- MOV BYTE PTR CS:[DI],0
- ;
- MOV AH,2FH ;GET DISK TRANSFER AREA ADDRESS IN BX
- INT 21H ;ISSUE DOS INTERRUPT 21
- MOV CS:SAVE_DTA_OFF,BX ;SAVE BASIC'S DISK TRANSFER AREA
- MOV CS:SAVE_DTA_SEG,ES
- POP ES ;BCFS0726
- JC FINISH ;EXIT IF THERE WERE ERRORS
- ;
- MOV DX,offset RBBSDTA ;SET UP PRIVATE DTA FROM BASIC'S
- MOV AH,1AH ;SETUP NEW TEMPORARY DTA
- INT 21H ;ISSUE DOS INTERRUPT 21
- JC FINISH ;EXIT IF THERE WERE ERRORS
- ;
- XOR CX,CX ;SET UP TO LOOK FOR ALL DIRECTORY ENTRIES
- MOV DX,offset PATHFILE ;FIND THE FIRST FILE THAT MATCHES "PATHFILE"
- MOV AH,4EH ;CALL DOS FUNCTION X'4E' TO FIND FILE
- INT 21H ;ISSUE DOS INTERRUPT 21
- JC EXIT ;EXIT IF THERE WERE ERRORS
- ;
- MOV DI,offset RBBSDTA+24 ;POINT TO DATE FIELD IN DTA (+24)
- MOV AX,DS:[DI] ;GET DATE OF FILE (DTA +24) IN AX REGISTER
- ; BITS 0-4 = DAY(1-31)
- ; BITS 5-8 = MONTH(1-12)
- ; BITS 9-15 = YEAR(0 - 119, AS AN OFFSET OF 1980)
- ; SET UP AS FOLLOWS:
- ;
- ; |<-------YEAR------->|<--MONTH-->|<-----DAY---->|
- ; |15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0|
- ; | | | | |
- ; 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 = X'01E0'
- ; 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 = X'001F'
-
- MOV BX,AX ;GET THE DATE INTO THE BX REGISTER
- MOV CL,9 ;PREPARE TO SHIFT RIGHT NINE BITS (0-8)
- SHR BX,CL ;SHIFT RIGHT NINE BITS LEAVING THE YEAR ONLY
- MOV DI,[BP].PARM3 ;GET ADDRESS OF WHERE TO PUT YEAR (AS AN INDEX
- MOV ES:[DI],BX ;PAST 1980) FILE WAS CREATED AND PASS IT BACK
- ;
- MOV BX,AX ;GET THE DATE INTO THE BX REGISTER AGAIN
- AND BX,01E0H ;TURN OFF ALL THE BITS EXCEPT BITS 5-8 (MONTH)
- MOV CL,5 ;PREPARE TO SHIFT RIGHT FIVE BITS (0-4)
- SHR BX,CL ;SHIFT RIGHT FIVE BITS TO GET MONTH ONLY
- MOV DI,[BP].PARM4 ;GET ADDR OF WHERE TO PUT MONTH FILE WAS MADE
- MOV ES:[DI],BX ;PASS BACK THE MONTH THE FILE WAS CREATED
- ;
- AND AX,001FH ;TURN OFF ALL THE BITS EXCEPT BITS 0-4 (DAY)
- MOV DI,[BP].PARM5 ;GET ADDRESS OF WHERE TO PUT DAY FILE WAS MADE
- MOV ES:[DI],AX ;PASS BACK THE DAY THE FILE WAS CREATED
- XOR AX,AX ;INDICATE NO ERROR CONDITIONS
- ;
- EXIT: PUSH AX ;SAVE ERROR INDICATOR REGISTER -- AX
- PUSH DS ;SAVE DATA SEGMENT REGISTER -- DS
- MOV DX,CS:SAVE_DTA_OFF ;RESTORE BASIC'S DTA AFTER CPC151A7+
- MOV DS,CS:SAVE_DTA_SEG ;SETTING UP THE TEMP RBBS-PC ONE CPC151A7+
- MOV AH,1AH ;CALL DOS FUNCTION '1A' TO CHANGE DTA'S
- INT 21H ;ISSUE DOS INTERRUPT 21 CPC151A7+
- POP DS ;RESTORE DATA SEGMENT REGISTER -- DS
- POP AX ;RESTORE ERROR INDICATOR REGISTER -- AX
- ;
- FINISH: MOV DI,[BP].PARM2 ;GET ADDRESS OF WHERE TO PUT ERROR RETURN CODE
- MOV ES:[DI],AX ;PUT THE ERROR RETURN CODE IN ERROR%
- POP SI ;BCFS0726
- POP DI ;BCFS0726
- POP ES ;BCFS0801
- POP DS ;BCFS0726
- POP BP ;RESTORE CALLERS BASE POINTER REGISTER-- BP
- RET PARMSIZE ;RETURN AND REMOVE THE 5 PARAMETERS FROM STACK
- RBBSFIND ENDP
- ;-----------------------------------------------------------------------;
- ;ROUTINE: RBBSULC AUTHOR: D. Thomas Mack ;
- ; 10210 Oxfordshire Road ;
- ; Great Falls, Virginia 22066 ;
- ; ;
- ;DATE: June 29, 1986 VERSION: 1.0 ;
- ; ;
- ;FUNCTION: This routine supports calls from the IBM (MICROSOFT) ;
- ; BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0 ;
- ; compilers to convert a string to upper case alphabetic ;
- ; characters. ;
- ; ;
- ; CALL RBBSULC (A$) ;
- ; ;
- ; where A$ is the string to be converted to upper case. ;
- ; ;
- ; Offset Variable Description of Variable ;
- ; ;
- ; BP+6 BX = string descriptor address where the string ;
- ; descriptor has the format: ;
- ; ;
- ; Bytes 0 and 1 contain the length of the string ;
- ; (0 to 32,767). ;
- ; Bytes 2 and 3 contain the lower and upper 8 bits ;
- ; of the string's starting address ;
- ; in string space (respectively). ;
- ; ;
- ;-----------------------------------------------------------------------;
- ;RBBSULC PROC FAR ;LONG CALL
- ; PUBLIC RBBSULC
- ; PUSH BP ;SAVE CALLERS BASE POINTER REGISTER -- BP
- ; MOV BP,SP ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
- ; PUSH DS ;BCFS0726
- ; PUSH [BP+6] ;GET A$ STRING DESCRIPTOR ADDRESS ;BCFS0726
- ; CALL StringAddress ;BCFS0726
- ; JCXZ DONE ;EXIT
- ; MOV BX,AX ;BCFS0801
- ; MOV DS,DX ;BCFS0726
- ;LOOP1: MOV AL,[BX] ;GET A CHARACTER. ;BCFS0801
- ; CMP AL,'a' ;IF LESS THAN A LOWER CASE "A" DON'T CHANGE.
- ; JL NEXT ;JUMP TO GET THE NEXT CHARACTER.
- ; CMP AL,'z' ;IF GREATER THAN A LOWER CASE "Z" DON'T CHANGE.
- ; JA NEXT ;JUMP TO GET THE NEXT CHARACTER.
- ;LOWER: SUB AL,32 ;SUBTRACT 32 FROM VALUE IF A LOWER CASE LETTER.
- ; MOV [BX],AL ;STORE THE VALUE IN THE STRING AREA. ;BCFS0801
- ;NEXT: INC BX ;POINT TO THE NEXT CHARACTER OF THE STRING.
- ; LOOP LOOP1 ;NOW GO BACK TO TEST THE NEXT CHARACTER. ;BCFS0726
- ;DONE: POP DS ;BCFS0726
- ; POP BP ;RESTORE CALLERS BASE POINTER REGISTER-- BP
- ; RET 2 ;RETURN AND REMOVE THE 1 PARAMETES FROM STACK
- ;RBBSULC ENDP
- ;-----------------------------------------------------------------------;
- ;ROUTINE: RBBSFREE AUTHOR: D. Thomas Mack ;
- ; 10210 Oxfordshire Road ;
- ; Great Falls, Virginia 22066 ;
- ; ;
- ;DATE: June 29, 1986 VERSION: 1.0 ;
- ; ;
- ;FUNCTION: This routine supports calls from the IBM (MICROSOFT) ;
- ; BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0 ;
- ; compilers to DOS interrupt 36 to find the amount of free ;
- ; space on a specific disk drive. ;
- ; ;
- ; CALL RBBSFREE (AX%,BX%,CX%,DX%) ;
- ; ;
- ; where AX% and BX% are 16-bit binary data items (i.e. ;
- ; integer variables) and should be as follows: ;
- ; ;
- ; Offset Variable Description of Variable ;
- ; ;
- ; BP+12 AX% = number of the disk drive to find the free space ;
- ; for where 0=default drive, 1=A, 2=B, etc. ;
- ; ;
- ; BP+10 BX% = zero when calling RBBSFREE ;
- ; BP+8 CX% = zero when calling RBBSFREE ;
- ; BP+6 DX% = zero when calling RBBSFREE ;
- ; ;
- ; upon returning from RBBSFREE, these are set as follows: ;
- ; ;
- ; AX% = if the drive specified was invalid contains the ;
- ; hexadecimal value of FFFF. If the drive was ;
- ; valid contains the number of sectors per cluster. ;
- ; BX% = contains the number of available clusters. ;
- ; CX% = contains the number of bytes per sector. ;
- ; DX% = contains the total number of clusters on the ;
- ; drive. ;
- ; FREESPACE = AX%*BX%*CX% IF AX%<> X'FFFF' ;
- ;-----------------------------------------------------------------------;
- RBBSFREE PROC FAR ;LONG CALL
- PUBLIC RBBSFREE
- PUSH BP ;SAVE CALLERS BASE POINTER REGISTER -- BP
- MOV BP,SP ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
- PUSH DI ;BCFS0913
- MOV BX,[BP+12] ;GET ADDRESS OF AX% PARAMETER ;BCFS0801
- MOV DL,[BX] ;PUT VALUE IN DL REGISTER OF DISK DRIVE ;BCFS0801
- MOV AH,36H ;CALL DOS FUNCTION 36 TO GET FREE DISK SPACE
- INT 21H ;ISSUE DOS INTERRUPT 21
- MOV DI,[BP+12] ;GET ADDRESS OF AX% PARAMETER ;BCFS0913
- MOV [DI],AX ;PUT VALUE OF AX IN AX% PARAMETER ;BCFS0913
- MOV DI,[BP+10] ;GET ADDRESS OF BX% PARAMETER ;BCFS0913
- MOV [DI],BX ;PUT VALUE OF BX IN BX% PARAMETER ;BCFS0913
- MOV DI,[BP+8] ;GET ADDRESS OF CX% PARAMETER ;BCFS0913
- MOV [DI],CX ;PUT VALUE OF CX IN CX% PARAMETER ;BCFS0913
- MOV DI,[BP+6] ;GET ADDRESS OF DX% PARAMETER ;BCFS0913
- MOV [DI],DX ;PUT VALUE OF DX IN DX% PARAMETER ;BCFS0913
- POP DI ;BCFS0913
- POP BP ;RESTORE CALLERS BASE POINTER REGISTER-- BP
- RET 8 ;RETURN AND REMOVE THE 4 PARAMETERS FROM STACK
- RBBSFREE ENDP
- ;-----------------------------------------------------------------------;
- ;ROUTINE: RBBSDOS AUTHOR: D. Thomas Mack ;
- ; 10210 Oxfordshire Road ;
- ; Great Falls, Virginia 22066 ;
- ; ;
- ;DATE: June 29, 1986 VERSION: 1.0 ;
- ; ;
- ;FUNCTION: This routine supports calls from the IBM (MICROSOFT) ;
- ; BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0 ;
- ; compilers to DOS interrupt 33 to find the version of DOS ;
- ; that RBBS-PC is being run under. ;
- ; ;
- ; CALL RBBSDOS (AX%,BX%) ;
- ; ;
- ; where AX% and BX% are 16-bit binary data items (i.e. ;
- ; integer variables) and should be as follows: ;
- ; ;
- ; Offset Variable Description of Variable ;
- ; ;
- ; BP+8 AX% = major version number of the DOS that RBBS-PC is ;
- ; running under. (Zero if less than DOS 2.0) ;
- ; ;
- ; BP+6 BX% = minor version number of the DOS that RBBS-PC is ;
- ; running under. ;
- ;-----------------------------------------------------------------------;
- ;RBBSDOS PROC FAR ;LONG CALL
- ; PUBLIC RBBSDOS
- ; PUSH BP ;SAVE CALLERS BASE POINTER REGISTER -- BP
- ; MOV BP,SP ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
- ; MOV AH,30H ;CALL DOS FUNCTION 30 TO GET DOS VERSION
- ; INT 21H ;ISSUE DOS INTERRUPT 21
- ; MOV BX,[BP+8] ;GET ADDRESS OF AX% PARAMETER ;BCFS0801
- ; MOV [BX],AL ;PUT VALUE OF MAJOR DOS NUMBER IN AX% PARM ;BCFS0801
- ; MOV BX,[BP+6] ;GET ADDRESS OF BX% PARAMETER ;BCFS0801
- ; MOV [BX],AH ;PUT VALUE OF MINOR DOS VERSION IN B% PARM ;BCFS0801
- ; POP BP ;RESTORE CALLERS BASE POINTER REGISTER-- BP
- ; RET 4 ;RETURN AND REMOVE THE 2 PARAMETERS FROM STACK
- ;RBBSDOS ENDP
- RBBS_UTIL ENDS
- END
-