diff options
| author | 2024-04-25 21:24:10 +0100 | |
|---|---|---|
| committer | 2024-04-25 22:32:27 +0000 | |
| commit | 2d04cacc5322951f187bb17e017c12920ac8ebe2 (patch) | |
| tree | 80ee017efa878dfd5344b44249e6a241f2a7f6e2 /v4.0/src/SELECT/MACROS4.INC | |
| parent | Merge pull request #430 from jpbaltazar/typoptbr (diff) | |
| download | ms-dos-main.tar.gz ms-dos-main.tar.xz ms-dos-main.zip | |
Diffstat (limited to 'v4.0/src/SELECT/MACROS4.INC')
| -rw-r--r-- | v4.0/src/SELECT/MACROS4.INC | 345 |
1 files changed, 345 insertions, 0 deletions
diff --git a/v4.0/src/SELECT/MACROS4.INC b/v4.0/src/SELECT/MACROS4.INC new file mode 100644 index 0000000..43278d5 --- /dev/null +++ b/v4.0/src/SELECT/MACROS4.INC | |||
| @@ -0,0 +1,345 @@ | |||
| 1 | ;;**************************************************************************** | ||
| 2 | ;; Assembler MACROS for use with SELECT. | ||
| 3 | ;; File: MACROS4.INC | ||
| 4 | ;; Latest Change Date: July 16, 1987 | ||
| 5 | ;; | ||
| 6 | ;; These macros define powerful assembler verbs neccessary for SELECT. | ||
| 7 | ;; | ||
| 8 | ;; Note: Many of the macros make use of an ASCII-N string for passing | ||
| 9 | ;; parameters. The string is defined below. | ||
| 10 | ;; DW count | ||
| 11 | ;; DB "string_variable",? | ||
| 12 | ;; | ||
| 13 | ;; COUNT is the length of the string and is a word. | ||
| 14 | ;; It is necessary to follow the string with at least one byte for the | ||
| 15 | ;; purpose of changing the ASCII-N string to an ASCII-Z string. | ||
| 16 | ;; | ||
| 17 | ;;**************************************************************************** | ||
| 18 | page ;;AN000; | ||
| 19 | ;;**************************************************************************** | ||
| 20 | ;; | ||
| 21 | ;; GET_DATE: Get the current system date. | ||
| 22 | ;; | ||
| 23 | ;; SYNTAX: GET_DATE var_year, var_month, var_day | ||
| 24 | ;; | ||
| 25 | ;; INPUT: NONE | ||
| 26 | ;; | ||
| 27 | ;; OUTPUT: CY = 0: CURRENT SYSTEM DATE IS 1/1/80 | ||
| 28 | ;; CY = 1: CURRENT SYSTEM DATE IS NOT 1/1/80 | ||
| 29 | ;; VAR_YEAR - SYSTEM YEAR (16 BITS) | ||
| 30 | ;; VAR_MONTH - SYSTEM MONTH (16 BITS) | ||
| 31 | ;; VAR_DAY - SYSTEM DAY (16 BITS) | ||
| 32 | ;; | ||
| 33 | ;; OPERATION: DOS function call 2Ah is performed to get the current | ||
| 34 | ;; system date. If the system date is not 1/1/80, the | ||
| 35 | ;; carry flag is set. | ||
| 36 | ;; | ||
| 37 | ;;**************************************************************************** | ||
| 38 | GET_DATE MACRO VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000; | ||
| 39 | |||
| 40 | MOV AH,2AH ;;AN000; get time dos interrupt | ||
| 41 | DOSCALL ;;AN000; | ||
| 42 | MOV VAR_YEAR, CX ;;AN000; Save the date. | ||
| 43 | MOV CH,0 ;;AN000; Clear the byte | ||
| 44 | MOV CL,DH ;;AN000; | ||
| 45 | MOV VAR_MONTH, CX ;;AN000; | ||
| 46 | MOV CL,DL ;;AN000; | ||
| 47 | MOV VAR_DAY, CX ;;AN000; | ||
| 48 | .IF < VAR_YEAR EQ 1980 > AND ;;AN000; See if it is the base year. | ||
| 49 | .IF < DX EQ 0101H> ;;AN000; i.e. 1/1/80 | ||
| 50 | CLC ;;AN000; Yes it is. | ||
| 51 | .ELSE ;;AN000; | ||
| 52 | STC ;;AN000; | ||
| 53 | .ENDIF ;;AN000; | ||
| 54 | |||
| 55 | ENDM ;;AN000; | ||
| 56 | ;;**************************************************************************** | ||
| 57 | ;; | ||
| 58 | ;; GET_TIME: Get current system time. | ||
| 59 | ;; | ||
| 60 | ;; SYNTAX: GET_TIME var_hour, var_minutes, var_seconds | ||
| 61 | ;; | ||
| 62 | ;; INPUT: None. | ||
| 63 | ;; | ||
| 64 | ;; OUTPUT: VAR_HOUR - SYSTEM HOUR (16 BITS) | ||
| 65 | ;; VAR_MINUTES - SYSTEM MINUTES (16 BITS) | ||
| 66 | ;; VAR_SECONDS - SYSTEM SECONDS (16 BITS) | ||
| 67 | ;; | ||
| 68 | ;; OPERATION: DOS function call 2Ch is performed to get the current | ||
| 69 | ;; system time. | ||
| 70 | ;; | ||
| 71 | ;; | ||
| 72 | ;;**************************************************************************** | ||
| 73 | GET_TIME MACRO VAR_HOUR, VAR_MINUTES, VAR_SECONDS ;;AN000; | ||
| 74 | |||
| 75 | |||
| 76 | MOV AH,2CH ;;AN000; get time dos interrupt | ||
| 77 | DOSCALL ;;AN000; | ||
| 78 | |||
| 79 | MOV AH, 0 ;;AN000; | ||
| 80 | MOV AL, CH ;;AN000; | ||
| 81 | MOV VAR_HOUR, AX ;;AN000; | ||
| 82 | MOV AL, CL ;;AN000; | ||
| 83 | MOV VAR_MINUTES, AX ;;AN000; | ||
| 84 | MOV AL, DH ;;AN000; | ||
| 85 | MOV VAR_SECONDS, AX ;;AN000; | ||
| 86 | |||
| 87 | |||
| 88 | ENDM ;;AN000; | ||
| 89 | ;;************************************************************************;; | ||
| 90 | ;; SET_DATE: Sets the system date | ||
| 91 | ;; | ||
| 92 | ;; SYNTAX: SET_DATE var_year, var_month, var_day | ||
| 93 | ;; | ||
| 94 | ;; INPUT: var_year - 1980 - 2099 ( 16 bits ) | ||
| 95 | ;; var_month - 1 - 12 ( 16 bits ) | ||
| 96 | ;; var_day - 1 - 31 ( 16 bits ) | ||
| 97 | ;; | ||
| 98 | ;; OUTPUT: CY = 0: SUCCESSFUL | ||
| 99 | ;; CY = 1: ERROR - Date is not valid | ||
| 100 | ;; | ||
| 101 | ;; OPERATION: DOS function call 2Bh is performed to set the system date. | ||
| 102 | ;; If the date is not valid, the carry flag is set. | ||
| 103 | ;; | ||
| 104 | ;;************************************************************;; | ||
| 105 | SET_DATE MACRO VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000; | ||
| 106 | MOV CX, VAR_YEAR ;;AN000; | ||
| 107 | MOV AX, VAR_MONTH ;;AN000; | ||
| 108 | MOV DH, AL ;;AN000; | ||
| 109 | MOV AX, VAR_DAY ;;AN000; | ||
| 110 | MOV DL, AL ;;AN000; | ||
| 111 | MOV AH,2BH ;;AN000; set date dos interrupt | ||
| 112 | DOSCALL ;;AN000; | ||
| 113 | .IF < ZERO AL > ;;AN000; | ||
| 114 | CLC ;;AN000; | ||
| 115 | .ELSE ;;AN000; | ||
| 116 | STC ;;AN000; | ||
| 117 | .ENDIF ;;AN000; | ||
| 118 | ENDM ;;AN000; | ||
| 119 | ;;**************************************************************************** | ||
| 120 | ;; | ||
| 121 | ;; SET_TIME: Sets the current system time. | ||
| 122 | ;; | ||
| 123 | ;; SYNTAX: SET_TIME var_hour, var_minutes, var_seconds | ||
| 124 | ;; | ||
| 125 | ;; INPUT: var_hour = 0 - 23 ( 16 BITS ) | ||
| 126 | ;; var_minutes = 0 - 59 ( 16 BITS ) | ||
| 127 | ;; var_seconds = 0 - 59 ( 16 BITS ) | ||
| 128 | ;; hundredth = Assumed to be zero | ||
| 129 | ;; | ||
| 130 | ;; OUTPUT: CY = 0: SUCCESSFUL | ||
| 131 | ;; CY = 1: Error - Date is not valid | ||
| 132 | ;; | ||
| 133 | ;; OPERATION: DOS function call 2Dh is performed to set the current system | ||
| 134 | ;; time. If the time is not valid, the carry flag will be set. | ||
| 135 | ;; | ||
| 136 | ;;**************************************************************************** | ||
| 137 | SET_TIME MACRO VAR_HOUR, VAR_MINUTES, VAR_SECONDS ;;AN000; | ||
| 138 | |||
| 139 | MOV AX, VAR_HOUR ;;AN000; | ||
| 140 | MOV CH, AL ;;AN000; | ||
| 141 | MOV AX, VAR_MINUTES ;;AN000; | ||
| 142 | MOV CL, AL ;;AN000; | ||
| 143 | MOV AX, VAR_SECONDS ;;AN000; | ||
| 144 | MOV DH, AL ;;AN000; | ||
| 145 | MOV DL, 0 ;;AN000; Hundredths of seconds is 0 | ||
| 146 | MOV AH,2DH ;;AN000; set time dos interrupt | ||
| 147 | DOSCALL ;;AN000; | ||
| 148 | .IF < ZERO AL > ;;AN000; | ||
| 149 | CLC ;;AN000; | ||
| 150 | .ELSE ;;AN000; | ||
| 151 | STC ;;AN000; | ||
| 152 | .ENDIF ;;AN000; | ||
| 153 | ENDM ;;AN000; | ||
| 154 | ;;**************************************************************************** | ||
| 155 | ;; | ||
| 156 | ;; CHECK_TIME_CHANGE: Check if user entered time is different from the | ||
| 157 | ;; specified system time. | ||
| 158 | ;; | ||
| 159 | ;; SYNTAX: CHECK_TIME_CHANGE: var_u_hour, var_u_min, var_u_sec, | ||
| 160 | ;; var_s_hour, var_s_min, var_s_sec | ||
| 161 | ;; | ||
| 162 | ;; INPUT: var_u_hour = User specified hour ( 16 bits ) | ||
| 163 | ;; var_u_min = User specified minutes ( 16 bits ) | ||
| 164 | ;; var_u_sec = User specified seconds ( 16 bits ) | ||
| 165 | ;; var_s_hour = System hour ( 16 bits ) | ||
| 166 | ;; var_s_min = System min ( 16 bits ) | ||
| 167 | ;; var_s_sec = System sec ( 16 bits ) | ||
| 168 | ;; | ||
| 169 | ;; OUTPUT: CY = 0: User specified time is the same as the system time. | ||
| 170 | ;; CY = 1: User specified time is different from the system time. | ||
| 171 | ;; | ||
| 172 | ;; OPERATION: The user time and system time are compared and the carry | ||
| 173 | ;; flag is updated as specified above. | ||
| 174 | ;; | ||
| 175 | ;;************************************************************************;; | ||
| 176 | CHECK_TIME_CHANGE MACRO VAR_U_HOUR, VAR_U_MIN, VAR_U_SEC, VAR_S_HOUR, VAR_S_MIN, VAR_S_SEC ;;AN000; | ||
| 177 | LOCAL EXIT_CHECK_TIME_CHANGE ;;AN000; | ||
| 178 | MOV AX, VAR_S_HOUR ;;AN000; | ||
| 179 | .IF < VAR_U_HOUR EQ AX > ;;AN000; | ||
| 180 | MOV AX, VAR_S_MIN ;;AN000; | ||
| 181 | .IF < VAR_U_MIN EQ AX > ;;AN000; | ||
| 182 | MOV AX, VAR_S_SEC ;;AN000; | ||
| 183 | .IF < VAR_U_SEC EQ AX > ;;AN000; | ||
| 184 | CLC ;;AN000; | ||
| 185 | JMP EXIT_CHECK_TIME_CHANGE;AN000; | ||
| 186 | .ENDIF ;;AN000; | ||
| 187 | .ENDIF ;;AN000; | ||
| 188 | .ENDIF ;;AN000; | ||
| 189 | STC ;;AN000; | ||
| 190 | EXIT_CHECK_TIME_CHANGE: ;;AN000; | ||
| 191 | ENDM ;;AN000; | ||
| 192 | ;;**************************************************************************** | ||
| 193 | ;; | ||
| 194 | ;; CHECK_DATE_CHANGE: Check if user entered date is different from the | ||
| 195 | ;; specified system date. | ||
| 196 | ;; | ||
| 197 | ;; SYNTAX: CHECK_DATE_CHANGE: var_u_year, var_u_month, var_u_day, | ||
| 198 | ;; var_s_year, var_s_month, var_s_day | ||
| 199 | ;; | ||
| 200 | ;; INPUT: var_u_year = User specified year ( 16 bits ) | ||
| 201 | ;; var_u_month = User specified month ( 16 bits ) | ||
| 202 | ;; var_u_day = User specified day ( 16 bits ) | ||
| 203 | ;; var_s_year = System year ( 16 bits ) | ||
| 204 | ;; var_s_month = System month ( 16 bits ) | ||
| 205 | ;; var_s_day = System day ( 16 bits ) | ||
| 206 | ;; | ||
| 207 | ;; OUTPUT: CY = 0: User specified date is the same as the system date. | ||
| 208 | ;; CY = 1: User specified date is different from the system date. | ||
| 209 | ;; | ||
| 210 | ;; OPERATION: The user date and system date are compared and the carry | ||
| 211 | ;; flag is updated as specified above. | ||
| 212 | ;; | ||
| 213 | ;;************************************************************************;; | ||
| 214 | CHECK_DATE_CHANGE MACRO VAR_U_YEAR, VAR_U_MONTH, VAR_U_DAY, VAR_S_YEAR, VAR_S_MONTH, VAR_S_DAY ;;AN000; | ||
| 215 | LOCAL EXIT_CHECK_DATE_CHANGE ;;AN000; | ||
| 216 | MOV AX, VAR_S_YEAR ;;AN000; | ||
| 217 | .IF < VAR_U_YEAR EQ AX > ;;AN000; | ||
| 218 | MOV AX, VAR_S_MONTH ;;AN000; | ||
| 219 | .IF < VAR_U_MONTH EQ AX > ;;AN000; | ||
| 220 | MOV AX, VAR_S_DAY ;;AN000; | ||
| 221 | .IF < VAR_U_DAY EQ AX > ;;AN000; | ||
| 222 | CLC ;;AN000; | ||
| 223 | JMP EXIT_CHECK_DATE_CHANGE ;;AN000; | ||
| 224 | .ENDIF ;;AN000; | ||
| 225 | .ENDIF ;;AN000; | ||
| 226 | .ENDIF ;;AN000; | ||
| 227 | STC ;;AN000; | ||
| 228 | EXIT_CHECK_DATE_CHANGE: ;;AN000; | ||
| 229 | ENDM ;;AN000; | ||
| 230 | ;;**************************************************************************** | ||
| 231 | ;; | ||
| 232 | ;; SET_FILE_DATE_TIME: Set a files date and time. | ||
| 233 | ;; | ||
| 234 | ;; SYNTAX: SET_FILE_DATE_TIME file_handle, var_hour, var_minutes, var_seconds | ||
| 235 | ;; var_year, var_month, var_day | ||
| 236 | ;; | ||
| 237 | ;; INPUT: | ||
| 238 | ;; file_handle = The handle of the file to set the time/date of. | ||
| 239 | ;; var_hour = 0 - 23 ( 16 bits ) | ||
| 240 | ;; var_minutes = 0 - 59 ( 16 bits ) | ||
| 241 | ;; var_seconds = 0 - 59 ( 16 bits ) | ||
| 242 | ;; var_year = 1980 - 2099 ( 16 bits ) | ||
| 243 | ;; var_month = 1 - 12 ( 16 bits ) | ||
| 244 | ;; var_day = 1 - 31 ( 16 bits ) | ||
| 245 | ;; | ||
| 246 | ;; OUTPUTS: | ||
| 247 | ;; CY = 0: Success | ||
| 248 | ;; CY = 1: Error - Date/Time format is invalid | ||
| 249 | ;; | ||
| 250 | ;; OPERATION: The data and time values are converted to internal formats | ||
| 251 | ;; defined below and DOS function call 57h is performed to set the | ||
| 252 | ;; files date and time. | ||
| 253 | ;; | ||
| 254 | ;; | ||
| 255 | ;; The internal time format is: | ||
| 256 | ;; bits 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 | ||
| 257 | ;; h h h h h m m m m m m x x x x x | ||
| 258 | ;; | ||
| 259 | ;; h - Binary number of hours ( 0 - 23 ) | ||
| 260 | ;; m - Binary number of minutes ( 0 - 59 ) | ||
| 261 | ;; x - Binary number of two second increments | ||
| 262 | ;; | ||
| 263 | ;; The internal date format is: | ||
| 264 | ;; bits 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00 | ||
| 265 | ;; y y y y y y y m m m m d d d d d | ||
| 266 | ;; | ||
| 267 | ;; y - 0 - 119 ( 1980 - 2099 ) | ||
| 268 | ;; m - 1 - 31 | ||
| 269 | ;; d - 1 - 31 | ||
| 270 | ;; | ||
| 271 | ;;**************************************************************************** | ||
| 272 | SET_FILE_DATE_TIME MACRO FILE_HANDLE, VAR_HOUR, VAR_MINUTES, VAR_SECONDS, VAR_YEAR, VAR_MONTH, VAR_DAY ;;AN000; | ||
| 273 | CALL HOOK_INT_24 ;;AN000; | ||
| 274 | ;; | ||
| 275 | ;; Handle the file's time first | ||
| 276 | ;; | ||
| 277 | MOV BX, VAR_SECONDS ;;AN000; Get the number of seconds | ||
| 278 | SHR BX, 1 ;;AN000; Need the number of 2 seconds | ||
| 279 | MOV AX, VAR_MINUTES ;;AN000; Get the number of minutes | ||
| 280 | MOV CL, 5 ;;AN000; | ||
| 281 | SHL AX, CL ;;AN000; Least significant bit #5 | ||
| 282 | OR BX, AX ;;AN000; | ||
| 283 | MOV AX, VAR_HOUR ;;AN000; Get the number of hours | ||
| 284 | XCHG AH, AL ;;AN000; | ||
| 285 | MOV CL, 3 ;;AN000; | ||
| 286 | SHL AX, CL ;;AN000; Put hours at bit #11 | ||
| 287 | OR BX, AX ;;AN000; | ||
| 288 | ;; | ||
| 289 | ;; Handle the file's date now | ||
| 290 | ;; | ||
| 291 | MOV DX, VAR_DAY ;;AN000; Get the day. | ||
| 292 | MOV AX, VAR_MONTH ;;AN000; | ||
| 293 | MOV CL, 5 ;;AN000; | ||
| 294 | SHL AX, CL ;;AN000; Least significant month bit #5 | ||
| 295 | OR DX, AX ;;AN000; | ||
| 296 | MOV AX, VAR_YEAR ;;AN000; Get the year (1980 - 2099) | ||
| 297 | SUB AX, 1980 ;;AN000; Put in the range 0 - 119 | ||
| 298 | XCHG AL, AH ;;AN000; | ||
| 299 | SHL AX, 1 ;;AN000; | ||
| 300 | OR DX, AX ;;AN000; | ||
| 301 | |||
| 302 | MOV CX, BX ;;AN000; | ||
| 303 | MOV BX, FILE_HANDLE ;;AN000; | ||
| 304 | MOV AX, 5701H ;;AN000; | ||
| 305 | DOSCALL ;;AN000; | ||
| 306 | CALL RESTORE_INT_24 ;;AN000; | ||
| 307 | |||
| 308 | ENDM ;;AN000; | ||
| 309 | ;;************************************************************************;; | ||
| 310 | ;; | ||
| 311 | ;; CHECK_CLOCK: Check if the real time clock is operating. | ||
| 312 | ;; | ||
| 313 | ;; SYNTAX: CHECK_CLOCK | ||
| 314 | ;; | ||
| 315 | ;; INPUT: | ||
| 316 | ;; None. | ||
| 317 | ;; | ||
| 318 | ;; OUTPUT: | ||
| 319 | ;; CY = 0: Real time clock is operating | ||
| 320 | ;; CY = 1: Real time clock is not operating | ||
| 321 | ;; | ||
| 322 | ;; OPERATION: A call to the real time clock services (INT 1Ah, AH = 02h) | ||
| 323 | ;; is performed to get the real time clock. If the clock is operating, | ||
| 324 | ;; the time is returned in the registers and CF = 0 is returned. If the | ||
| 325 | ;; clock is not operating, CF = 1 is returned. | ||
| 326 | ;; | ||
| 327 | ;; Since the older machines may not have the clock services interrupt, | ||
| 328 | ;; the registers are set to zero before the call is made and checked for | ||
| 329 | ;; non-zero on return. | ||
| 330 | ;; | ||
| 331 | ;;**************************************************************************** | ||
| 332 | CHECK_CLOCK MACRO ;;AN000; | ||
| 333 | MOV CX, 0 ;;AN000; Zero the registers for later comparison | ||
| 334 | MOV DX, 0 ;;AN000; | ||
| 335 | MOV AH, 02 ;;AN000; | ||
| 336 | INT 1AH ;;AN000; Time of day service routine | ||
| 337 | .IF < ZERO CX > AND ;;AN000; If CX and DH are zero, clock is not there. | ||
| 338 | .IF < ZERO DH > ;;AN000; | ||
| 339 | STC ;;AN000; | ||
| 340 | .ELSE ;;AN000; | ||
| 341 | CLC ;;AN000; The clock is there! | ||
| 342 | .ENDIF ;;AN000; | ||
| 343 | |||
| 344 | ENDM ;;AN000; | ||
| 345 | INCLUDE MACROS5.INC ;;AN000; | ||