Files
erkyrath.infocom-zcode-terps/ibm/scrnops.ezp
Andrew Plotkin b642da811e Initial commit.
2023-11-16 18:19:54 -05:00

256 lines
5.6 KiB
Plaintext

SUBTTL SCRNOPS
PAGE
PUBLIC OPSPLT,OPSCRN
OPSCRN PROC
MOV SCRNFLG,AL ; (7) TOGGLE SCREEN CURRENTLY ON
TEST AL,AL ; (7) WHICH DO WE WANT
JZ SCRN0 ; (7) SELECT BOTTOM, SCROLLING WINDOW
MOV SCRHLD,1 ; (A0) NO SCRIPTING DURING SCREEN 1
CALL SAVECUR
SCRN1: MOV BX,OFFSET WINDOW1 ; (7) HOME THE CURSOR
TEST COLFLG,1 ; (7) SHOULD WE SET THE COLOR
JZ SCRN2 ; (7) NOPE
MOV BX,OFFSET COLWIN1 ; (7) CLEAR SCREEN WITH COLOR
SCRN2: CALL MSPRT ; (7) WITH ANSI LOCATE
RET
SCRN0: MOV SCRHLD,0 ; (A1) REENABLE SCRIPTING
CALL RESTCUR ; (7) RESTORE THE CURSOR POSITION
MOV BX,OFFSET WINDOW0
TEST COLFLG,1 ; (7) SHOULD WE CHANGE THE COLOR
JZ SCRN3 ; (7) NOPE...
MOV BX,OFFSET COLWIN0
SCRN3: CALL MSPRT ; (7) RESTORE COLOR
RET
OPSCRN ENDP
OPSPLT PROC
XOR AH,AH
CMP AL,0
JNZ SPL1 ; (7) YES, FIGURE WINDOW SIZE
CALL RESTCUR
MOV SPLTFLG,0 ; (7) TURN OFF SPLIT SCREEN
MOV AX,TOPSCR ; (A0) TOPSCR NOW A VAR
MOV TOPLIN,AX ; (7) RESTORE TOPLIN TO WHOLE SCR
MOV MORLIN,0 ; (7) RESET THE MORE LINE COUNT
RET
SPL1: MOV SPLTFLG,1 ; (7) TURN ON SPLIT SCREEN
CMP AL,SLPP ; (7) ARE THERE THIS MANY LINES
JLE SPL2
MOV AL,SLPP ; (7) USE NO MORE THAN THE SCREEN
DEC AL ; (7) LEAVE A SCROLL LINE
SPL2: XCHG AH,AL ; (7) GET #LINES IN TOP HALF
; ADD TOPLIN,AX ; (7) THIS FIXES WINDOW 0 SCROLL SIZE
MOV TOPLIN,AX ; (B0) splits without unsplits lost (ehb)
; (B0 ehb) split should not clear the screen (has NO visible effect)
; PUSH AX ; (K7) FIX CLEAR ON SPLIT SCREEN
; CALL SAVECUR ; (7) SAVE THE CURSOR POSITION
; MOV BH,SCRATR ; (7) GET ATTRIBUTE INTO BH FOR CLS
; TEST COLFLG,1 ; (7) COLOR BLANK OR VANILLA BLANK
; JZ SPL3 ; (7) VANILLA...
; MOV BH,SPLCOL ; (7) USE THE GREEN CLEAR
;SPL3: POP AX ; (K7) RESTORE AX
; MOV DH,AH ; (7) BLANK WINDOW #1
; DEC DH ; (A2) WE HAVE ONE TOO MANY LINES TO CLEAR
; MOV AH,SCROLLUP ; (7) BLANK THE WINDOW
; MOV AL,0 ; (7) ZERO MEANS ENTIRE WINDOW
; MOV CX,TOPSCR ; (7) FROM UPPER LEFT
; MOV DL,SCPL ; (7) TO LOWER RIGHT
; DEC DL ; (7v) COORDINATES ARE ZERO BASED
; INT 10H ; (7) CALL VIDEO BIOS ROUTINE TO CLS
; CALL RESTCUR ; (7) RESTORE CURSOR POSITION
RET
OPSPLT ENDP
PUBLIC SAVECUR
SAVECUR PROC
TEST CURSAV,1 ; (A0) HAS THIS JUST BEEN DONE?
JZ SC1
RET
SC1: MOV BX,OFFSET SCP ; (7) ANSI SAVE CURSOR
CALL MSPRT
MOV CURSAV,1 ; (A0) CURSOR POSITION IS SAVED
RET
SAVECUR ENDP
PUBLIC RESTCUR
RESTCUR PROC
TEST CURSAV,1 ; (A0) IS THERE A POSITION SAVED?
JNZ RC1
RET
RC1: MOV BX,OFFSET RCP ; (7) ANSI RESTORE CURSOR
CALL MSPRT
MOV CURSAV,0 ; (A0) DON'T RESTORE UNTIL A SAVE
RET
RESTCUR ENDP
PUBLIC OPCLEAR
OPCLEAR PROC
CMP AL,-1 ; (A0) DO WE WANT TO UNSPLIT?
JNZ OCLR ; (A0) YES, UNSPLIT AND ERASE
MOV AL,0 ; (A0) CALL OPSPLIT INTERNALLY TO UNSPLIT
CALL OPSPLT ; (A0) THIS WILL RESET THE SCREEN
CALL CLRSCR ; (A0) USE BW/COLOR CLEAR
RET ; (B0) was falling through al from CLRSCR
OCLR: CMP AL,1 ; (A0) DO WE WANT TO CLEAR WINDOW 1
JNZ OCLR0 ; (A0) NO, CLEAR WINDOW 0
MOV DX,TOPLIN ; (A0) GET LAST LINE OF WINDOW 1
DEC DH ; (A0) THRU WINDOW 0
MOV DL,SCPL ; (A0) GET WIDTH
DEC DL ; (A0) ZERO BASED
MOV CX,0 ; (A0) SOMETHING IS CONSTANT
OCLR2: MOV AL,0 ; (A0) BLANK ENTIRE WINDOW
MOV AH,SCROLLUP ; (A0) TO SCROLL THESE
MOV BH,SCRATR ; (A0) USE BW
TEST COLFLG,1 ; (A0) OR COLOR?
JZ OCLR$ ; (A0) DONT CHANGE ATR
MOV BH,SPLCOL ; (A0) UGH, GREEN
OCLR$: INT 10H ; (A0) DO VIDEO
RET
OCLR0: CMP AL,0 ; (A0) SHOULD WE IGNORE?
JZ OCLR1 ; (A0) NO
RET
OCLR1: MOV CX,TOPLIN
MOV DX,184FH ; (A0) ANOTHER CONSTANT
JMP OCLR2
OPCLEAR ENDP
PUBLIC OPERASE
OPERASE PROC
CMP AL,1 ; (A0) DO WE WANT TO EREOL
JZ OPERA1
RET
OPERA1: MOV BX,OFFSET EREOL
CALL MSPRT
RET
OPERASE ENDP
; PRINTS AN ANSI STRING FOR CURPOS $[03;31H
PUBLIC OPCURST
OPCURST PROC
TEST BUFBIT,1 ; (A0) IS THIS OPERATION LEGAL
JNZ OPCUR1
TEST SCRNFLG,1 ; (A0) THIS SCREEN MUST BE ACTIVE
JZ OPCUR1
CALL ESCOUT ; (A0) SEND OUT ESC [
CALL NUMOUT
MOV DL,';' ; (A0) SEPARATE THE DIGITS BY ;
MOV AH,2
INT 21H
MOV AX,BX ; (A0) GET COLUMN
CALL NUMOUT
MOV DL,'H' ; (A0) H IS ANSI FOR CURPOS
MOV AH,2
INT 21H
OPCUR1: RET
OPCURST ENDP
PUBLIC ESCOUT,NUMOUT
ESCOUT PROC
PUSH AX
PUSH DX
MOV DL,27
MOV AH,2
INT 21H
MOV DL,'['
INT 21H
POP DX
POP AX
RET
ESCOUT ENDP
; PRINT NUMBER IN AX OUT AS DECIMAL
NUMOUT PROC
PUSH BX
XOR DX,DX ; (A0) ZERO THIS
MOV BX,10 ; (A0) GET A WORD DIVISOR
IDIV BX ; (A0) BREAK AX INTO AX,DX
ADD DL,'0' ; (A0) ASCIIFY NUMBERS
ADD AL,'0' ; (A0)
PUSH DX ; (A0) DL HAS CURPOS LOW
MOV DL,AL ; (A0) GET HIGH DIGIT
MOV AH,2
INT 21H
POP DX ; (A0) RESTORE CURPOS LOW
MOV AH,2 ; (A0) DL HAS NEXT DIGIT
INT 21H
POP BX
RET
NUMOUT ENDP
PUBLIC OPCURGT
OPCURGT PROC
RET
OPCURGT ENDP
PUBLIC OPHILIT
OPHILIT PROC
INC AX
JMP PUTCHR
OPHILIT ENDP
CLRSCR PROC
MOV BX,OFFSET CLS
CMP COLFLG,1 ; (7t) TURN ON COLOR WITH CLEAR SCREEN
JNZ CLR0
MOV BX,OFFSET CLSC ; (7t) TURN POINT TO COLOR ANSI CODE
CLR0: CALL MSPRT
RET
CLRSCR ENDP
SUBTTL SOUND SUBROUTINES
PAGE
;
; ****** IMPLEMENTATION NOTE *****
;
; INITSND MUST BE CALLED DURING COLDSTART
;
;
; -------
; OPSOUND
; -------
; PLAY SOUND FX [ARG1] (1-255)
PUBLIC OPSND
OPSND PROC
OR AX,AX
JZ SNDERR ;(A0) 0 IS IGNORED
CMP AX,NSNDS + 1
JAE SNDERR ;(A0) SOUND NOT DEFINED
DEC AX ;(A0) ZERO ALIGN
SHL AX,1 ;(A0) MAKE IT A WORD OFFSET
MOV BP,AX ;(A0) GET THE SOUNDLIST POINTER
MOV SI,DS:[BP+STABLE]
CALL SI ;(A0) CALL THE SOUND ROUTINE
SNDERR: RET
OPSND ENDP
; --------------------
; ACTUAL SOUND EFFECTS
; --------------------
;
; BEEP (DIT)
;
SND1 PROC
MOV CX,1200 ;(A0) FREQUENCY
MOV DX,1 ;(A0) DURATION
JMP TONE
SND1 ENDP
;
; BOOP (DAH)
;
SND2 PROC
MOV CX,600 ;(A0) FREQUENCY
MOV DX,5 ;(A0) DURATION
JMP TONE
SND2 ENDP