diff options
Diffstat (limited to 'v4.0/src/DEV/DISPLAY/DISPLAY.ASM')
| -rw-r--r-- | v4.0/src/DEV/DISPLAY/DISPLAY.ASM | 388 |
1 files changed, 388 insertions, 0 deletions
diff --git a/v4.0/src/DEV/DISPLAY/DISPLAY.ASM b/v4.0/src/DEV/DISPLAY/DISPLAY.ASM new file mode 100644 index 0000000..16738b7 --- /dev/null +++ b/v4.0/src/DEV/DISPLAY/DISPLAY.ASM | |||
| @@ -0,0 +1,388 @@ | |||
| 1 | PAGE ,132 | ||
| 2 | TITLE DOS - CONSOLE Code Page Switching Device Driver | ||
| 3 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 4 | ; | ||
| 5 | ; FILENAME: DISPLAY.ASM | ||
| 6 | ; PROGRAM: DISPLAY.SYS (Main module) | ||
| 7 | ; LINK PROCEDURE: Linkk | ||
| 8 | ; INSTALLATION: | ||
| 9 | ; | ||
| 10 | ; This routine is structured as a DOS Device Driver. | ||
| 11 | ; IE it is installed via the CONFIG.SYS command: | ||
| 12 | ; DEVICE=DISPLAY.SYS | ||
| 13 | ; | ||
| 14 | ; The following device commands are supported: | ||
| 15 | ; | ||
| 16 | ; 00 hex - INIT | ||
| 17 | ; ------------- | ||
| 18 | ; Install the CON device driver. This is used for downloading of | ||
| 19 | ; the character sets (various Code Pages) according to the respective | ||
| 20 | ; display adapter. The interface provided by the video BIOS is used | ||
| 21 | ; to download a block of 256 characters (in various resolutions - ie. | ||
| 22 | ; 8x8, 8x14, and 8x16). Also, the interrupt 2F hex is chained for | ||
| 23 | ; communication between the CON device driver and the keyboard routine. | ||
| 24 | ; | ||
| 25 | ; Refer to INIT.ASM for code | ||
| 26 | ; | ||
| 27 | ; 13 hex - GENERIC IOCTL | ||
| 28 | ; ---------------------- | ||
| 29 | ; INVOKE | ||
| 30 | ; ------ | ||
| 31 | ; Invoke is use to activate the appropriate CP font. The mechanism | ||
| 32 | ; is based soley on the code page value passed from the MODE & CHCP | ||
| 33 | ; commands. Once a CP ahs benn INVOKED, it is loaded for ALL display | ||
| 34 | ; modes on the respective display adapter - ONLY IF the proper font | ||
| 35 | ; resolution can be accessed. | ||
| 36 | ; | ||
| 37 | ; Refer to CPS-FUNC.INC for code | ||
| 38 | ; | ||
| 39 | ; DESIGNATE START | ||
| 40 | ; --------------- | ||
| 41 | ; Designate start passes the list of designated code pages to load. | ||
| 42 | ; It is sent just prior to the IOCTL WRITE calls containing the 'CPI' | ||
| 43 | ; files. The list of designated code pages is check for duplicates | ||
| 44 | ; and for invalids (-1). | ||
| 45 | ; | ||
| 46 | ; Refer to CPS-FUNC.INC for code | ||
| 47 | ; | ||
| 48 | ; DESIGNATE STOP | ||
| 49 | ; -------------- | ||
| 50 | ; Once the data (for a DESIGNATION) has been routed to the CPS driver, | ||
| 51 | ; it is followed by a DESIGNATE STOP command. This confirms the completion | ||
| 52 | ; of the DESIGNATE procedure. If there was an error detected during the | ||
| 53 | ; DESIGNATE procedure, it must be followed by a DESIGNATE STOP. | ||
| 54 | ; | ||
| 55 | ; Refer to CPS-FUNC.INC for code | ||
| 56 | ; | ||
| 57 | ; | ||
| 58 | ; 0C hex - IOCTL OUTPUT | ||
| 59 | ; --------------------- | ||
| 60 | ; Following a DESIGNATE START, the contents of the specified data file | ||
| 61 | ; (expected .CPI format) is copied by DOS to the CPS driver. This is | ||
| 62 | ; via the GENERIC IOCTL WRITE calls. During these calls, the data is | ||
| 63 | ; parsed by the FONT-PARSER (F-PARSER.SRC) to select the CP and fonts | ||
| 64 | ; required. | ||
| 65 | ; | ||
| 66 | ; Refer to CPS-FUNC.INC for code | ||
| 67 | ; | ||
| 68 | ; | ||
| 69 | ; (C)Copyright 1988 Microsoft | ||
| 70 | ; | ||
| 71 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 72 | ; | ||
| 73 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 74 | ; | ||
| 75 | ; Request Header (Common portion) | ||
| 76 | ; | ||
| 77 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 78 | IF1 ; | ||
| 79 | %OUT .Compiling: DISPLAY.ASM | ||
| 80 | %OUT . ô CPS-CON driver | ||
| 81 | %OUT . õ Version 3.30 | ||
| 82 | %OUT .Include Files: | ||
| 83 | ENDIF ; | ||
| 84 | INCLUDE MACROS.INC ; | ||
| 85 | INCLUDE DEF-EQU.INC ; | ||
| 86 | ; | ||
| 87 | PUBLIC EOF_MARKER ; | ||
| 88 | PUBLIC CPD_ACTIVE ; | ||
| 89 | PUBLIC CPD_CLASS ; | ||
| 90 | PUBLIC CPD_HDWR_N_MAX ; | ||
| 91 | PUBLIC CPD_DESG_N_MAX ; | ||
| 92 | PUBLIC CPD_HDWR_N ; | ||
| 93 | PUBLIC CPD_DESG_N ; | ||
| 94 | PUBLIC CPD_FONTS_N ; | ||
| 95 | PUBLIC CPD_FONT_PNTER ; | ||
| 96 | PUBLIC IRPT_2 ; | ||
| 97 | PUBLIC IRPT_CMD_EXIT ; | ||
| 98 | PUBLIC DEV_HDR ; | ||
| 99 | EXTRN INIT:NEAR ; | ||
| 100 | ; | ||
| 101 | CODE SEGMENT BYTE PUBLIC 'CODE' ; | ||
| 102 | ASSUME CS:CODE,DS:CODE ; | ||
| 103 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 104 | ;**************************************** | ||
| 105 | ;** Resident Code ** | ||
| 106 | ;**************************************** | ||
| 107 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 108 | START EQU $ ; begin resident data & code | ||
| 109 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 110 | ; | ||
| 111 | ; DEVICE HEADER - must be at offset zero within device driver | ||
| 112 | ; (DHS is defined according to this structure) | ||
| 113 | ; | ||
| 114 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 115 | ORG 0000H ; | ||
| 116 | ; | ||
| 117 | DEV_HDR:DD -1 ; Pointer to next device header | ||
| 118 | DW 0C053H ; Attribute (Char device) | ||
| 119 | DW OFFSET STRATEGY ; Pnter to device "strategy" | ||
| 120 | DW OFFSET INTERRUPT ; Pnter to device "interrupt" | ||
| 121 | DB 'CON ' ; Device name | ||
| 122 | ; and of course a descriptive name | ||
| 123 | ; which can be viewed by a TYPE! | ||
| 124 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 125 | ; | ||
| 126 | ; Console Description Table | ||
| 127 | ; | ||
| 128 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 129 | .XLIST ; | ||
| 130 | STACK_END DW 1FFH+60H DUP(0) ; 200H + 'my' needs (re/ DOS 3.30 ref) | ||
| 131 | STACK_START DW 0 ; | ||
| 132 | OLD_STACK_S DW ? ; | ||
| 133 | OLD_STACK_O DW ? ; | ||
| 134 | .LIST ; | ||
| 135 | ; | ||
| 136 | BUF1: BUF_DATA <> ; exclude PAR_EXTRACTO | ||
| 137 | ; | ||
| 138 | CP_PNTER_TABLE DW OFFSET CPD_HDWR_N ; TABLE OF POINTERS TO CP INFO | ||
| 139 | DW OFFSET CPD_DESG_N ; | ||
| 140 | DW OFFSET CPD_FONT_PNTER; | ||
| 141 | DW OFFSET CPD_FONT_WRITE; | ||
| 142 | DW OFFSET CPD_FONT_DATA ; | ||
| 143 | ; | ||
| 144 | CPD_TABLE LABEL WORD ; TABLE DATA INFO FOR CP's | ||
| 145 | CPD_ACTIVE DW -1 ; TEMPORARY | ||
| 146 | CPD_CLASS DB '........' ; THIS IS SET TO (EGA, LCD) | ||
| 147 | CPD_FONTS_N DW -1 ; | ||
| 148 | CPD_HDWR_N DW 0 ; | ||
| 149 | DW 12 DUP(-1) ; (HDWR_CP's) (MAX=12) | ||
| 150 | CPD_HDWR_N_MAX EQU ($-CPD_HDWR_N)/2-1 ; | ||
| 151 | CPD_DESG_N DW -1 ; # OF DESIG CP's | ||
| 152 | DW 12 DUP(-1) ; (DESG CP's) (MAX=12) | ||
| 153 | CPD_DESG_N_MAX EQU ($-CPD_DESG_N)/2-1 ; | ||
| 154 | CPD_FONT_PNTER DW 12 DUP(0,0) ; SEG_OFFSET POINTER TO DATA BUFFERS | ||
| 155 | CPD_FONT_WRITE DW 12 DUP(0,0) ; SEG_OFFSET OF FONTS BEING WRITTEN | ||
| 156 | CPD_FONT_DATA DW 12 DUP(0) ; COUNT OF FONT DATA TO SKIP/COPY! | ||
| 157 | FONT_PRIORITY DB 8 DUP(-1) ; USED TO CLASSIFY FONT PRIORITY | ||
| 158 | NUM_FONT_PRIORITY EQU ($-FONT_PRIORITY) ; DURING A DESIGNATION | ||
| 159 | CPD_TEMP_DESG DW 0 ; # OF DESIG CP's TEMP BUFFER | ||
| 160 | DW 12 DUP(-1) ; (DESG CP's) (MAX=12) | ||
| 161 | CPD_REQ_DESG DW 0 ; # OF DESIG CP's REQUESTED | ||
| 162 | DW 12 DUP(-1) ; (DESG CP's) (MAX=12) | ||
| 163 | ;;;;;;; | ||
| 164 | |||
| 165 | ANSI_DA_INFO DA_INFO_PACKET <> ;J.K. Information packet to ANSI used for MODE SET INT10 call. | ||
| 166 | |||
| 167 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 168 | ; | ||
| 169 | ; CON Device "strategy" entry point | ||
| 170 | ; Retain the Request Header address for use by Interrupt routine | ||
| 171 | ; | ||
| 172 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 173 | ASSUME DS:NOTHING ; | ||
| 174 | STRATEGY PROC FAR ; | ||
| 175 | PUSH BX ; | ||
| 176 | PUSH BX ; | ||
| 177 | LEA BX, BUF1 ; BUF = BUF1 CS:[BX] | ||
| 178 | POP BUF.RH_PTRO ; OFFSET OF REQUEST HEADER | ||
| 179 | MOV BUF.RH_PTRS,ES ; SEGMENT | ||
| 180 | POP BX ; | ||
| 181 | RET ; | ||
| 182 | STRATEGY ENDP ; | ||
| 183 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 184 | ; | ||
| 185 | ; Table of command processing routine entry points | ||
| 186 | ; | ||
| 187 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 188 | CMD_TABLE LABEL WORD ; | ||
| 189 | DW OFFSET INIT ; 0 - Initialization | ||
| 190 | DW OFFSET NO_OPERATION ; 1 - Media check | ||
| 191 | DW OFFSET NO_OPERATION ; 2 - Build BPB | ||
| 192 | DW OFFSET NO_OPERATION ; 3 - IOCTL input | ||
| 193 | DW OFFSET NO_OPERATION ; 4 - Input | ||
| 194 | DW OFFSET NO_OPERATION ; 5 - Non destructive input no wait | ||
| 195 | DW OFFSET NO_OPERATION ; 6 - Input status | ||
| 196 | DW OFFSET NO_OPERATION ; 7 - Input flush | ||
| 197 | DW OFFSET NO_OPERATION ; 8 - Write | ||
| 198 | DW OFFSET NO_OPERATION ; 9 - Output with verify | ||
| 199 | DW OFFSET NO_OPERATION ; A - Output status | ||
| 200 | DW OFFSET NO_OPERATION ; B - Output flush | ||
| 201 | DW OFFSET DESG_WRITE ; C - IOCTL output | ||
| 202 | DW OFFSET NO_OPERATION ; D - Device OPEN | ||
| 203 | DW OFFSET NO_OPERATION ; E - Device CLOSE | ||
| 204 | DW OFFSET NO_OPERATION ; F - Removable media | ||
| 205 | DW OFFSET NO_OPERATION ; 10 - Removable media | ||
| 206 | DW OFFSET NO_OPERATION ; 11 - Removable media | ||
| 207 | DW OFFSET NO_OPERATION ; 12 - Removable media | ||
| 208 | DW OFFSET GENERIC_IOCTL ; 13 - Removable media | ||
| 209 | MAX_CMD EQU ($-CMD_TABLE)/2 ; highest valid command follows | ||
| 210 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 211 | ; | ||
| 212 | ; CON Device "interrupt" entry point | ||
| 213 | ; | ||
| 214 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 215 | INTERRUPT PROC FAR ; device interrupt entry point | ||
| 216 | PUSH AX ; | ||
| 217 | PUSH BX ; | ||
| 218 | PUSH CX ; | ||
| 219 | PUSH DI ; | ||
| 220 | PUSH SI ; | ||
| 221 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 222 | ; | ||
| 223 | ; Common interrupt entry : | ||
| 224 | ; at entry, BUFn (CS:BX) of CON is defined | ||
| 225 | ; | ||
| 226 | ; Check if header link has to be set | ||
| 227 | ; | ||
| 228 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 229 | LEA BX, BUF1 ; | ||
| 230 | MOV DI,OFFSET DEV_HDR ; CON Device header | ||
| 231 | ; | ||
| 232 | MOV BUF.DEV_HDRO,DI ; | ||
| 233 | MOV BUF.DEV_HDRS,CS ; | ||
| 234 | CLD ; all moves forward | ||
| 235 | ; | ||
| 236 | CMP BUF.CON_STRAO, -1 ; | ||
| 237 | JNE L4 ; has been linked to DOS CON | ||
| 238 | CMP BUF.CON_STRAS, -1 ; | ||
| 239 | JNE L4 ; has been linked to DOS CON | ||
| 240 | ; next device header : ES:[DI] | ||
| 241 | LDS SI,DWORD PTR BUF.DEV_HDRO; | ||
| 242 | LES DI,DWORD PTR HP.DH_NEXTO; | ||
| 243 | ; | ||
| 244 | ;$SEARCH WHILE ; pointer to next device header is NOT | ||
| 245 | L1: ; | ||
| 246 | PUSH ES ; -1 | ||
| 247 | POP AX ; | ||
| 248 | CMP AX,-1 ; | ||
| 249 | ;$LEAVE E, AND ; leave if both offset and segment are | ||
| 250 | JNE NOT0FFFF ; | ||
| 251 | ; | ||
| 252 | CMP DI,-1 ; 0FFFFH | ||
| 253 | ;$LEAVE E ; | ||
| 254 | JE L4 ; | ||
| 255 | NOT0FFFF: ; | ||
| 256 | PUSH DI ; | ||
| 257 | PUSH SI ; | ||
| 258 | MOV CX,NAME_LEN ; | ||
| 259 | LEA DI,NHD.DH_NAME ; | ||
| 260 | LEA SI,HP.DH_NAME ; | ||
| 261 | REPE CMPSB ; | ||
| 262 | POP SI ; | ||
| 263 | POP DI ; | ||
| 264 | AND CX,CX ; | ||
| 265 | ;$EXITIF Z ; Exit if name is found in linked hd. | ||
| 266 | JNZ L3 ; Name is not found | ||
| 267 | ; Name is found in the linked header | ||
| 268 | MOV AX,NHD.DH_STRAO ; Get the STRATEGY address | ||
| 269 | MOV BUF.CON_STRAO,AX ; | ||
| 270 | MOV AX,ES ; | ||
| 271 | X1: MOV BUF.CON_STRAS,AX ; | ||
| 272 | ; | ||
| 273 | MOV AX,NHD.DH_INTRO ; Get the INTERRUPT address | ||
| 274 | MOV BUF.CON_INTRO,AX ; | ||
| 275 | MOV AX,ES ; | ||
| 276 | X2: MOV BUF.CON_INTRS,AX ; | ||
| 277 | ; | ||
| 278 | ;$ORELSE ; FInd next header to have the same | ||
| 279 | JMP L4 ; Device Name | ||
| 280 | L3: ; | ||
| 281 | LES DI,DWORD PTR NHD.DH_NEXTO; | ||
| 282 | ;$ENDLOOP ; | ||
| 283 | JMP L1 ; | ||
| 284 | L4: ; | ||
| 285 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 286 | ; | ||
| 287 | ; COMMAND REQUEST | ||
| 288 | ; ES:DI REQUEST HEADER | ||
| 289 | ; | ||
| 290 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 291 | LES DI,DWORD PTR BUF.RH_PTRO; GET RH ADDRESS PASSED TO | ||
| 292 | ; "STRATEGY" INTO ES:DI | ||
| 293 | MOV AL,RH.RHC_CMD ; COMMAND CODE FROM REQUEST HEADER | ||
| 294 | CBW ; ZERO AH (IF AL > 7FH, NEXT COMPARE | ||
| 295 | ; WILL CATCH THAT ERROR) | ||
| 296 | CMP AL,MAX_CMD ; IF COMMAND CODE IS TOO HIGH | ||
| 297 | JAE L6 ; JUMP TO ERROR ROUTINE | ||
| 298 | ; | ||
| 299 | ADD AX,AX ; DOUBLE COMMAND CODE FOR TABLE OFFSET | ||
| 300 | MOV SI,AX ; PUT INTO INDEX REGISTER FOR JMP | ||
| 301 | ; | ||
| 302 | CALL CS:CMD_TABLE[SI] ; CALL ROUTINE TO HANDLE THE COMMAND | ||
| 303 | JC IRPT_CMD_EXIT ; CY=1 IF NO PASS_CONTROL REQ'D | ||
| 304 | CALL PASS_CONTROL ; | ||
| 305 | JUMP IRPT_2 ; | ||
| 306 | ; | ||
| 307 | L6: CALL PASS_CONTROL ; CALL ROUTINE TO HANDLE THE COMMAND | ||
| 308 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 309 | ; At entry to command processing routine | ||
| 310 | ; | ||
| 311 | ; ES:DI = Request Header address | ||
| 312 | ; CS:BX = Buffer for CON | ||
| 313 | ; CS = code segment address | ||
| 314 | ; AX = 0 | ||
| 315 | ; | ||
| 316 | ; top of stack is return address, IRPT_CMD_EXIT | ||
| 317 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 318 | IRPT_CMD_EXIT: ; RETURN FROM COMMAND ROUTINE | ||
| 319 | LES DI,DWORD PTR BUF.RH_PTRO; RESTORE ES:DI AS REQUEST HEADER PTR | ||
| 320 | XOR AX,AX ; | ||
| 321 | OR AX,BUF.STATUS ; | ||
| 322 | JE IRPT_0 ; | ||
| 323 | XOR BUF.STATUS,AX ; SET STATUS BACK TO OK! | ||
| 324 | OR AX,STAT_CMDERR ; | ||
| 325 | JUMP IRPT_1 ; | ||
| 326 | IRPT_0: OR AH,STAT_DONE ; ADD "DONE" BIT TO STATUS WORD | ||
| 327 | IRPT_1: MOV RH.RHC_STA,AX ; STORE STATUS INTO REQUEST HEADER | ||
| 328 | IRPT_2: POP SI ; RESTORE REGISTERS | ||
| 329 | POP DI ; | ||
| 330 | POP CX ; | ||
| 331 | POP BX ; | ||
| 332 | POP AX ; | ||
| 333 | RET ; | ||
| 334 | INTERRUPT ENDP ; | ||
| 335 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 336 | ; | ||
| 337 | ; PASS CONTROL | ||
| 338 | ; | ||
| 339 | ; This calls the attached device to perform any further | ||
| 340 | ; action on the call! | ||
| 341 | ; | ||
| 342 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 343 | PASS_CONTROL PROC ; | ||
| 344 | PUSH BX ; | ||
| 345 | PUSH BX ; | ||
| 346 | POP SI ; | ||
| 347 | LES BX,DWORD PTR BUF.RH_PTRO; pass the request header to the | ||
| 348 | CALL DWORD PTR CS:[SI].CON_STRAO ; CON strategy routine. | ||
| 349 | POP BX ; | ||
| 350 | CALL DWORD PTR BUF.CON_INTRO ; interrupt the CON | ||
| 351 | RET ; | ||
| 352 | PASS_CONTROL ENDP ; | ||
| 353 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 354 | ; | ||
| 355 | ; | ||
| 356 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 357 | NO_OPERATION PROC ; | ||
| 358 | CLC ; | ||
| 359 | RET ; | ||
| 360 | NO_OPERATION ENDP ; | ||
| 361 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 362 | ; | ||
| 363 | ; PULL IN THE CODE PAGE FUNCTION CODE | ||
| 364 | ; | ||
| 365 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 366 | INCLUDE INT2FCOM.INC ; | ||
| 367 | INCLUDE INT10COM.INC ; | ||
| 368 | INCLUDE CPS-FUNC.INC ; | ||
| 369 | INCLUDE WRITE.INC ; SPECIAL MARKER IN WRITE.INC | ||
| 370 | INCLUDE F-PARSER.INC ; | ||
| 371 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 372 | ; | ||
| 373 | ; Adjust the assembly-time instruction counter to a paragraph | ||
| 374 | ; boundary | ||
| 375 | ; | ||
| 376 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 377 | IF ($-START) MOD 16 ; | ||
| 378 | ORG ($-START)+16-(($-START) MOD 16); | ||
| 379 | ENDIF ; | ||
| 380 | EOF_MARKER EQU $ ; end of resident code | ||
| 381 | ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | ||
| 382 | ; | ||
| 383 | ; END-OF-CODE | ||
| 384 | ; | ||
| 385 | ;;;;;;;;;;;;;;;;; | ||
| 386 | CODE ENDS ; | ||
| 387 | END ; | ||
| 388 | ;;;;;;;;;;;;;;;;; | ||