.8080 ; ******************************************** ; PLOTTER CONTROL SUBROUTINES FOR MAGIC 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. ; *************** FOR YOUR INFORMATION ********************* ; THIS DRIVER USES THE CP/M LIST DEVICE TO SEND THE DATA VIA ; THE RS-232 LINK TO THE HP7221C. DELAYS HEREIN ARE SET FOR ; 1200 BAUD OUTPUT. IF YOU ARE GOING TO USE A DIFFERENT BAUD ; RATE, CONSULT THE TABLE BELOW AND CHANGE THE DELAY EQUATE ; FOR 9600 BAUD, XDEL2 = 52 ; 4800 26 ; 2400 13 ; 1200 7 ; 600 3 ETCETERA XDEL2 EQU 255 ;I LIKE TO BE SURE OUTFUNC EQU 5 ;SEND TO CPM LIST DEVICE ; ABOVE IS THE EQUATE TO SEND THE DATA TO THE CP/M LIST DEVICE, ; FUNCTION NUMBER 5. IF YOU WOULD LIKE IT SENT TO THE PUNCH ; DEVICE, ETCETERA, YOU MAY CHANGE THIS EQUATE. IF USING ANOTHER ; OUTPUT TECHNIQUE, YOU WILL NEED TO MODIFY THE PROGRAM SEGMENTS. ; BELOW, VARIABLES FDELAY AND SDELAY ARE SET UP FOR 4MHZ Z80 ; OPERATION. THESE NUMBERS ARE DELAY WEIGHTS FOR HOW LONG TO WAIT ; BETWEEN EACH CHARACTER SENT. AT LESS THAN 9600 BAUD OR WITH SLOWER ; PROCESSORS, YOU WILL NEED TO FIND NEW VALUES FOR THESE DELAYS ; *********************CAUTION CAUTION CAUTION************* ; DO NOT NOT NOT USE THE INSTALL PROGRAM ON THIS CONTROL ; ROUTINE, OR IMPORTANT VALUES WILL BE CHANGED FOR THE ; OTHER PLOTTER WE SUPPORT. YOU MAY USE THE TEST ROUTINE ; BY SKIPPING OVER THE INSTALLATION PART, BUT THIS SIMPLE ; DRIVER WILL NOT QUITE WRITE THE DASOFT LOGO CORRECTLY. ; SO DON'T WORRY ABOUT IT. ; SOME MAGIC DEFINED LOCATIONS USED: VERS EQU 0032H ; REV EQU 0034H ; EDIT EQU 0064H ; WBOOT EQU 0000H ; WARM BOOT ADDRESS TYPEF EQU 0002H ; BDOS PRINT COMMAND NUMBER BDOS EQU 0005H ; ADDRESS OF BDOS JUMP POINT BUFF EQU 0080H ; ADDRESS OF DISK INPUT BUFFER DMA EQU 001AH ; SET DMA ADDRESS FUNCT NUMB READF EQU 0014H ; DISK READ FUNCTION WRITEF EQU 0015H ; WRITE FILE TO DISK NUM OPENS EQU 000FH ; OPEN FILE FUNCT NUMBER CLOSES EQU 0010H ; CLOSE FILE FUNCT NUMBER FCB EQU 005CH ; FILE CONTROL BLOCK ADRS FCBDN EQU 005CH ; FCB DISK NAME FCBFN EQU 005DH ; FILE NAME FCBFT EQU 0065H ; FILE TYPE FCBEX EQU 0068H ; CURRENT EXTENT NUMBER FCBRC EQU 006BH ; EXTENT RECORD COUNT (0-128) FCBCR EQU 007CH ; CURRENT (NEXT) RECORD NUMBER FCBR0 EQU 007DH ; LSB OF 16 BIT RANDOM RECORD ADDRESS FCBR1 EQU 007EH ; MSB OF 16 BIT RANDOM RECORD ADDRESS FCBR2 EQU 007FH ; RECORD OVERFLOW FLAG TOPPTR EQU 0006H ; WAS (AD00H) STACK START 48K CLEAD EQU 0001H ; CURSOR POSITIONING STRING CODE P3LINES EQU 0003H ; PRINT THREE LINES CONTMSG EQU 000BH ; CONTINUE MESSAGE CODE CLS EQU 000CH ; CLEAR SCREEN CODE IVON EQU 000EH ; INVERSE ON CODE IVOFF EQU 000FH ; INVERSE OFF CODE CR EQU 000DH ; RETURN CHARACTER LF EQU 000AH ; LINE FEED CHARACTER BEEP EQU 0007H ; BEL CHARACTER TAB EQU 0009H ; TAB CHARACTER BS EQU 0008H ; BACK SPACE ESC EQU 001BH ; ESCAPE EOM EQU 00EEH ; END OF MESSAGE MARKER (OVERLAY FILE) EOF EQU 00FFH ; END OF FILE MARKER (OVERLAY FILE) MSCNT EQU 00F9H ; 1 MSEC SOFTWARE DELAY CONSTANT RDRL EQU 0103H ; LOADER KERNAL OR TEST PROG CLEARS EQU 0108H ; CLEAR SCREEN ROUTINE PSTRNG EQU 010EH ; PRINT AN ASCII STRING INCHNE EQU 011DH ; ROUTINE TO READ CONSOLE NO ECHO DUMP EQU 014DH ; BLOCK MOVE ROUTINE ; ***** REV 1.0 FOR HOUTSTON INSTRUMENTS HP7221C ****** .PHASE 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 BEFRE CORRECTION X SLOW: DB 0 ;FLAG FOR DRAWING SLOW LINES ; **********DELAYS FOR 2.5MHZ Z-80 1200 BAUD OPERATIONS **************** FDELAY: DW 0180H ;NORMAL 4MHZ DELAY FACTOR SDELAY: DW 0300H ;SUPER SLOW DRAW FACTOR SECND: DB 00H ;RAMP FACTOR PORT: DB 02H ;PORT NUMBER FOR OUTPUT PCTL: DB 0BH ;CONTROLL PORT NUMBER CTLCODE: DB 80H ;CONTROL CODE FOR 8255 ; ****** HOME PLOTTER COMMAND ********************** ; FOR THE MAURO ENGINEERING PROAC, HOME IS ACCOMPLISHED ; BY RUNNING THE PLOTTER INTO THE NEGATIVE STOPS. ; THATS RIGHT. THE PLOTTER USES 4 BYTES, X MAGNITUDE, ; XSIGN, Y MAGNITUDE, Y SIGN, SET TO NEGATIVE MAX X,Y ; DESTROYS A, NO ENTRY OR EXIT PARAMETERS .Z80 ; *************************************************** ; THIS IS A KREONITE ADAPTATION, INTERFACE TO HP7221C ; HOME IS THE DEFAULT LOWER LEFT OF THE HP PLOTTER. HOME LD A,70H ;P CALL UTXRDY OUT (90H),A ;90H IS THE DATA PORT LD A,60H ;' CALL UTXRDY OUT (90H),A LD A,7DH ;} CALL UTXRDY OUT (90H),A CALL DELAY2 RET .8080 ; ********* CHANGE PAPER ROUTINE ******************** ; SOME PLOTTERS CAN CHANGE THEIR OWN PAPER, WHICH IS WHY ; THERE IS A USER ROUTINE FOR THIS. FOR THE MAURO PROAC, ; IT IS UNDER 'MANUAL' CONTROL. THIS UTILITY SENDS 25 ; 'CONTROL-G' OR BELLS TO THE CONSOLE WITH A MESSAGE. PPRMSG: DB 0DH,0AH,'PLEASE CHANGE PLOTTER PAPER THEN HIT ANY KEY$' BELLS EQU '' CHGPR: LXI D,PPRMSG ;PRINT MESSAGE CALL PSTRNG ;CALL PRINT ROUTINE DOBELLS MVI E,BELLS MVI C,02 ;CPM PRINT CHARACTER FUNCTION CALL BDOS CALL INCHNE ;WAIT FOR ANSWER RET ;FINISHED ; ********* CHANGE PEN ROUTINE ***************** ; AGAIN, SOME PLOTTEERS CAN CHANGE THEIR OWN PEN ; **CONTACT DASOFT FOR MORE INFORMATION. PNMSG1: DB 0AH,0DH,'PLEASE CHANGE PEN THEN HIT ANY KEY' DB 0AH,0DH,' NEW PEN SIZE IS....$' PNMSG2: DB '000$' PNMSG3: DB '0$' PNMSG4: DB '1$' PNMSG5: DB '4$' ; 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 CPI 0 JZ PEN0 CPI 1 JZ PEN1 CPI 2 JZ PEN2 PEN3: LXI D,PNMSG5 DB2: CALL PSTRNG ;PRINT PIN NUMBER JMP DOBELLS PEN2: LXI D,PNMSG4 JMP DB2 ;PRINT NUMBER AND RING CHIMES PEN1: LXI D,PNMSG3 JMP DB2 PEN0: LXI D,PNMSG2 JMP DB2 ;THE END ; ********** PLOTTER CONTROL ROUTINES ***************** DEL: DB 0 ;DELAY PARAMETER GOXY: DB 0 PENNOW: DB 0 .Z80 ; THIS ROUTINE IS BASED ON THE ASSUMPTION THAT THE DASOFT SYSTEM ; USES ONLY 45 DEGREE ANGLES, AND AS SUCH MAKES IT MUCH EASIER ; DATA IS STORED IN TBLAD AS XLOW, XHI, YLO , YHI ; WITH BIT 10 (H) AS SIGN, BIT 20(XH) PEN DOWN MOVE: CALL ZCHK ;CHECK FOR ZERO VECTERS RET Z LD A,(TBLAD+1) ;CHECK PEN UP OR DOWN AND 20H LD A,72H ;R IS FOR PEN UP JR Z,PENCMD LD A,73H ;S IS FOR PEN DOWN. PENCMD CALL UTXRDY OUT (90H),A LD HL,(TBLAD) CALL SIGN CALL NBYTE ;DETERMINE # OF BYTES TO SEND OR A JP Z,ERR LD A,40H ;INDICATES X-AXIS LD (AXIS),A CALL THREE LD HL,(TBLAD+2) ;LOAD Y VALUE CALL SIGN CALL NBYTE OR A JP Z,ERR LD A,20H ;INDICATES Y-AXIS LD (AXIS),A CALL THREE LD A,7DH ;OUTPUT TERMINATOR CALL UTXRDY OUT (90H),A CALL DELAY2 RET ; THIS ROUTINE CHECK FOR ZERO VECTERS ; RETURN WITH ZERO SET WHEN VECTERS ARE ZERO ZCHK PUSH BC PUSH HL LD B,2 LD HL,TBLAD LDHL LD A,(HL) CP 0 JR NZ,RBACK INC HL LD A,(HL) LD C,A LD A,0FH AND C JR NZ,RBACK INC HL DJNZ LDHL AND B RBACK POP HL POP BC RET ; ********************************************************* ; THIS ROUTINE DETERMINES THE SIGN OF THE NUMBER. SIGN BIT 4,H ;BIT 4 IS THE SIGN BIT. LD A,0 ;SET SIGN FLAG JR Z,POS LD A,1 ;IT IS NEGATIVE POS LD (NEG),A LD A,0FH ;MASK OFF EXTRANUOUS BITS AND H LD H,A RET ; ************************************************************* ; HP MACHINE UNIT IS ABOUT ONE FIFTH OF 5 MIL ; SO WE NEED TO MULTIPLY THE VALUE BY 5 NBYTE PUSH HL POP DE ; ADD HL,DE ; ADD HL,HL ;4 TIMES ; ADD HL,DE LD (ERRMSG+2),HL LD (TEMP),HL LD DE,10H ;SEE NUMBER LESS THAN 16? CALL CHECK JP M,ONEBY LD DE,512 ;SEE NUMBER LESS THAN 512? CALL CHECK JP M,TWOBY LD DE,16384 ;SEE NUMBER LESS THAN 16384? CALL CHECK JP M,THRBY LD A,0 ;INDICATE ERROR NEND: LD (BNUM),A RET ONEBY LD A,1 JR NEND TWOBY LD A,2 JR NEND THRBY LD A,3 JR NEND CHECK LD HL,(TEMP) XOR A SBC HL,DE RET THREE LD A,(NEG) ;ARE WE DEALING WITH NEGATIVE OR A LD HL,(TEMP) ;LOAD THE NUMBER JR Z,POS3 ;NUMBER IS POSTIVE LD DE,0 EX DE,HL SBC HL,DE ;GET THE TWO'S COMPLIMENTS POS3 LD A,(BNUM) CP 1 JP M,ERR JR Z,ONE CP 2 JR Z,TWO LD A,H ;GET THE MSD SRL A SRL A ;SHIFT DOWN TWO CALL POSN1 TWO LD A,H LD B,L CALL SFAB CALL POSN1 ONE LD A,L CALL POSN1 RET ; ************************************************************** ; THIS IS USED TO SHIFT THE RIGHT BITS INTO POSITON SFAB RLC B RLA RLC B RLA RLC B RLA RET ; ***************************************************************** POSN1: ; THIS MASK OFF UNWANTED BITS ADD THE AXIS INFORMATION AND 1FH LD B,A LD A,(AXIS) OR B CALL UTXRDY OUT (90H),A RET .8080 ; *******DELAYS DELAY1 PUSH PSW PUSH H ; NOW CHECK WHETHER FAST OR SLOW, THEN GET THE VALUE FOR ; DELAY BETWEEN STEPS LDA SLOW ORA A JZ NOTSLOW LHLD SDELAY ;GET SLOW DELAY JMP DL1LP NOTSLOW LHLD FDELAY DL1LP DCX H MOV A,H ORA L JNZ DL1LP POP H POP PSW RET DELAY2 PUSH B PUSH PSW PUSH D MVI A,XDEL2 MOV B,A DELX2 MOV A,B ORA A ;CHECK FOR END OF LOOP JZ ENDDEL PUSH B MVI E,20H ;SPACE CHARACTER MVI C,OUTFUNC CALL DDLAY POP B DCR B JMP DELX2 ENDDEL POP D POP PSW POP B RET .Z80 ; ******* PLOTTER PORT INITIALIZE ROUTINE *************** ; THE SERIAL CONTROL PORT IS 91H DATA PORT 90H, DEVICE 8251A INIT LD A,0 ;RESET PORT OUT (91H),A LD A,18H ;CHANNEL RESET OUT (91H),A LD A,4 ;WRITE REGISTER 4 OUT (91H),A LD A,44H ;16 TIMES CLOCK OUT (91H),A LD A,5 ;WRITE REGISTER 5 OUT (91H),A LD A,68H ;ENABLE TRANSMIT OUT (91H),A LD HL,INIMSG ;POINTS TO INITIALZATION STRING LD B,5 SLOOP CALL UTXRDY ;CHECK FOR USART READY LD A,(HL) OUT (90H),A INC HL ;NEXT BYTE DJNZ SLOOP CALL DELAY2 RET INIMSG: DB 1BH,2EH,28H,76H,41H ;ESC . ( V A SELECT PEN 1 UTXRDY: PUSH AF LD A,0 ;NULL COMMAND OUT (91H),A IN A,(91H) ;CHECK TRANSMISSION READY BIT 2,A JR Z,UTXRDY+1 POP AF RET NEG: DEFS 1 AXIS: DEFS 1 TEMP: DEFS 2 BNUM: DEFS 1 ; *************************************************************** ; THIS IS THE ERROR HANDLING ROUTINE ERR LD DE,ERRMSG CALL PSTRNG JP DOBELLS ERRMSG DB 0AH,0DH,' OUT OF RANGE$' DDLAY PUSH BC LD B,1 LD C,20 LP1 DEC C JR NZ,LP1 DJNZ LP1 POP BC RET END END