; ; PLOTTER CONTROL SUBROUTINES FOR DA SYSTEM ; COPYRIGHT 1981 DASOFT DESIGN SYSTEMS, INC. ; THESE PROGRAMS ARE PROTECTED BY LICENSING AGREEMENTS ; AND CANNOT BE USED OR DUPLICATED WITHOUT WRITTEN PERMISSION FROM DASOFT ; numnuts.asm takeing out i/o byte stuff, as well as con stuff, ; rev 2.6 6/25/85 ; I have gotton this driver running by eliminating the machine ; specific port listening routine ' ready '. : ; 4/1/85 cwm ; ; 2.6 NOTES ; 2.6 requires the flags twoex and cirk, which are ORGed at 1bf0, at the ; end of the driver. This driver directly manipulates the IObtye, which ; is not implemented on all cpms, so watch out for that as well as other ; possible machine specific stuff like bell char, etc. The target machine ; of this driver was an osborne. ; ; THE ORIGINAL NUMONICS PLOTTER DRIVER USED HARDWARE I/O REFERENCES. THIS ; DRIVER PROGRAM, BASED ON THE APPROXIMATE STRUCTURE OF "PLOTNMNX.ASM" USES ; ONLY LEGAL CP/M I/O CONVENTIONS. IT WAS MODIFIED BY SYMMETRY (DRM) 2/14/84 ; ; THIS PROGRAM ECHOS PLOTTER DIRECTIVES ON THE CRT. THIS CAN BE ELIMINATED, IF ; DESIRED, BY DELETING THE "CRT" REFERENCES IN THE "MOVE" SECTION. ; ; ; ; ; ; ; ; ; ; ; ; DEFINITIONS VERS EQU 0032H REV EQU 0034H EDIT EQU 0064H BDOS EQU 0005H ; ADDRESS OF BDOS JUMP POINT CONIN EQU 0001H ; GET CHARACTER FROM CONSOLE CONOUT EQU 0002H ; SEND CHARACTER TO CONSOLE RDRIN EQU 0003H ; READ READER CONST EQU 0007H ; GET CONSOLE STATUS LSTOUT EQU 0002H ; SEND CHARACTER TO LIST PORT BEEP EQU 003FH ; BEL CHARACTER ; ***** REV 1.5 + SYMMETRY, 2/14/84 DRM ****** ORG 1800H ; JUMP TABLE ENTRY POINTS FOR EXTERNAL ENTRY ; PINIT AND CHGPPR, CHGPEN, MAY NEED TO BE CHAGED BY USER PINIT JMP INIT ; INITIALIZE OUTPUT PORT PHOME JMP HOME ; HOME THE PLOTTER TO 0,0 VECTOR JMP MOVE ; MOVE THE PEN CHGPPR JMP CHGPR ; CHANGE PAPER COMMAND CHGPEN JMP CHGPN ; CHANGE PEN COMMAND TBLAD DS 4 ; PLOTTER COORDINATE TABLE YASIGN DB 0 ; SIGN OF Y CORRECTION 0=+ YADJUST DB 0 ; MAGNITUDE OF Y CORRECTION XASIGN DB 0 ; SIGN OF CORRECTION 0=+ XADJUST DB 0 ; NUMBER OF GRIDS BEF0RE CORRECTION X SLOW DB 0 ; FLAG FOR DRAWING SLOW LINES FDELAY DW 0310H SDELAY DW 0500H SECND DB 20H PORT DB 05H PCTL DB 0BH CTLCODE DB 080H ; PLOTTER INITIALIZER INIT LXI D,INMSG ;TELL CRT CALL PSTRNG ; MVI C,7 ;ASK FOR STATUS BYTE ; CALL BDOS ; ANI 0F7H ; ORI 004H ;TURN READER DEVICE INTO LIST PHYSICAL ; MOV E,A ; MVI C,8 ; CALL BDOS ;UPDATE STATUS BYTE ;RESTART PLOTTER ; ;call ready ;CLEAR UART BUFFER CALL HOME ;WAIT FOR IDLE ; ;call ready LXI D,INITSEQ CALL SSTRNG ;SEND INITIALIZATION STRING TO PLOTTER CALL HOME ;E.T. ; ASK USER FOR PAPER SIZE LXI D,SIZMSG CALL PSTRNG CALL CRTCR ;DROP A LINE CALL CON ;'Y' FOR LARGE FORMAT, X AND Y AXIS SWAP LXI D,EMBOSY ;ASSUME SMALL (ROLLER = Y AXIS) CPI 'Y' JZ INLARG CPI 'y' JNZ INIT0 ;JUMP IF NOT LARGE PAPER ;GET LARGE PAPER LENGTH IN INCHES INLARG LXI D,PSIZE CALL PSTRNG ;REQUEST PAPER LENGTH MVI B,'Y' CALL SOUT ;SEND PAPER CHANGE PREFIX CALL CON MOV B,A ;MSN CALL SOUT CALL CON MOV B,A CALL SOUTCR ;LSN CALL HOME ;54XX HAS PECULIARITY ABOUT REPOSITIONING LXI D,EMBOSX ;ROLLER = X AXIS ;EMBOSS THE PAPER WITH A MAXIMUM LENGTH ROLL INIT0 CALL CRTCR MVI C,26D ; COMMANDS TO MOVE 1" EACH INIT1 PUSH B ; SAVE PASS COUNT PUSH D ; SAVE AXIS CALL SSTRNG MVI A,040H ADD C ;ASCII LETTERS MOV B,A CALL CRT ;LET USER KNOW ;call ready POP D ;GET AXIS POP B ;GET PASS DCR C JNZ INIT1 ;LOOP UNTIL 36 DONE JMP HOME ; ; HOME PLOTTER COMMAND ; FOR THE NUMONIX 54XX PLOTTER HOME IS ACCOMPLISHED BY SENDING 'H' HOME ;;call ready CALL CRTCR MVI B,'H' ; GET "H" CALL SOUTCR ; OUPUT IT/ CR ;;call ready LXI D,BORDERM ;OFFSET FOR SCHEMATIC BORDER CALL SSTRNG ;JMP READY ;WAIT UNTIL DARK ; ret ;WAIT UNTIL "R" RCVD READY CALL SCR ;ASK FOR 'R' RDY1 CALL SIN ; GET PLOTTER INPUT (WAIT IF NEED BE) CPI 'R' ; TEST RZ JMP RDY1 ; LOOP IF NOT 'R' ; PLOTTER OUTPUT SOUTCR CALL SOUT ;CHARACTER THEN CR TO PLOTTER SCR MVI B,0DH ;CR TO PLOTTER SOUT PUSH B PUSH D PUSH H MVI C,LSTOUT ; CHARACTER TO PLOTTER MOV E,B ; PASS 'B' DATA TO BIOS IN E CALL BDOS POP H POP D POP B RET ; PLOTTER INPUT SIN MVI C,RDRIN BINP CALL BDOS ;GET PLOTTER CHAR MOV A,C ANI 07FH ;MASK IT RET ; CONSOLE INPUT CON MVI C,CONIN JMP BINP ; CRT OUTPUT CRT PUSH PSW PUSH B PUSH D PUSH H MVI C,CONOUT MOV E,B CALL BDOS POP H POP D POP B POP PSW RET ; SEND CR LF TO CRT, PROTECT A,B,C,D,E REGS CRTCR PUSH D LXI D,CRLF CALL PSTRNG POP D RET ; MESSAGE TO CRT PSTRNG PUSH PSW PUSH B PST LDAX D CPI '$' JZ PST1 ;EXIT WHEN DONE MOV B,A CALL CRT INX D JMP PST PST1 POP B POP PSW RET ; STRING TO PLOTTER SSTRNG LDAX D CPI '$' RZ MOV B,A CALL SOUT INX D JMP SSTRNG ; CHANGE PAPER ; ALLOW USER TO SET UP PLOTTER CHGPR LXI D,PPRMSG ; PRINT MESSAGE CALL PSTRNG ; CALL PRINT ROUTINE ; RING BELLS AND WAIT MVI B,BEEP CALL CRT JMP CON ; WAIT FOR ANSWER, THEN DONE ; ********* CHANGE PEN ROUTINE ***************** ; THE PEN SIZE IS SENT IN THE ACCUMULATOR ON CALL, NO ; OTHER INPUTS, NO OUPUTS. CHGPN PUSH PSW ; SAVE PEN NUMBER Š LXI D,PNMSG1 ; PRINT MAIN MESSGE CALL PSTRNG POP PSW ; GET BACK PEN NUMBER LXI D,PNMSG2 ;ASSUME 0 CPI 0 JZ DB2 LXI D,PNMSG3 ;ASSUME 1 CPI 1 JZ DB2 LXI D,PNMSG4 ;ASSUME 2 CPI 2 JZ DB2 LXI D,PNMSG5 ;MUST BE 3 DB2 CALL PSTRNG ; PRINT PIN NUMBER MVI B,BEEP CALL CRT JMP CON ;WAIT FOR KEY PRESS ; ; ; ; ; ; ; ; ; PLOTTER MOTION CONTROL ; ; MOVE LDA cirk ; test for circle ana a ; jnz move1 ; in this set-up, circles are at one step always lda twoex ; test for 2x ana a cnz move1 ; if flag set call, then rets and falls thru ; to move1 a second time. if not then one move. MOVE1 ;FILTER OUT VECTOR 0,0 ;call ready LHLD TBLAD+2 ;GET Y VECTOR XCHG LHLD TBLAD ;GET X VECTOR MOV A,H ;X MSB ORA D ;MERGE W/ Y MSB ANI 0FH ;IGNORE MSB TOP 4 ORA L ;MERGE W/ X LSB ORA E ;MERGE W/ Y LSB RZ ;DON'T SEND 0,0 ;SEND PREFIX MVI B,'M' ;ASSUME A MOVE LDA TBLAD+1 ; GET X MSB ANI 020H ; TEST FOR MOVE OR DRAW, 0 = MOVE (PEN UP) JZ DORM ; GUESSED RIGHT, THEN JUMP MVI B,'D' ; WRONG, THEN CORRECT IT DORM CALL SOUT ; SEND 'D' OR 'M' CALL CRT ; ;SEND X VECTOR LHLD TBLAD ;GET X VECTOR CALL SIGNOUT ;IFF NEG SEND '-' CALL DEC ; CONVERT TO DECIMAL CALL OUT4 ; OUTPUT ASCII BUFFER ; ;SEND COMMA MVI B,',' CALL SOUT CALL CRT ; ;SEND Y VECTOR LHLD TBLAD+2 ;GET Y VECTOR CALL SIGNOUT ;SIGN CALL DEC ; CONVERT CALL OUT4 ; OUTPUT ; ;SEND CR,LF CALL SCR JMP CRTCR ; OVER AND OUT, CAPTAIN VECTOR! ; ; ;TEST FOR NEGATIVE SIGN (BIT 5 OF H = 1), SEND '-' IF SO SIGNOUT MVI B,'-' ; ASSUME MINUS MOV A,H ANI 10H ; TEST FOR SIGN, 1 = NEG RZ ;RET IFF POS CALL SOUT ; SEND '-' IF NEGATIVE JMP CRT ; ; 4 DIGIT BINARY TO DECIMAL CONVERSION ; 12 BITS PASSED (UNMASKED) IN HL ; 4 ASCII DIGIT EQUIVALENT IN ASCBUF ON RETURN ; DEC XCHG ;SAVE VECTOR LXI H,ASCBUF SHLD TCHAR ;INIT POINTER XCHG ;RESTORE VECTOR ; MOV A,H ANI 0FH ;MASK OFF ILLEGALS MOV H,A ; LXI D,1000D ; 4TH DIGIT VALUE CALL CONV LXI D,100D ;3RD CALL CONV LXI D,10D ;2ND CALL CONV LXI D,1D ;1ST, FALL THROUGH ; ; SUBTRACT DE FROM HL 0-9 TIMES, CONVERT TIMES TO ASCII ; STORE ASCII @ (TCHAR), INCRIMENT TCHAR, RETURN ; ENTER W/ BALANCE IN HL, CONSTANT IN DE, DESTROYS A, B CONV MVI B,030H-1 ;ASCII PASS CNTR WITH PRE-CORRECTION ; CONV1 MOV A,L SUB E ;SUB CONST FROM LSN OF BALANCE MOV L,A MOV A,H SBB D ;SUB CONST FROM MSN OF BALANCE MOV H,A ; INR B ;ASCII CODE ADVANCES JNC CONV1 ;LOOP UNTIL HL - DE GIVES UNDERFLOW ; DAD D ; CORRECT FOR UNDERFLOW XCHG ;BAL TO DE LHLD TCHAR MOV M,B ;ASCII TO BUF INX H ;ADV PNTR SHLD TCHAR XCHG ;BAL BACK TO HL RET ; ; SEND 4 CHARACTERS IN ASCBUF TO PLOTTER ; SUPPRESS 3 LEADING '0'S AS REQUIRED ; OUT4 LXI H,ASCBUF; START OF BUFFER MVI D,03H ; LEADING ZERO CNTR MVI E,04H ; CHAR CNTR OUT41 MOV A,M ; GET A CHAR CPI 30H ; "0" ? JNZ OUT42 ; NOT "0", THEN NOT LEADING '0', SO GO NORBAL ; INX H DCR E ;SPIN WHEELS ONCE DCR D ;ONLY 3 LEADING '0'S ALLOWED JNZ OUT41 ;FALL THROUGH IF 4TH ; OUT42 MOV B,M ; GET CHAR CALL SOUT ; TO PLOTTER CALL CRT ; TO CRT INX H DCR E JNZ OUT42 RET ;DONE ; ASCBUF DS 4 ; ASCII BUFFER TCHAR DS 2 ; CHAR PNTR ; ; MESSAGES PNMSG1 DB 0AH,0DH,'PLEASE CHANGE PEN THEN POUND ANY KEY' DB 0AH,0DH,' NEW PEN SIZE IS....$' PNMSG2 DB '000$' PNMSG3 DB '0$' PNMSG4 DB '1$' PNMSG5 DB '4$' INMSG DB 0DH,0AH,'NUMONICS 54XX PLOTTER BEING INITIALIZED$' EMBOSX DB 'M200,0',0DH,0AH,'$' EMBOSY DB 'M0,200',0DH,0AH,'$' BORDERM DB 'M040,000',0DH,0AH,'$' ;MOVE IN TO MAKE ROOM FOR BORDER PPRMSG DB 0DH,0AH,'PLEASE LOAD PLOTTER PAPER THEN HIT ANY KEY, OK?$' SIZMSG DB 0DH,0AH,'TYPE "Y" FOR LARGE FORMAT PAPER$' PSIZE DB 0DH,0AH,'ENTER 2 DIGIT PAPER LENGTH, (00 TO 36)$' INITSEQ DB 0DH,0AH ;INITIALIZATION SEQUENCE DB 'C',0DH,0AH ;RESET TO DEFAULTS DB 'I',0DH,0AH ;RELATIVE MODE DB 'Q0',0DH,0AH ;PLOTTING SPEED = 5 IPS DB 'R000',0DH,0AH ;DON'T ROTATE ASCII DB 'S050',0DH,0AH ;ASCII SIZE = 1/4" TALL db '$' CRLF DB 0DH,0AH,'$' org 1bf0h twoex db 00 ; new 2.6 flags cirk db 00 END