PAGE ,132 ; PROGRAM TO SET X,Y RESOLUTION IN SUMMASKETCH DRIVER ; BY PATRICK SWAYNE 31-JAN-90 ; COPYRIGHT 1990 BY PATRICK SWAYNE. ALL RIGHTS RESERVED. CODE SEGMENT ASSUME CS:CODE,DS:CODE,ES:CODE,SS:CODE ; DEFINE SOME MEMORY LOCATIONS ORG 1 PSPSEG LABEL WORD ;PROGRAM SEGMENT PREFIX SEGMENT ADDR. ORG 3 MCBSIZE LABEL WORD ;MEMORY CONTROL BLOCK SIZE ORG 2CH ENVSEG LABEL WORD ;ENVIRONMENT SEGMENT ORG 5DH FCBARG LABEL BYTE ;FCB ARGUMENT ORG 6DH FCBARG2 LABEL BYTE ;SECOND FCB ARGUMENT ORG 100H START: JMP START1 NOP NOP SIG DB 'ADISUM 1.0' ;DRIVER SIGNATURE XFACT DW 3420 ;X RESOLUTION FACTOR YFACT DW 4956 ;Y RESOLUTION FACTOR M9FLG DB 0 ;TABLET TYPE FLAG START1: MOV DX,OFFSET SIGNON MOV AH,9 INT 21H ;PRINT SIGN-ON CLD MOV AH,52H INT 21H ;GET MEMORY CONTROL BLOCK ADDR. MOV AX,ES:[BX-2] ;GET FIRST MCB SEGMENT MOV DS,AX ;POINT TO IT FNDLP: MOV AX,PSPSEG ;GET PSP SEGMENT MOV DX,CS CMP AX,DX ;IN THIS SEGMENT? JAE CHKFND ;IF SO, CHECK IF ADISUM FOUND MOV ES,AX ;ELSE, PSP SEGMENT TO ES MOV SI,OFFSET SIG MOV DI,SI PUSH DS ;SAVE MCB SEGMENT PUSH CS POP DS ;PUT DS HERE MOV CX,5 ;6 WORDS IN SIGNATURE REPZ CMPSW ;IS ADISUM HERE? JZ GOTCC ;WE FOUND ADISUM FNDNXT: POP DS ;RESTORE MCB SEGMENT MOV AX,MCBSIZE ;GET MCB SIZE INC AX ;CORRECT IT MOV BX,DS ADD AX,BX ;CALCULATE NEXT MCB SEGMENT MOV DS,AX ;POINT TO IT JMP FNDLP ;TRY AGAIN GOTCC: MOV FNDSEG,ES ;SAVE SEGMENT WHERE FOUND MOV BYTE PTR FNDFLG,1 ;MARK PROGRAM FOUND JMP FNDNXT CHKFND: PUSH CS POP DS ;FIX DS CMP BYTE PTR FNDFLG,1 ;WAS ADISUM FOUND? JZ GOTDRV ;YES MOV DX,OFFSET NODRV MOV AH,9 INT 21H ;ELSE, SAY "NO DRIVER" INT 20H GOTDRV: MOV SI,OFFSET FCBARG MOV AL,[SI] ;GET FIRST ARG CHARACTER CMP AL,'?' ;SHOW SETTINGS? JNZ CHKTYP ;NO SHOINF: MOV ES,FNDSEG MOV DX,OFFSET TABMSG MOV AH,9 INT 21H ;SAY "TABLET IS" MOV AL,ES:M9FLG ;GET TABLET TYPE MOV DX,OFFSET M12MSG ;ASSUME MM1201 OR AL,AL ;IS IT? JZ SHOTAB ;YES MOV DX,OFFSET M9MSG SHOTAB: INT 21H ;SHOW TABLET TYPE MOV DX,OFFSET XYMSG INT 21H ;SAY "XY RES IS" MOV BX,ES:XFACT ;GET X RESOLUTION CALL DECOUT ;SHOW IT MOV DX,OFFSET XYMSG1 MOV AH,9 INT 21H ;SHOW REST OF XY MSG MOV BX,ES:YFACT CALL DECOUT ;SHOW Y RESOLUTION MOV DX,OFFSET PCRLF MOV AH,9 INT 21H ;PRINT CR, LF INT 20H ;AND EXIT CHKTYP: CMP AL,'M' ;SET TABLET TYPE? JNZ CHKNUM ;NO, CHECK FOR NUMBER MOV AL,1[SI] ;ELSE, GET TYPE XOR DL,DL ;ASSUME 1201 MOV CX,3420 ;GET 1201 DEFAULT RESOLUTION MOV BX,4956 CMP AL,'1' ;IS IT JZ SETTYP ;YES INC DL ;ASSUME 961 MOV CX,2655 ;GET DEFAULT 961 RESOLUTION MOV BX,2562 CMP AL,'9' ;961? JNZ BADVAL ;BAD ENTRY SETTYP: MOV ES,FNDSEG MOV ES:M9FLG,DL ;SET TABLET TYPE MOV DX,OFFSET TYPMSG JMP SETRES CHKNUM: CALL GETNUM ;READ X VALUE MOV CX,BX ;SAVE VALUE TO CX MOV SI,OFFSET FCBARG2 CALL GETNUM ;READ Y VALUE CMP BX,100 ;CHECK RANGE OF NUMBERS JB BADVAL CMP CX,100 JB BADVAL CMP BX,6000 JA BADVAL CMP CX,6000 JBE GOTVAL BADVAL: MOV DX,OFFSET HLPMSG MOV AH,9 INT 21H ;ON BAD ENTRY, PRINT HELP MSG INT 20H GOTVAL: MOV ES,FNDSEG ;GET SEGMENT WHERE FOUND MOV DX,OFFSET DNMSG SETRES: MOV ES:XFACT,CX ;INSERT X FACTOR MOV ES:YFACT,BX ;AND Y FACTOR MOV AH,9 INT 21H ;SAY "NEW VALUES SET" JMP SHOINF ;SHOW INFORMATION SET ; CONVERT A NUMBER INPUT BY THE USER FROM ; ASCII TO BINARY. SI POINTS TO NUMBER. GETNUM: XOR BX,BX ;CLEAR AN ACCUMULATOR GETNLP: LODSB ;GET A CHARACTER SUB AL,'0' ;REMOVE ASCII JC GOTNUM ;BAD CHAR, END OF ENTRY CMP AL,10 ;MORE THAN 9? JNB GOTNUM ;IF SO, END OF ENTRY CBW ;ELSE, AX = DIGIT XCHG AX,BX ;SWAP DIGIT AND NUMBER ACCUMULATOR MOV DX,10 MUL DX ;MULTIPLY NUMBER BY 10 ADD BX,AX ;ADD TO LAST DIGIT JMP GETNLP ;LOOP UNTIL DONE GOTNUM: RET ; DECOUT - PRINT BX IN DECIMAL ; THIS IS A TRICKY ROUTINE THAT MAKES USE OF THE ; STACK TO STORE DECODED DIGITS. DECOUT: PUSH CX PUSH DX PUSH BX ;SAVE REGISTERS MOV CX,10 ;RADIX FOR CONVERSION MOV DX,0 MOV AX,BX DIV CX ;DIVIDE BY 10 MOV BX,AX ;ANSWER TO BX (DX [REMAINDER] = DIGIT) CMP BX,0 ;DONE? JZ DEC1 CALL DECOUT ;CALL RECURSIVELY UNTIL DONE DEC1: ADD DL,'0' ;ADD ASCII BIAS TO DIGIT CHARACTER MOV AH,2 INT 21H ;PRINT IT POP BX ;RESTORE REGISTERS POP DX POP CX RET FNDSEG DW 0 ;SEGMENT WHERE FOUND FNDFLG DB 0 ;PROGRAM FOUND FLAG SIGNON DB 13,10,'ADI SummaSketch Driver Control Utility, v. 1.0' DB 13,10,10,'$' NODRV DB 'ADISUM is not installed.',13,10,'$' HLPMSG DB 'To use this program, enter',13,10,10 DB ' SETSUM ? To show current type and resolution.',13,10 DB ' SETSUM M9 To set up for use with MM961',13,10 DB ' SETSUM M12 To set up for use with MM1201',13,10 DB ' SETSUM X,Y To set new X,Y resolution',13,10,10 DB 'where X is the new X resolution value, and Y is',13,10 DB 'the Y new resolution value. X and Y must be',13,10 DB 'decimal numbers in the range 100 to 6000.',13,10,'$' DNMSG DB 'New resolution set.',13,10,'$' TYPMSG DB 'New tablet type set.',13,10,'$' TABMSG DB 'The current tablet type is $' M12MSG DB 'MM1201.$' M9MSG DB 'MM961.$' XYMSG DB 13,10,'The X,Y resolution is X=$' XYMSG1 DB ', Y=$' PCRLF DB '.',13,10,'$' CODE ENDS END START