;************************************************************************* ; ;========= TWOEX, MOVE,MOVE1 41 DRIVER =========== 1-15-85 ===== CWM ===== ; .src ; ; 2.6 NOTES ; this driver differs from 2.5 in it's use of the flags twoex and cirk. ; these are not in 2.5,and are now vital to proper functioning. they are ; ORGed at 1bf0h at the end of the driver. ;---------------------------------------------------------------- ; 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 DMP-41. ; THE DMP-41 SHOULD BE IN MODE 1, *NOT* THE DUAL SERIAL PORT MODE. ; THE DASOFT SYSTEM WILL BE SENDING DATA TO THE PLOTTER AND TO ; THE CONSOLE DURING PLOT SEQUENCES. XON-XOFF HANDSHAKING IS USUALLY ; HANDLES THROUGH THE CP/M LIST DEVICE PROTOCOL. 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. ; DUE TO XON-XOFF PROTOCOL, NO DELAYS ARE NEEDED FOR ANY PROCESSOR. ; *********************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 DMP-41 ****** 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 DB 00 ; PLOTTER COORDINATE TABLE DB 00 DB 00 DB 00 YASIGN DB 00 ; SIGN OF Y CORRECTION 0=+ YADJUST DB 00 ; MAGNITUDE OF Y CORRECTION XASIGN DB 00 ; SIGN OF CORRECTION 0=+ XADJUST DB 00 ; NUMBER OF GRIDS BEFRE CORRECTION X SLOW DB 00 ; FLAG FOR DRAWING SLOW LINES ; ********************* PRINT STRING TO OUTFUNCT SUBROUTINE ***** ; THIS PRINTS A STRING POINTED TO BY THE DE REGISTER PAIR ; TO THE OUTFUNCTION DEVICE (LIST DEVICE). THE STRING MUST ; BE TERMINATED BY A $ DOLLAR SIGN. ALL REGISTERS SAVED. PLIST PUSH PSW PUSH B PUSH D PUSH H PLOOP LDAX D ; BRING IN CHARACTER CPI '$' JZ ENDPL ; END IF DOLLAR SIGN PUSH D MOV E,A MVI C,OUTFUNC ; OUTPUT CP/M FUNCTION CODE CALL BDOS POP D INX D JMP PLOOP ENDPL POP H POP D POP B POP PSW RET ; ****** HOME PLOTTER COMMAND ********************** HSTRNG DB ' ;:H $' HOME PUSH PSW PUSH B PUSH D PUSH H LXI D,HSTRNG CALL PLIST POP H POP D POP B POP PSW RET ; ********* 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 BEEP,BEEP,BEEP,BEEP DB CR,LF,'Please change plotter PAPER then hit any key$' CHGPR LXI D,PPRMSG ; PRINT MESSAGE CALL PSTRNG ; CALL PRINT ROUTINE CALL INCHNE ; WAIT FOR ANSWER RET ; FINISHED ; ********* CHANGE PEN ROUTINE ***************** ; ** THE DMP-41 CANNOT CHANGE IT`S OWN PEN CPNMSG DB BEEP,BEEP,BEEP,BEEP DB CR,LF,'Please change PENS then hit any key$' CHGPN LXI D,CPNMSG ; PRINT MESSAGE CALL PSTRNG ; CALL PRINT ROUTINE CALL INCHNE ; WAIT FOR ANSWER RET ; BEEP THE CONSOLE ; ********** PLOTTER CONTROL ROUTINES ***************** DEL DB 0 ; DELAY PARAMETER GOXY DB 0 PENNOW DB 0 LEAD0 DB 0 ; LEADING 0'S SUPPRESS SIGN DB 0 THOUS DB 0 HUNDS DB 0 TENS DB 0 ONES DB 0 STRING DB ';: R $' ; DATA IS STORED IN TBLAD AS XLOW, XHI, YLO , YHI ; WITH BIT 10 (H) AS SIGN, BIT 20(XH) PEN DOWN ; FIRST CHECK PEN UP, PEN DOWN 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 LDA TBLAD+1 ANI 20H ; CLEAR ALL BUT PEN BIT JZ PENGOUP ; PEN GOING DOWN? LDA PENNOW ; WHAT IS THE PEN NOW? ORA A JNZ NOPEN ; NO NEED TO SEND PEN COMMAND MVI E,'D' ; PEN DOWN CODE MVI C,OUTFUNC ; SEND TO LIST DEVICE CALL BDOS MVI A,1 STA PENNOW JMP NOPEN PENGOUP: ; PEN GOING UP? LDA PENNOW ; WHAT IS THE PEN NOW? ORA A JZ NOPEN MVI E,'U' MVI C,OUTFUNC CALL BDOS MVI A,0 STA PENNOW ; FIRST WE CHECK FOR A 0 LENGTH VECTOR, THERE ARE LOTS SOMETIMES NOPEN LDA TBLAD+1 ANI 0FH JNZ NONZERO ; IF ANY ENTRY NONZERO WE MAY CONTINUE LDA TBLAD+3 ANI 0FH JNZ NONZERO LDA TBLAD ORA A JNZ NONZERO LDA TBLAD+2 ORA A JNZ NONZERO RET ; PUT POINTER IN DE, VALUE IN HL NONZERO LXI D,STRING+6 ; X POSITION LHLD TBLAD CALL DCNVT LHLD TBLAD+2 ; GET Y VALUE CALL DCNVT MVI A,'$' STAX D ; STRING TERMINATOR LXI D,STRING CALL PLIST RET ; ************************** DCNVT ******************************** DCNVT PUSH D ; SAVE THE ADDRESS XRA A ; CLEAR OUT DATA STORAGE STA THOUS STA HUNDS STA TENS STA ONES STA LEAD0 MOV A,L ; START WITH LOWER ORDER BYTE ANI 01 JZ NOONE LDA ONES ADI 1 STA ONES NOONE MOV A,L ANI 02 JZ NOTWO LDA ONES ADI 2 STA ONES NOTWO MOV A,L ANI 04H JZ NOFOUR LDA ONES ADI 04H STA ONES NOFOUR MOV A,L ANI 08H JZ NOEIGHT LDA ONES ADI 08 STA ONES NOEIGHT MOV A,L ANI 10H JZ NO16 LDA TENS ADI 1 STA TENS LDA ONES ADI 6 STA ONES NO16 MOV A,L ANI 20H JZ NO32 LDA TENS ADI 3 STA TENS LDA ONES ADI 2 STA ONES NO32 MOV A,L ANI 40H JZ NO64 LDA TENS ADI 6 STA TENS LDA ONES ADI 4 STA ONES NO64 MOV A,L ANI 80H JZ NO128 LDA HUNDS ADI 1 STA HUNDS LDA TENS ADI 2 STA TENS LDA ONES ADI 8 STA ONES NO128 MOV A,H ; NOW THE UPPER BYTE ANI 01H JZ NO256 LDA HUNDS ADI 2 STA HUNDS LDA TENS ADI 5 STA TENS LDA ONES ADI 6 STA ONES NO256 MOV A,H ANI 02H JZ NO512 LDA HUNDS ADI 5 STA HUNDS LDA TENS ADI 1 STA TENS LDA ONES ADI 2 STA ONES NO512 MOV A,H ; THIS REALLY IS THE FASTEST WAY, ANI 04H JZ NO1024 LDA THOUS ADI 1 STA THOUS LDA TENS ADI 2 STA TENS LDA ONES ADI 4 STA ONES NO1024 MOV A,H ANI 08H JZ NO2048 LDA THOUS ADI 2 STA THOUS LDA TENS ADI 4 STA TENS LDA ONES ADI 8 STA ONES NO2048 MOV A,H ; FINALLY, THE SIGN BITS ANI 10H JZ POSITIVE MVI A,'-' STA SIGN JMP SETSTRNG POSITIVE: MVI A,'+' STA SIGN ; NOW CARRY THE ACCUMULATED TOTALS AND GET THE ASCII CHARS SETSTRNG: LDA ONES CALL CARRY ; A IS THE NUMBER IN QUESTION MOV A,C ; C IS THE ASCII REMAINDER STA ONES LDA TENS ; B IS THE TENS CARRY NUMBER ADD B CALL CARRY MOV A,C STA TENS LDA HUNDS ADD B CALL CARRY MOV A,C STA HUNDS LDA THOUS ADD B CALL CARRY MOV A,C ; C IS THE ASCII REMAINDER CHARACTER STA THOUS ; SAVE THE ASCII, NO CARRY SHOUDL BE POSS. POP D ; GET ADDRESS BACK LDA SIGN STAX D INX D LDA THOUS CPI '0' JZ NOTHOUS STAX D INX D STA LEAD0 ; FLAG NO LEADING ZEROS NOTHOUS LDA LEAD0 ORA A JNZ NOL0H ; NO LEAD 0 ON HS LDA HUNDS CPI '0' JZ NOHUNDS NOL0H LDA HUNDS STAX D INX D STA LEAD0 NOHUNDS LDA LEAD0 ORA A JNZ NOL0T LDA TENS CPI '0' JZ NOTENS NOL0T LDA TENS STAX D INX D NOTENS LDA ONES STAX D INX D MVI A,' ' STAX D INX D ; DONE WITH THIS PART RET ; 'A' IS NUMBER TO BE CHECKED (INPUT) ; 'B' IS THE NUMBER OF CARRIES NEEDED (OUTPUT) ; 'C' IS THE ASCII CHARACTER OF THE REMAINDER (OUTPUT) CARRY PUSH D MVI B,0 MVI D,9 MVI E,10 CKLP CMP D ; COMPARE A AND D JZ AOK JNC ABIG ; A IS LARGER AOK ADI '0' ; A < 10 ,MAKE ASCII MOV C,A ; READY FOR EXIT POP D RET ABIG SUB E INR B ; INDICATE A CARRY JMP CKLP ; ******* PLOTTER PORT INITIALIZE ROUTINE *************** ; FOR 8255, ALL OUTPUTS , CODE IS 80 H WELCOM DB LF,LF,LF,LF,LF,LF,CR,'DMP-41 PLOTTER DRIVER REV 2.6',LF,CR DB LF,LF,LF,CR,'$' INITMSG DB ';:;: ;: ;: ;: $' DB ' ' IMSG2 DB 'V4$' ; FIRST SET THE PORT NUMBERS IN INIT PUSH D LXI D,WELCOM CALL PSTRNG LXI D,INITMSG CALL PLIST LDA SLOW ORA A JZ NORMSPD ; NORMAL SPEED LXI D,IMSG2 ; HALF SPEED CALL PLIST NORMSPD POP D RET org 1bf0h twoex db 00 cirk db 00 ; new flags for 2.6 END