home *** CD-ROM | disk | FTP | other *** search
/ Beijing Paradise BBS Backup / PARADISE.ISO / software / BBSDOORW / CDOR0811.ZIP / SOURCE.ZIP / RBBSUTIL.ASM < prev    next >
Encoding:
Assembly Source File  |  1993-06-25  |  13.7 KB  |  324 lines

  1. PAGE    66,132
  2. TITLE    RBBS-PC Assembly Language Subroutines Copyright 1986, by D. Thomas Mack
  3. ;
  4. ; Changes made by Scott McNay (1:395/11) July 26, 1992, to allow routine to be
  5. ; used with code compiled with BC's /Fs option.  (Most) changes marked with
  6. ; ;BCFS0726.  May have optimized some code also.  This is a plug-in replacement
  7. ; for the original code.
  8. ;
  9. ; Also commented out RBBSDOS routine, since RBBS doesn't use it anymore.
  10.  
  11. ;BCFS0801: Standardized code format.  Made sure that DI, SI, BP, and DS are
  12. ;  saved to meet requirements of BC 7.x.
  13.  
  14. ;BCFS0913: Fixed bug that I accidentally introduced into the RBBSFREE routine.
  15.  
  16. ;-----------------------------------------------------------------------;
  17. ;ROUTINE: RBBSFIND        AUTHOR:    D. Thomas Mack            ;
  18. ;                    10210 Oxfordshire Road        ;
  19. ;                    Great Falls, Virginia  22066    ;
  20. ;                                    ;
  21. ;DATE:    June 29, 1986        VERSION: 1.0                ;
  22. ;                                    ;
  23. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)        ;
  24. ;       BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  25. ;       compilers to find the date a file was created.        ;
  26. ;                                    ;
  27. ;          CALL RBBSFIND (A$,ERROR%,YEAR%,MONTH%,DAY%)        ;
  28. ;                                    ;
  29. ;       where A$ is the fully qualified file name to find the    ;
  30. ;            date for and all other parameters are zeroes.    ;
  31. ;                                    ;
  32. ; Offset   Variable    Description of Variable                ;
  33. ;                                    ;
  34. ; BP+14          BX  = string descriptor address of the file name to    ;
  35. ;            find the creation date for where the string        ;
  36. ;            descriptor has the format:                ;
  37. ;                                    ;
  38. ;            Bytes 0 and 1 contain the length of the string    ;
  39. ;                (0 to 32,767).                ;
  40. ;            Bytes 2 and 3 contain the lower and upper 8 bits    ;
  41. ;                of the string's starting address    ;
  42. ;                in string space (respectively).        ;
  43. ; BP+12      ERROR% = Zero if no error was encountered.  Non-zero if an    ;
  44. ;           error occurred.                    ;
  45. ; BP+10       YEAR% = number of years since 1980 when file was last    ;
  46. ;           modified.                        ;
  47. ; BP+8      MONTH% = month the file was last modified.            ;
  48. ; BP+6        DAY% = day the file was last modified.            ;
  49. ;                                    ;
  50. ;-----------------------------------------------------------------------;
  51.  
  52.     Extrn    StringAddress:far                          ;BCFS0726
  53.  
  54. ;
  55. ; LIST OF PARAMETERS AS THEY APPEAR ON THE STACK
  56. ;
  57. PARMLIST STRUC
  58. SAVE_BP    DW    ?    ;RETAINS CONTENTS OF BASE POINTER REGISTER
  59. RET_OFF    DW    ?    ;RETURN ADDRESS OF CALLING PROGRAM
  60. RET_SEG    DW    ?         
  61. PARM5    DW    ?    ;DAY FILE WAS CREATED
  62. PARM4    DW    ?    ;MONTH FILE WAS CREATED
  63. PARM3    DW    ?    ;YEAR FILE WAS CREATED (PAST 1980)
  64. PARM2    DW    ?    ;ERROR RETURN CODE
  65. PARM1    DW    ?    ;STRING DESCRIPTOR
  66. PARMLIST ENDS
  67. ;
  68. ; LET THE ASSEMBLER CALCULATE THE VALUE FOR RETURNING FROM SUBROUTINE WITH EQU
  69. ;
  70. PARMSIZE EQU    OFFSET PARM1 - OFFSET RET_SEG
  71. ;
  72. ; DEFINE A STACK TO PUSH UP TO 3 ITEMS ON THE STACK AT ANY GIVEN TIME
  73. ;
  74. STACK    SEGMENT WORD STACK 'STACK'
  75.     DW    14 DUP(?)
  76. STACK    ENDS
  77.  
  78. RBBS_UTIL SEGMENT BYTE PUBLIC 'CODE'
  79.     ASSUME    CS:RBBS_UTIL
  80. SAVE_DTA_OFF DW    ?        ;ADDRESS OF CURRENT DISK TRANSFER AREA
  81. SAVE_DTA_SEG DW    ?    
  82. RBBSDTA    DB    30 DUP(?)    ;WORKING DTA (NOT BASIC'S)
  83. PATHFILE DB    64 DUP(?)    ;PATH AND FILE NAME FOR SEARCH
  84. RBBSFIND PROC    FAR        ;LONG CALL
  85.     PUBLIC    RBBSFIND
  86.     PUSH    BP        ;SAVE CALLER'S BASE POINTER REGISTER -- BP 
  87.     MOV    BP,SP        ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  88.     PUSH    DS                                  ;BCFS0726
  89.     PUSH    ES                                  ;BCFS0801
  90.     PUSH    DI                                  ;BCFS0726
  91.     PUSH    SI                                  ;BCFS0726
  92.     PUSH    [BP].PARM1    ;GET A$ STRING DESCRIPTOR ADDRESS        ;BCFS0726
  93.     CALL    StringAddress                              ;BCFS0726
  94.     MOV    SI,AX                                  ;BCFS0726
  95.     XOR    AX,AX        ;INDICATE NO ERROR CONDITIONS
  96.     JCXZ    FINISH        ;EXIT                          ;BCFS0726
  97.     PUSH    DS                                  ;BCFS0726
  98.     MOV    DS,DX                                  ;BCFS0726
  99.     PUSH    CS                                  ;BCFS0726
  100.     POP    ES                                  ;BCFS0726
  101.     MOV    DI,offset PATHFILE    ;MOVE PATH/FILE SPEC TO "PATHFILE" AREA
  102.     CLD            ;CLEAR DIRECTION FLAGS
  103.     REP    MOVSB        ;END STRING WITH A BINARY ZERO FOR DOS CALL
  104.     PUSH    CS                                  ;BCFS0726
  105.     POP    DS                                  ;BCFS0726
  106.     MOV    BYTE PTR CS:[DI],0
  107. ;
  108.     MOV    AH,2FH        ;GET DISK TRANSFER AREA ADDRESS IN BX
  109.     INT    21H        ;ISSUE DOS INTERRUPT 21
  110.     MOV    CS:SAVE_DTA_OFF,BX    ;SAVE BASIC'S DISK TRANSFER AREA
  111.     MOV    CS:SAVE_DTA_SEG,ES
  112.     POP    ES                                  ;BCFS0726
  113.     JC    FINISH        ;EXIT IF THERE WERE ERRORS
  114. ;
  115.     MOV    DX,offset RBBSDTA    ;SET UP PRIVATE DTA FROM BASIC'S
  116.     MOV    AH,1AH        ;SETUP NEW TEMPORARY DTA
  117.     INT    21H        ;ISSUE DOS INTERRUPT 21
  118.     JC    FINISH        ;EXIT IF THERE WERE ERRORS 
  119. ;
  120.     XOR    CX,CX        ;SET UP TO LOOK FOR ALL DIRECTORY ENTRIES
  121.     MOV    DX,offset PATHFILE    ;FIND THE FIRST FILE THAT MATCHES "PATHFILE"
  122.     MOV    AH,4EH        ;CALL DOS FUNCTION X'4E' TO FIND FILE
  123.     INT    21H        ;ISSUE DOS INTERRUPT 21
  124.     JC    EXIT        ;EXIT IF THERE WERE ERRORS
  125. ;
  126.     MOV    DI,offset RBBSDTA+24    ;POINT TO DATE FIELD IN DTA (+24)
  127.     MOV    AX,DS:[DI]    ;GET DATE OF FILE (DTA +24) IN AX REGISTER
  128. ;                BITS 0-4  = DAY(1-31)
  129. ;                BITS 5-8  = MONTH(1-12)
  130. ;                BITS 9-15 = YEAR(0 - 119, AS AN OFFSET OF 1980)
  131. ;    SET UP AS FOLLOWS:
  132. ;
  133. ;    |<-------YEAR------->|<--MONTH-->|<-----DAY---->|
  134. ;    |15 14 13 12 11 10  9  8  7  6  5  4  3  2  1  0|
  135. ;    |     |     |     |     | 
  136. ;      0  0  0  0  0  0  0  1  1  1  1  0  0  0  0  0  = X'01E0'  
  137. ;      0  0  0  0  0  0  0  0  0  0  0  1  1  1  1  1  = X'001F'
  138.  
  139.     MOV    BX,AX        ;GET THE DATE INTO THE BX REGISTER
  140.     MOV    CL,9        ;PREPARE TO SHIFT RIGHT NINE BITS (0-8)
  141.     SHR    BX,CL        ;SHIFT RIGHT NINE BITS LEAVING THE YEAR ONLY
  142.     MOV    DI,[BP].PARM3    ;GET ADDRESS OF WHERE TO PUT YEAR (AS AN INDEX 
  143.     MOV    ES:[DI],BX    ;PAST 1980) FILE WAS CREATED AND PASS IT BACK
  144. ;
  145.     MOV    BX,AX        ;GET THE DATE INTO THE BX REGISTER AGAIN
  146.     AND    BX,01E0H    ;TURN OFF ALL THE BITS EXCEPT BITS 5-8 (MONTH)
  147.     MOV    CL,5        ;PREPARE TO SHIFT RIGHT FIVE BITS (0-4)
  148.     SHR    BX,CL        ;SHIFT RIGHT FIVE BITS TO GET MONTH ONLY
  149.     MOV    DI,[BP].PARM4    ;GET ADDR OF WHERE TO PUT MONTH FILE WAS MADE
  150.     MOV    ES:[DI],BX    ;PASS BACK THE MONTH THE FILE WAS CREATED
  151. ;
  152.     AND    AX,001FH    ;TURN OFF ALL THE BITS EXCEPT BITS 0-4 (DAY)
  153.     MOV    DI,[BP].PARM5    ;GET ADDRESS OF WHERE TO PUT DAY FILE WAS MADE
  154.     MOV    ES:[DI],AX    ;PASS BACK THE DAY THE FILE WAS CREATED
  155.     XOR    AX,AX        ;INDICATE NO ERROR CONDITIONS
  156. ;
  157. EXIT:    PUSH    AX        ;SAVE ERROR INDICATOR REGISTER -- AX
  158.     PUSH    DS        ;SAVE DATA SEGMENT REGISTER -- DS
  159.     MOV    DX,CS:SAVE_DTA_OFF    ;RESTORE BASIC'S DTA AFTER    CPC151A7+
  160.     MOV    DS,CS:SAVE_DTA_SEG    ;SETTING UP THE TEMP RBBS-PC ONE CPC151A7+
  161.     MOV    AH,1AH        ;CALL DOS FUNCTION '1A' TO CHANGE DTA'S
  162.     INT    21H        ;ISSUE DOS INTERRUPT 21            CPC151A7+
  163.     POP    DS        ;RESTORE DATA SEGMENT REGISTER -- DS
  164.     POP    AX        ;RESTORE ERROR INDICATOR REGISTER -- AX
  165. ;
  166. FINISH:    MOV    DI,[BP].PARM2    ;GET ADDRESS OF WHERE TO PUT ERROR RETURN CODE
  167.     MOV    ES:[DI],AX    ;PUT THE ERROR RETURN CODE IN ERROR%
  168.     POP    SI                                  ;BCFS0726
  169.     POP    DI                                  ;BCFS0726
  170.     POP    ES                                  ;BCFS0801
  171.     POP    DS                                  ;BCFS0726
  172.     POP    BP        ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  173.     RET    PARMSIZE    ;RETURN AND REMOVE THE 5 PARAMETERS FROM STACK
  174. RBBSFIND ENDP
  175. ;-----------------------------------------------------------------------;
  176. ;ROUTINE: RBBSULC        AUTHOR:    D. Thomas Mack            ;
  177. ;                    10210 Oxfordshire Road        ;
  178. ;                    Great Falls, Virginia  22066    ;
  179. ;                                    ;
  180. ;DATE:  June 29, 1986        VERSION: 1.0                ;
  181. ;                                    ;
  182. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)        ;
  183. ;       BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  184. ;       compilers to convert a string to upper case alphabetic    ;
  185. ;       characters.                            ;
  186. ;                                    ;
  187. ;         CALL RBBSULC (A$)                        ;
  188. ;                                    ;
  189. ;       where A$ is the string to be converted to upper case.    ;
  190. ;                                    ;
  191. ; Offset   Variable    Description of Variable                ;
  192. ;                                    ;
  193. ; BP+6    BX  = string descriptor address where the string        ;
  194. ;        descriptor has the format:                ;
  195. ;                                    ;
  196. ;        Bytes 0 and 1 contain the length of the string        ;
  197. ;                (0 to 32,767).                ;
  198. ;        Bytes 2 and 3 contain the lower and upper 8 bits    ;
  199. ;                of the string's starting address    ;
  200. ;                in string space (respectively).        ;
  201. ;                                    ;
  202. ;-----------------------------------------------------------------------;
  203. ;RBBSULC PROC    FAR             ;LONG CALL
  204. ;        PUBLIC  RBBSULC
  205. ;        PUSH    BP              ;SAVE CALLERS BASE POINTER REGISTER -- BP
  206. ;        MOV     BP,SP           ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  207. ;        PUSH    DS                                                            ;BCFS0726
  208. ;        PUSH    [BP+6]          ;GET A$ STRING DESCRIPTOR ADDRESS             ;BCFS0726
  209. ;        CALL    StringAddress                                                 ;BCFS0726
  210. ;        JCXZ    DONE            ;EXIT
  211. ;        MOV     BX,AX                                                         ;BCFS0801
  212. ;        MOV     DS,DX                                                         ;BCFS0726
  213. ;LOOP1:  MOV     AL,[BX]         ;GET A CHARACTER.                             ;BCFS0801
  214. ;        CMP     AL,'a'          ;IF LESS THAN A LOWER CASE "A" DON'T CHANGE.
  215. ;        JL      NEXT            ;JUMP TO GET THE NEXT CHARACTER.
  216. ;        CMP     AL,'z'          ;IF GREATER THAN A LOWER CASE "Z" DON'T CHANGE.
  217. ;        JA      NEXT            ;JUMP TO GET THE NEXT CHARACTER.
  218. ;LOWER:  SUB     AL,32           ;SUBTRACT 32 FROM VALUE IF A LOWER CASE LETTER.
  219. ;        MOV     [BX],AL         ;STORE THE VALUE IN THE STRING AREA.          ;BCFS0801
  220. ;NEXT:   INC     BX              ;POINT TO THE NEXT CHARACTER OF THE STRING.
  221. ;        LOOP    LOOP1           ;NOW GO BACK TO TEST THE NEXT CHARACTER.      ;BCFS0726
  222. ;DONE:   POP     DS                                                            ;BCFS0726
  223. ;        POP     BP              ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  224. ;        RET     2               ;RETURN AND REMOVE THE 1 PARAMETES FROM STACK
  225. ;RBBSULC ENDP
  226. ;-----------------------------------------------------------------------;
  227. ;ROUTINE: RBBSFREE        AUTHOR:    D. Thomas Mack            ;
  228. ;                    10210 Oxfordshire Road        ;
  229. ;                    Great Falls, Virginia  22066    ;
  230. ;                                    ;
  231. ;DATE:  June 29, 1986        VERSION: 1.0                ;
  232. ;                                    ;
  233. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)        ;
  234. ;       BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0    ;
  235. ;       compilers to DOS interrupt 36 to find the amount of free    ;
  236. ;       space on a specific disk drive.                ;
  237. ;                                    ;
  238. ;         CALL RBBSFREE (AX%,BX%,CX%,DX%)                ;
  239. ;                                    ;
  240. ;    where AX% and BX% are 16-bit binary data items (i.e.        ;
  241. ;    integer variables) and should be as follows:            ;
  242. ;                                    ;
  243. ; Offset    Variable    Description of Variable            ;
  244. ;                                    ;
  245. ; BP+12    AX% = number of the disk drive to find the free space        ;
  246. ;         for where 0=default drive, 1=A, 2=B, etc.        ;
  247. ;                                    ;
  248. ; BP+10    BX% = zero when calling RBBSFREE                ;
  249. ; BP+8    CX% = zero when calling RBBSFREE                ;
  250. ; BP+6    DX% = zero when calling RBBSFREE                ;
  251. ;                                    ;
  252. ;    upon returning from RBBSFREE, these are set as follows:        ;
  253. ;                                    ;
  254. ;        AX% = if the drive specified was invalid contains the    ;
  255. ;           hexadecimal value of FFFF.  If the drive was        ;
  256. ;           valid contains the number of sectors per cluster.    ;
  257. ;        BX% = contains the number of available clusters.    ;
  258. ;        CX% = contains the number of bytes per sector.        ;
  259. ;        DX% = contains the total number of clusters on the    ;
  260. ;           drive.                        ;
  261. ;     FREESPACE = AX%*BX%*CX% IF AX%<> X'FFFF'            ;
  262. ;-----------------------------------------------------------------------;
  263. RBBSFREE PROC    FAR        ;LONG CALL
  264.     PUBLIC    RBBSFREE
  265.     PUSH    BP        ;SAVE CALLERS BASE POINTER REGISTER -- BP 
  266.     MOV    BP,SP        ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  267.     PUSH    DI                                  ;BCFS0913
  268.     MOV    BX,[BP+12]    ;GET ADDRESS OF AX% PARAMETER              ;BCFS0801
  269.     MOV    DL,[BX]        ;PUT VALUE IN DL REGISTER OF DISK DRIVE          ;BCFS0801
  270.     MOV    AH,36H        ;CALL DOS FUNCTION 36 TO GET FREE DISK SPACE
  271.     INT    21H        ;ISSUE DOS INTERRUPT 21 
  272.     MOV    DI,[BP+12]    ;GET ADDRESS OF AX% PARAMETER              ;BCFS0913
  273.     MOV    [DI],AX        ;PUT VALUE OF AX IN AX% PARAMETER          ;BCFS0913
  274.     MOV    DI,[BP+10]    ;GET ADDRESS OF BX% PARAMETER              ;BCFS0913
  275.     MOV    [DI],BX        ;PUT VALUE OF BX IN BX% PARAMETER          ;BCFS0913
  276.     MOV    DI,[BP+8]    ;GET ADDRESS OF CX% PARAMETER              ;BCFS0913
  277.     MOV    [DI],CX        ;PUT VALUE OF CX IN CX% PARAMETER          ;BCFS0913
  278.     MOV    DI,[BP+6]    ;GET ADDRESS OF DX% PARAMETER              ;BCFS0913
  279.     MOV    [DI],DX        ;PUT VALUE OF DX IN DX% PARAMETER          ;BCFS0913
  280.     POP    DI                                  ;BCFS0913
  281.     POP    BP        ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  282.     RET    8        ;RETURN AND REMOVE THE 4 PARAMETERS FROM STACK
  283. RBBSFREE ENDP
  284. ;-----------------------------------------------------------------------;
  285. ;ROUTINE: RBBSDOS        AUTHOR:    D. Thomas Mack            ;
  286. ;                    10210 Oxfordshire Road        ;
  287. ;                    Great Falls, Virginia  22066    ;
  288. ;                                    ;
  289. ;DATE:  June 29, 1986        VERSION: 1.0                ;
  290. ;                                    ;
  291. ;FUNCTION: This routine supports calls from the IBM (MICROSOFT)        ;
  292. ;    BASIC Version 2.0 or Microsoft Quick BASIC Version 1.0        ;
  293. ;    compilers to DOS interrupt 33 to find the version of DOS    ;
  294. ;    that RBBS-PC is being run under.                ;
  295. ;                                    ;
  296. ;      CALL RBBSDOS (AX%,BX%)                    ;
  297. ;                                    ;
  298. ;    where AX% and BX% are 16-bit binary data items (i.e.        ;
  299. ;    integer variables) and should be as follows:            ;
  300. ;                                    ;
  301. ; Offset    Variable    Description of Variable            ;
  302. ;                                    ;
  303. ; BP+8    AX% = major version number of the DOS that RBBS-PC is        ;
  304. ;        running under.  (Zero if less than DOS 2.0)        ;
  305. ;                                    ;
  306. ; BP+6    BX% = minor version number of the DOS that RBBS-PC is        ;
  307. ;        running under.                        ;
  308. ;-----------------------------------------------------------------------;
  309. ;RBBSDOS PROC    FAR        ;LONG CALL
  310. ;    PUBLIC    RBBSDOS
  311. ;    PUSH    BP        ;SAVE CALLERS BASE POINTER REGISTER -- BP 
  312. ;    MOV    BP,SP        ;SETUP TO ADDRESS OFF OF BASE POINTER REGISTER
  313. ;    MOV    AH,30H        ;CALL DOS FUNCTION 30 TO GET DOS VERSION
  314. ;    INT    21H        ;ISSUE DOS INTERRUPT 21 
  315. ;    MOV    BX,[BP+8]    ;GET ADDRESS OF AX% PARAMETER              ;BCFS0801
  316. ;    MOV    [BX],AL        ;PUT VALUE OF MAJOR DOS NUMBER IN AX% PARM    ;BCFS0801
  317. ;    MOV    BX,[BP+6]    ;GET ADDRESS OF BX% PARAMETER              ;BCFS0801
  318. ;    MOV    [BX],AH        ;PUT VALUE OF MINOR DOS VERSION IN B% PARM    ;BCFS0801
  319. ;    POP    BP        ;RESTORE CALLERS BASE POINTER REGISTER-- BP
  320. ;    RET    4        ;RETURN AND REMOVE THE 2 PARAMETERS FROM STACK
  321. ;RBBSDOS ENDP
  322. RBBS_UTIL ENDS
  323.     END
  324.