.Z80 TITLE DASOFT V2.4d ---> WATANABE WX4731 PLOTTER DRIVER ; ; ZILOG MNEMONICS, MICROSOFT M80 ASSEMBLER ; ; REV 24D BY THE UNKNOWN USER ; REV 2.6 BY CWM 4/1/85 ; NOTE============NOTE ; new flags twoex and cirk for 26 must be orged (.phased) at 1bf0 ; BDOS EQU 5 LOUT EQU 5 SOUT EQU 9 CONIN EQU 1 CR EQU 0DH LF EQU 0AH .PHASE 1800H @INIT: JP INIT JP HOME JP MOVE JP CHGPAPER JP CHGPEN TBLAD: DB 00 ; X LO db 00 ; pen flag, x sign, x hi db 00 ; y lo db 00 ; y sign, y hi yasign db 00 ; sign of y correction, 0=+ yadjust db 00 ; # of steps before correction step xsign db 00 ; x sign xadjust db 00 SLOW: ; IGNORED IN THIS VERSION DB 0 ; ; SET PLOTTER TO A3 MODE, SCALE X-Y DATA BY 1250/1000, HOME PEN ; INIT: CALL SAVE LD A,0C9H ; DISABLE INIT FUNCTION LD (@INIT),A LD HL,SETUP CALL SENDIT EXIT: POP AF POP BC POP DE POP HL RET ; ; HOME PEN (MOVE ABSOLUTE TO 0,0) ; HOME: CALL SAVE LD HL,HOMEMSG CALL SENDIT JR EXIT ; ; MOVE OR DRAW DEPENDING ON BIT 5 IN TBLAD (0 = MOVE, 1 = DRAW) ; TO RELATIVE (!!!) CO-ORDINATE IN TBLAD,TBLAD+2 ; 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 CALL SAVE LD A,(TBLAD+1) ; MOVE OR DRAW ? BIT 5,A JR NZ,DRAW LD E,'O' ; RELATIVE MOVE COMMAND LD C,LOUT CALL BDOS CALL SENDXY JR EXIT DRAW: LD E,'E' ; RELATIVE DRAW COMMAND LD C,LOUT CALL BDOS CALL SENDXY JR EXIT ; ; EJECT PAPER BY AMOUNT EQUAL TO AN A3 SIZE SHEET ; CHGPAPER: CALL SAVE LD HL,NEWP1 CALL SENDIT LD A,20 ; WAIT 20 SECONDS, ELSE RE-INITIALIZATION @CHGPPR: ; REQUIRED TO CHANGE ORIGIN WILL ABORT FEED CALL ONESEC ; OPERATION. THIS IS A BUG IN THE WX4731 DEC A ; FIRMWARE, IN MY OPINION. JR NZ,@CHGPPR LD HL,NEWP2 CALL SENDIT JP EXIT ; ; ASK FOR PEN CHANGE. THIS COULD USE PEN CHANGE FEATURE OF PLOTTER ; BUT IS REALLY OF NO USE AT ALL UNLESS WE FIGURE OUT HOW TO DO ; MYLAR WITH DRAFTING POINTS IN THIS PLOTTER. ; CHGPEN: CALL SAVE LD DE,PENMSG ; DISPLAY MESSAGE LD C,SOUT CALL BDOS LD C,CONIN ; WAIT FOR ANY KEY PRESSED CALL BDOS JP EXIT ; ; SAVE ALL REGISTERS ON STACK ; SAVE: EX (SP),HL PUSH DE PUSH BC PUSH AF JP (HL) ; ; SEND STRING AT (HL) TERMINATED BY NULL TO LIST PORT ; SENDIT: LD A,(HL) LD (LASTC),A ; SAVE BYTE INC HL OR A RET Z PUSH HL LD E,A LD C,LOUT CALL BDOS POP HL LD A,(LASTC) ; WAS LAST BYTE A CLEAR COMMAND ? CP ';' JR NZ,SENDIT PUSH BC ; YES. WAIT AWHILE LD BC,0 .SEND1: DEC BC LD A,B OR C JR NZ,.SEND1 POP BC JR SENDIT ; OK. NOW GO ON. ; ; SEND "X,Y," WHERE X AND Y ARE DECIMAL REPRESENTATIONS OF VALUES ; IN TBLAD AND TBLAD+2 ; SENDXY: LD HL,(TBLAD) ; GET X BIT 4,H CALL NZ,SENDMINUS CALL SENDHL LD HL,(TBLAD+2) ; GET Y BIT 4,H CALL NZ,SENDMINUS CALL SENDHL RET SENDMINUS: PUSH HL LD E,'-' LD C,LOUT CALL BDOS POP HL RET ; ; CONVERT HL TO DECIMAL ASCII AND SEND TO LIST PORT. ; LARGEST POSSIBLE INPUT VALUE IS 4095. LEADING ZEROES ARE OK. ; SENDHL: LD A,H ; SUPPRESS MOVE/DRAW AND SIGN BITS AND 0FH LD H,A LD DE,1000 ; 1000'S CALL DIV PUSH HL LD C,LOUT CALL BDOS POP HL LD DE,100 ; 100'S CALL DIV PUSH HL LD C,LOUT CALL BDOS POP HL LD DE,10 ; 10'S CALL DIV PUSH HL LD C,LOUT CALL BDOS POP HL LD A,L ; 1'S ADD A,'0' LD E,A LD C,LOUT CALL BDOS LD E,',' ; PARAMETER SEPARATOR LD C,LOUT CALL BDOS RET ; ; DIVIDE HL BY DE. RETURN INTEGER RESULT CONVERTED TO ASCII ; IN E REGISTER, REMAINDER IN HL. ; DIV: LD A,'0' OR A DIVLOOP: SBC HL,DE JP M,DIVDONE INC A JR DIVLOOP DIVDONE: ADD HL,DE LD E,A RET ; ; DELAY ABOUT 1 SECOND ; ONESEC: PUSH BC PUSH AF LD BC,1000 @ONESEC: CALL ONEMS DEC BC LD A,B OR C JR NZ,@ONESEC POP AF POP BC RET ; ; DELAY ABOUT 1 MILLISECOND ; ONEMS: PUSH BC LD B,0 DJNZ $ LD B,77 DJNZ $ POP BC RET SETUP: DB 11H,';\0,2870,Z3810,0,M0,0,&1250,1250,1000,',0 HOMEMSG: DB 'M0,0,',0 NEWP1: DB 'M0,0,F0,F0,',0 NEWP2: DB ';\0,2870,Z3810,0,M0,0,&1250,1250,1000,',0 PENMSG: DB CR,LF,'*** CHANGE PEN ***$' .phase 1bf0 twoex db 00 ; new flags for 2.6 ***************** cirk db 00 LASTC: DS 1 END