mirror of
https://github.com/erkyrath/infocom-zcode-terps.git
synced 2026-04-26 12:27:09 +00:00
256 lines
5.6 KiB
Plaintext
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
|