home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1994 #1 / monster.zip / monster / BBS_UTIL / BM0406_A.ZIP / BMASM.ZIP / RBBSUTIL.ASM < prev    next >
Assembly Source File  |  1993-02-07  |  20KB  |  337 lines

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