diff options
Diffstat (limited to 'v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC')
| -rw-r--r-- | v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC | 573 |
1 files changed, 573 insertions, 0 deletions
diff --git a/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC b/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC new file mode 100644 index 0000000..37e661b --- /dev/null +++ b/v4.0-ozzie/bin/DISK2/BIOS/ANSI.INC | |||
| @@ -0,0 +1,573 @@ | |||
| 1 | ; Termcap description of capabilities: | ||
| 2 | |||
| 3 | ;ibmans4:mtcon:IBM PC with V4.0 ANSI driver:\ | ||
| 4 | ; :al=\E[L:am:bs:ce=\E[K:cl=\E[2J\E[H:cm=\E[%;%H:co#80:\ | ||
| 5 | ; :dl=\E[M:do=\E[B:ho=\E[H:li#24:mi:nd=\E[C:\ | ||
| 6 | ; :ms:pt:se=\E[m:so=\E[1;36m:up=\E[A:\ | ||
| 7 | ; :kb=^h:ku=\E[A:kd=\E[B:kl=\E[D:kr=\E[C:kh=\E[H:kn#8:\ | ||
| 8 | ; :k1=\ES:k2=\ET:k3=\EU:k4=\EV:k5=\EW:\ | ||
| 9 | ; :k6=\EP:k7=\EQ:k8=\ER: | ||
| 10 | |||
| 11 | CMDTABL DB 'A' | ||
| 12 | DW CUU ;CUrsor Up | ||
| 13 | DB 'B' | ||
| 14 | DW CUD ;CUrsor Down | ||
| 15 | DB 'C' | ||
| 16 | DW CUF ;CUrsor Forward | ||
| 17 | DB 'D' | ||
| 18 | DW CUB ;CUrsor Back | ||
| 19 | DB 'H' | ||
| 20 | DW CUP ;CUrsor Position | ||
| 21 | DB 'J' | ||
| 22 | DW ED ;Erase in Display | ||
| 23 | DB 'K' | ||
| 24 | DW EL ;Erase in Line | ||
| 25 | DB 'L' | ||
| 26 | DW IL ;Insert Line | ||
| 27 | DB 'M' | ||
| 28 | DW xDL ;Delete Line | ||
| 29 | ;; DB 'R' | ||
| 30 | ;; DW CPR ;Cursor Postion Report | ||
| 31 | DB 'f' | ||
| 32 | DW HVP ;Horizontal and Vertical Position | ||
| 33 | DB 'h' | ||
| 34 | DW SM ;Set Mode | ||
| 35 | DB 'l' | ||
| 36 | DW RM ;Reset Mode | ||
| 37 | DB 'm' | ||
| 38 | DW SGR ;Select Graphics Rendition | ||
| 39 | ;; DB 'n' | ||
| 40 | ;; DW DSR ;Device Status Report | ||
| 41 | DB 's' | ||
| 42 | DW SCP ;Save Cursor Position | ||
| 43 | DB 'u' | ||
| 44 | DW RCP ;Restore Cursor Position | ||
| 45 | DB 00 | ||
| 46 | |||
| 47 | ; Graphic Rendition modes: parameter, mask, set | ||
| 48 | GRMODE DB 00,00000000B,00000111B ; all off | ||
| 49 | DB 01,11111111B,00001000B ; bold (increased intensity) | ||
| 50 | DB 04,11111000B,00000001B ; underscore | ||
| 51 | DB 05,11111111B,10000000B ; blink | ||
| 52 | DB 07,11111000B,01110000B ; reverse video | ||
| 53 | DB 08,10001000B,00000000B ; concealed | ||
| 54 | DB 30,11111000B,00000000B ; foreground colors ... | ||
| 55 | DB 31,11111000B,00000100B | ||
| 56 | DB 32,11111000B,00000010B | ||
| 57 | DB 33,11111000B,00000110B | ||
| 58 | DB 34,11111000B,00000001B | ||
| 59 | DB 35,11111000B,00000101B | ||
| 60 | DB 36,11111000B,00000011B | ||
| 61 | DB 37,11111000B,00000111B | ||
| 62 | DB 40,10001111B,00000000B ; background colors ... | ||
| 63 | DB 41,10001111B,01000000B | ||
| 64 | DB 42,10001111B,00100000B | ||
| 65 | DB 43,10001111B,01100000B | ||
| 66 | DB 44,10001111B,00010000B | ||
| 67 | DB 45,10001111B,01010000B | ||
| 68 | DB 46,10001111B,00110000B | ||
| 69 | DB 47,10001111B,01110000B | ||
| 70 | DB 0FFH | ||
| 71 | |||
| 72 | ; Set/Reset Modes: indexed by (SelChar-'<'*8) + (PARAM0 AND 7) | ||
| 73 | SRMODE DW 0,0,0,0,0,0,0,0 ; SelChar '<' | ||
| 74 | DW 1,1,1,1,1,1,1,WRAP ; SelChar '=' | ||
| 75 | DW 0,EnaL25,0,0,0,0,0,0 ; SelChar '>' | ||
| 76 | DW 0,0,0,0,0,0,0,WRAP ; SelChar '?' | ||
| 77 | |||
| 78 | PAGE | ||
| 79 | ; The following are duplicates of the same variables from the ROM | ||
| 80 | ; | ||
| 81 | ;* WARNING - the following two variables are accessed as a word | ||
| 82 | MODE DB 3 | ||
| 83 | MAXCOL DB 79 | ||
| 84 | IF LINE25 ; special treatment of line 25? | ||
| 85 | maxrow equ 24 | ||
| 86 | ELSE | ||
| 87 | maxrow equ 25 | ||
| 88 | ENDIF | ||
| 89 | ;* WARNING - the following two variables are accessed as a word | ||
| 90 | COL DB 0 ; current column | ||
| 91 | ROW DB 0 ; current row | ||
| 92 | |||
| 93 | |||
| 94 | AnsiState LABEL BYTE ; the following must be saved on a screen swap | ||
| 95 | WRAP DB 1 ; 0 = NO WRAP, 1 = WRAP | ||
| 96 | EnaL25 DB 0 ; 0 = 25th line disabled, 1 = enabled | ||
| 97 | STATE DW S1 | ||
| 98 | SAVCR DW 0 ; saved cursor position | ||
| 99 | ;* WARNING - the following two variables are accessed as a word | ||
| 100 | SelChar DB 0 ; <,=,> or ? private use indicators | ||
| 101 | PRMCNT LABEL BYTE ; number of parameters for command | ||
| 102 | PRMCNTW DW 0 | ||
| 103 | NUMPARAM equ 5 ; max. number of parameters | ||
| 104 | PARAM DB NUMPARAM DUP (?) ; buffer for command parameters | ||
| 105 | ;* WARNING - the following two variables are accessed as a word | ||
| 106 | attrw LABEL WORD | ||
| 107 | ATTR DB 00000111B ;CHARACTER ATTRIBUTE | ||
| 108 | BPAGE DB 0 ;BASE PAGE | ||
| 109 | |||
| 110 | AnsiSize equ ($-AnsiState) | ||
| 111 | |||
| 112 | IF (AnsiSize GT TermSize) | ||
| 113 | .RADIX 0 ; ERROR - Terminal state not big enough | ||
| 114 | ENDIF | ||
| 115 | |||
| 116 | ;------------------------------------------------------------- | ||
| 117 | ; | ||
| 118 | ; CHROUT - WRITE OUT CHAR IN AL USING CURRENT ATTRIBUTE | ||
| 119 | ; | ||
| 120 | base dw 0b800h | ||
| 121 | screen_seg dw 00000h | ||
| 122 | |||
| 123 | chrout: cmp al,13 ; carriage return? | ||
| 124 | ja outchr | ||
| 125 | jnz trylf | ||
| 126 | mov [col],0 | ||
| 127 | ;; jmp short setit | ||
| 128 | jmp setit | ||
| 129 | |||
| 130 | trylf: cmp al,10 ; line feed? | ||
| 131 | jz lf | ||
| 132 | cmp al,7 ; bell? | ||
| 133 | jnz trytab | ||
| 134 | torom: | ||
| 135 | mov bx,[attrw] | ||
| 136 | and bl,7 | ||
| 137 | mov ah,14 | ||
| 138 | int 10h | ||
| 139 | ret5: ret | ||
| 140 | |||
| 141 | trytab: | ||
| 142 | cmp al,9 ; tab? | ||
| 143 | jnz tryback | ||
| 144 | mov al,[col] | ||
| 145 | add al,8 | ||
| 146 | mov ah,al | ||
| 147 | and ah,7 | ||
| 148 | sub al,ah | ||
| 149 | cmp al,[maxcol] | ||
| 150 | jb tunder | ||
| 151 | mov al,[maxcol] | ||
| 152 | tunder: | ||
| 153 | mov [col],al | ||
| 154 | jmp short setit | ||
| 155 | |||
| 156 | tryback: | ||
| 157 | cmp al,8 ; backspace? | ||
| 158 | jnz outchr | ||
| 159 | cmp [col],0 | ||
| 160 | jz ret5 | ||
| 161 | dec [col] | ||
| 162 | jmp short setit | ||
| 163 | |||
| 164 | outchr: | ||
| 165 | mov bx,[attrw] | ||
| 166 | mov cx,1 | ||
| 167 | mov ah,9 | ||
| 168 | int 10h | ||
| 169 | inc [col] | ||
| 170 | mov al,[col] | ||
| 171 | cmp al,[maxcol] | ||
| 172 | jbe setit | ||
| 173 | cmp [wrap],1 | ||
| 174 | jz outchr1 | ||
| 175 | dec [col] | ||
| 176 | ret | ||
| 177 | outchr1: | ||
| 178 | mov [col],0 | ||
| 179 | lf: cmp [row],(maxrow-1) | ||
| 180 | ja setit ; on line 25, don't move | ||
| 181 | jz lf1 ; on 24th line, scroll | ||
| 182 | inc [row] | ||
| 183 | jmp short setit | ||
| 184 | lf1: call scroll | ||
| 185 | |||
| 186 | setit: mov dx,word ptr col | ||
| 187 | mov bh,[bpage] | ||
| 188 | mov ah,2 | ||
| 189 | int 10h | ||
| 190 | ret | ||
| 191 | |||
| 192 | scroll: mov al,mode | ||
| 193 | cmp al,2 | ||
| 194 | jz myscroll | ||
| 195 | cmp al,3 | ||
| 196 | jz myscroll | ||
| 197 | IF LINE25 | ||
| 198 | xor cx,cx ; from 0,0 | ||
| 199 | mov dh,(maxrow-1) ; to maxrow-1,maxcol | ||
| 200 | mov dl,maxcol | ||
| 201 | mov bh,attr | ||
| 202 | mov ax,0601h ; scroll up one line | ||
| 203 | int 10h | ||
| 204 | ret | ||
| 205 | ELSE | ||
| 206 | mov al,10 | ||
| 207 | jmp torom | ||
| 208 | ENDIF | ||
| 209 | myscroll: | ||
| 210 | mov bh,[attr] | ||
| 211 | mov bl,' ' | ||
| 212 | mov bp,80 | ||
| 213 | mov ax,[base] | ||
| 214 | add ax,[screen_seg] | ||
| 215 | mov es,ax | ||
| 216 | mov ds,ax | ||
| 217 | xor di,di | ||
| 218 | mov si,160 | ||
| 219 | mov cx,(maxrow-1)*80 | ||
| 220 | cld | ||
| 221 | |||
| 222 | ; This code will never get executed since we get here when | ||
| 223 | ; mode = 2 or 3 only. | ||
| 224 | ;; cmp cs:[base],0b800h | ||
| 225 | ;; jz colorcard | ||
| 226 | |||
| 227 | ;; rep movsw | ||
| 228 | ;; mov ax,bx | ||
| 229 | ;; mov cx,bp | ||
| 230 | ;; rep stosw | ||
| 231 | ;; jmp short sret | ||
| 232 | |||
| 233 | ;;colorcard: | ||
| 234 | mov dx,3dah | ||
| 235 | wait2: in al,dx | ||
| 236 | test al,8 | ||
| 237 | jz wait2 | ||
| 238 | mov al,25h | ||
| 239 | mov dx,3d8h | ||
| 240 | out dx,al ;turn off video | ||
| 241 | rep movsw | ||
| 242 | mov ax,bx | ||
| 243 | mov cx,bp | ||
| 244 | rep stosw | ||
| 245 | mov al,29h | ||
| 246 | mov dx,3d8h | ||
| 247 | out dx,al ;turn on video | ||
| 248 | sret: push cs | ||
| 249 | pop ds | ||
| 250 | ret | ||
| 251 | |||
| 252 | |||
| 253 | CharOut: PUSH AX ; Main entry point | ||
| 254 | PUSH BX | ||
| 255 | PUSH CX | ||
| 256 | PUSH DX | ||
| 257 | PUSH SI | ||
| 258 | PUSH DI | ||
| 259 | PUSH ES | ||
| 260 | PUSH BP | ||
| 261 | |||
| 262 | MOV [base],0B800H | ||
| 263 | XCHG AX,SI ; SAVE CHARACTER TO STUFF | ||
| 264 | MOV AX,40H ; POINT TO ROS BIOS | ||
| 265 | MOV DS,AX | ||
| 266 | MOV AX,DS:[49H] ; AL=MODE, AH=MAX COL | ||
| 267 | DEC AH ; ANSI NEEDS 0-79 OR 0-39 | ||
| 268 | MOV WORD PTR CS:[MODE],AX ; SAVE MODE AND MAX COL | ||
| 269 | CMP AL,7 | ||
| 270 | JNZ NOT_BW | ||
| 271 | MOV WORD PTR CS:[base],0B000H | ||
| 272 | NOT_BW: MOV AL,DS:[62H] ; GET ACTIVE PAGE | ||
| 273 | MOV CS:[BPAGE],AL | ||
| 274 | CBW | ||
| 275 | ADD AX,AX | ||
| 276 | MOV BX,AX | ||
| 277 | MOV AX,DS:[BX+50H] ; AL=COL, AH=ROW | ||
| 278 | MOV WORD PTR CS:[COL],AX ; SAVE ROW AND COLUMN | ||
| 279 | MOV AX,DS:[4EH] ; GET START OF SCREEN SEG | ||
| 280 | MOV CL,4 | ||
| 281 | SHR AX,CL ; CONVERT TO A SEGMENT | ||
| 282 | PUSH CS | ||
| 283 | POP DS | ||
| 284 | MOV [screen_seg],AX | ||
| 285 | XCHG AX,SI ; GET BACK CHARACTER IN AL | ||
| 286 | |||
| 287 | CALL VIDEO | ||
| 288 | POP BP | ||
| 289 | POP ES | ||
| 290 | POP DI | ||
| 291 | POP SI | ||
| 292 | POP DX | ||
| 293 | POP CX | ||
| 294 | POP BX | ||
| 295 | POP AX | ||
| 296 | RET | ||
| 297 | |||
| 298 | |||
| 299 | ;---------------------------------------------------------- | ||
| 300 | ; | ||
| 301 | ; OUTPUT SINGLE CHAR IN AL TO VIDEO DEVICE | ||
| 302 | ; | ||
| 303 | VIDEO: MOV SI,OFFSET STATE | ||
| 304 | JMP [SI] | ||
| 305 | |||
| 306 | S2: CMP AL,'[' | ||
| 307 | JZ S22 | ||
| 308 | JMP S1 | ||
| 309 | S22: MOV WORD PTR [SI],OFFSET S30 | ||
| 310 | XOR BX,BX | ||
| 311 | MOV WORD PTR SelChar,BX | ||
| 312 | MOV WORD PTR PARAM,BX | ||
| 313 | JMP SHORT S3B | ||
| 314 | |||
| 315 | S30: CMP AL,'?' ; experimental use selector (SM/RM)? | ||
| 316 | JA S7 | ||
| 317 | mov SelChar,al | ||
| 318 | MOV WORD PTR [SI],OFFSET S3 | ||
| 319 | cmp al,'<' | ||
| 320 | jae S3B | ||
| 321 | |||
| 322 | S3: CMP AL,';' | ||
| 323 | JNZ S3C | ||
| 324 | S3A: INC PRMCNT | ||
| 325 | S3B: CALL GETPTR | ||
| 326 | XOR AX,AX | ||
| 327 | MOV WORD PTR [BX],AX ;DEFAULT VALUE IS ZERO | ||
| 328 | RET | ||
| 329 | |||
| 330 | S3C: CMP AL,'0' | ||
| 331 | JB S3D | ||
| 332 | CMP AL,'9' | ||
| 333 | JA S7 | ||
| 334 | CALL GETPTR | ||
| 335 | SUB AL,'0' | ||
| 336 | XCHG AL,BYTE PTR [BX] | ||
| 337 | MOV AH,10 | ||
| 338 | MUL AH ;*10 | ||
| 339 | ADD BYTE PTR [BX],AL ;MOVE IN DIGIT | ||
| 340 | RET | ||
| 341 | |||
| 342 | S3D: | ||
| 343 | ;; CMP AL,'"' ;BEGIN QUOTED STRING | ||
| 344 | ;; JZ S3E | ||
| 345 | ;; CMP AL,"'" | ||
| 346 | JNZ S7 | ||
| 347 | ;;S3E: MOV WORD PTR [SI],OFFSET S4 | ||
| 348 | ;; MOV [INQ],AL | ||
| 349 | S3RET: RET | ||
| 350 | |||
| 351 | ; | ||
| 352 | ; ENTER QUOTED STRINGS | ||
| 353 | ; | ||
| 354 | |||
| 355 | ;;S4: CMP AL,[INQ] ;CHECK FOR STRING TERMINATOR | ||
| 356 | ;; JNZ S4A | ||
| 357 | ;; DEC PRMCNT ;TERMINATE STRING | ||
| 358 | ;; MOV WORD PTR [SI],OFFSET S3 | ||
| 359 | ;; RET | ||
| 360 | |||
| 361 | ;;S4A: CALL GETPTR | ||
| 362 | ;; MOV BYTE PTR [BX],AL | ||
| 363 | ;; MOV WORD PTR [SI],OFFSET S4 | ||
| 364 | ;; JMP S3A | ||
| 365 | ; | ||
| 366 | ; LOOK FOR ANSI COMMAND SPECIFIED IN AL | ||
| 367 | ; | ||
| 368 | |||
| 369 | S7: MOV BX,OFFSET CMDTABL-3 | ||
| 370 | ; | ||
| 371 | S7A: ADD BX,3 | ||
| 372 | CMP BYTE PTR [BX],0 | ||
| 373 | JZ S1B | ||
| 374 | CMP BYTE PTR [BX],AL | ||
| 375 | JNZ S7A | ||
| 376 | ; | ||
| 377 | S7B: MOV AX,WORD PTR [BX+1] ;AX = JUMP ADDRESS | ||
| 378 | MOV BX,OFFSET PARAM | ||
| 379 | MOV DL,BYTE PTR [BX] | ||
| 380 | XOR DH,DH ;DX = FIRST PARAMETER | ||
| 381 | MOV CX,DX | ||
| 382 | OR CX,CX | ||
| 383 | JNZ S7C | ||
| 384 | INC CX ; if DX=0, CX=1 else CX = DX | ||
| 385 | S7C: JMP AX ;AL = COMMAND | ||
| 386 | |||
| 387 | S1: CMP AL,1Bh ;ESCAPE SEQUENCE? | ||
| 388 | JNZ S1B | ||
| 389 | MOV WORD PTR [SI],OFFSET S2 | ||
| 390 | RET | ||
| 391 | |||
| 392 | S1B: CALL CHROUT | ||
| 393 | S1A: MOV WORD PTR [STATE],OFFSET S1 | ||
| 394 | RET | ||
| 395 | |||
| 396 | MOVCUR: CMP BYTE PTR [BX],AH | ||
| 397 | JZ SETCUR | ||
| 398 | ADD BYTE PTR [BX],AL | ||
| 399 | LOOP MOVCUR | ||
| 400 | SETCUR: MOV DX,WORD PTR COL | ||
| 401 | XOR BX,BX | ||
| 402 | MOV AH,2 | ||
| 403 | int 10h ; call ROM | ||
| 404 | JMP S1A | ||
| 405 | |||
| 406 | HVP: | ||
| 407 | CUP: | ||
| 408 | IF LINE25 | ||
| 409 | CMP CL,(maxrow+1) | ||
| 410 | jb cup3 ; new row is 24 or less | ||
| 411 | JA SETCUR ; error - 26 or greater | ||
| 412 | cmp EnaL25,0 ; else 25, is it allowed? | ||
| 413 | jz SETCUR | ||
| 414 | cup3: | ||
| 415 | ELSE | ||
| 416 | CMP CL,maxrow | ||
| 417 | JA SETCUR | ||
| 418 | ENDIF | ||
| 419 | MOV AL,MAXCOL | ||
| 420 | MOV CH,BYTE PTR [BX+1] | ||
| 421 | OR CH,CH | ||
| 422 | JZ CUP1 | ||
| 423 | DEC CH | ||
| 424 | CUP1: CMP AL,CH | ||
| 425 | JA CUP2 | ||
| 426 | MOV CH,AL | ||
| 427 | CUP2: XCHG CL,CH | ||
| 428 | DEC CH | ||
| 429 | MOV WORD PTR COL,CX | ||
| 430 | JMP SETCUR | ||
| 431 | |||
| 432 | CUF: MOV AH,MAXCOL | ||
| 433 | MOV AL,1 | ||
| 434 | CUF1: MOV BX,OFFSET COL | ||
| 435 | JMP MOVCUR | ||
| 436 | |||
| 437 | CUB: MOV AX,00FFH | ||
| 438 | JMP CUF1 | ||
| 439 | |||
| 440 | CUU: MOV AX,00FFH | ||
| 441 | CUU1: MOV BX,OFFSET ROW | ||
| 442 | JMP MOVCUR | ||
| 443 | |||
| 444 | CUD: MOV AX,(maxrow-1)*256+1 | ||
| 445 | IF LINE25 | ||
| 446 | cmp ah,[row] ; at bottom of screen? | ||
| 447 | ja SETCUR | ||
| 448 | ENDIF | ||
| 449 | JMP CUU1 | ||
| 450 | |||
| 451 | SCP: MOV AX,WORD PTR COL | ||
| 452 | MOV SAVCR,AX | ||
| 453 | JMP SETCUR | ||
| 454 | |||
| 455 | RCP: MOV AX,SAVCR | ||
| 456 | IF LINE25 | ||
| 457 | cmp ch,maxrow | ||
| 458 | jb rcp1 | ||
| 459 | cmp EnaL25,0 | ||
| 460 | jz rcp2 | ||
| 461 | ENDIF | ||
| 462 | rcp1: MOV WORD PTR COL,AX | ||
| 463 | rcp2: JMP SETCUR | ||
| 464 | |||
| 465 | SGR: XOR CX,CX | ||
| 466 | XCHG CL,PRMCNT | ||
| 467 | CALL GETPTR | ||
| 468 | INC CX | ||
| 469 | SGR1: MOV AL,BYTE PTR [BX] | ||
| 470 | PUSH BX | ||
| 471 | MOV BX,OFFSET GRMODE | ||
| 472 | SGR2: MOV AH,BYTE PTR [BX] | ||
| 473 | ADD BX,3 | ||
| 474 | CMP AH,0FFH | ||
| 475 | JZ SGR3 | ||
| 476 | CMP AH,AL | ||
| 477 | JNZ SGR2 | ||
| 478 | MOV AX,WORD PTR [BX-2] | ||
| 479 | AND ATTR,AL | ||
| 480 | OR ATTR,AH | ||
| 481 | SGR3: POP BX | ||
| 482 | INC BX | ||
| 483 | LOOP SGR1 | ||
| 484 | JMP SETCUR | ||
| 485 | |||
| 486 | ED: | ||
| 487 | IF LINE25 | ||
| 488 | cmp row,maxrow ; on 25th line? | ||
| 489 | je EL ; yes, treat like Erase in Line | ||
| 490 | ENDIF | ||
| 491 | xor cx,cx | ||
| 492 | mov dl,maxcol | ||
| 493 | mov dh,(maxrow-1) | ||
| 494 | cmp param,1 ; which subcommand? | ||
| 495 | ja el2 ; all | ||
| 496 | jb ed1 | ||
| 497 | mov dh,row ; to beginning | ||
| 498 | dec dh | ||
| 499 | jle EL | ||
| 500 | jmp short ed2 | ||
| 501 | ed1: mov ch,row ; to end | ||
| 502 | inc ch | ||
| 503 | cmp ch,dh | ||
| 504 | jae EL | ||
| 505 | ed2: mov bh,attr | ||
| 506 | MOV AX,0600H | ||
| 507 | int 10h ; call ROM | ||
| 508 | |||
| 509 | EL: MOV CX,WORD PTR COL | ||
| 510 | MOV dx,cx | ||
| 511 | mov al,param | ||
| 512 | inc al ; 0,1,2 => 1,2,3 | ||
| 513 | test al,1 ; to end? | ||
| 514 | je el1 | ||
| 515 | mov dl,maxcol | ||
| 516 | el1: test al,2 ; to beginning? | ||
| 517 | je el2 | ||
| 518 | mov cl,0 | ||
| 519 | el2: mov bh,attr | ||
| 520 | mov ax,0600H | ||
| 521 | int 10h | ||
| 522 | S1A_j: jmp S1A | ||
| 523 | |||
| 524 | IL: mov ah,7 ; scroll down | ||
| 525 | jmp short dl1 | ||
| 526 | |||
| 527 | xDL: mov ah,6 ; scroll up | ||
| 528 | dl1: mov al,cl ; number of lines | ||
| 529 | mov ch,row | ||
| 530 | xor cl,cl | ||
| 531 | mov dh,(maxrow-1) | ||
| 532 | mov dl,maxcol | ||
| 533 | mov bh,attr | ||
| 534 | int 10h | ||
| 535 | jmp S1A_j | ||
| 536 | |||
| 537 | RM: XOR CL,CL | ||
| 538 | JMP SHORT SM1 | ||
| 539 | |||
| 540 | SM: MOV CL,1 | ||
| 541 | SM1: mov bl,SelChar ; get selection character | ||
| 542 | sub bl,'<' ; adjust | ||
| 543 | jb S1A_j ; less than '<' | ||
| 544 | cmp bl,4 | ||
| 545 | jae S1A_j ; greater than '?' | ||
| 546 | xor bh,bh | ||
| 547 | shl bx,1 | ||
| 548 | shl bx,1 | ||
| 549 | shl bx,1 | ||
| 550 | MOV AL,DL | ||
| 551 | CMP AL,7 | ||
| 552 | JA S1A_j | ||
| 553 | or bl,al | ||
| 554 | shl bx,1 | ||
| 555 | mov bx,SRMODE[bx] ; get function indicator | ||
| 556 | cmp bx,1 ; no or special function? | ||
| 557 | jb S1A_j | ||
| 558 | jz SM2 ; sets screen mode | ||
| 559 | MOV [bx],CL | ||
| 560 | JMP S1A_j | ||
| 561 | |||
| 562 | SM2: MOV AH,0 | ||
| 563 | int 10h ; call ROM | ||
| 564 | JMP S1A_j | ||
| 565 | |||
| 566 | ; GetPtr - get a pointer to the current parameter | ||
| 567 | GETPTR: MOV BX,PRMCNTW | ||
| 568 | CMP BX,NUMPARAM | ||
| 569 | JB GET1 | ||
| 570 | DEC PRMCNT | ||
| 571 | JMP GETPTR | ||
| 572 | GET1: ADD BX,OFFSET PARAM | ||
| 573 | RET | ||