home *** CD-ROM | disk | FTP | other *** search
- * PROCEDURE WAVE(VAR XVALUE,YVALUE:INT_ARRAY;VAR N:INTEGER;MAXN:INTEGER);
-
- * AN EXTERNAL ROUTINE TO FILL ARRAYS X AND Y FROM THE HIPAD,IN STREAM MODE.
- * POINT COLLECTING STARTS WHEN THE PEN GOES DOWN.(i.e.CONTROL BYTE = 0F4H)
- * A POINT IS REJECTED IF IT IS < 0.2mm TO THE RIGHT OF THE PRECEDING POINT.
- * THE PROCEDURE ENDS IF THE PEN COMES UP OR WHEN MAXN POINTS HAVE BEEN READ.
-
- VBYTES EQU 9 # OF BYTES ON STACK
- XVALUE EQU 16 OFFSETS TO (IX) FOR ADDRESS OF POINTERS
- YVALUE EQU 14 TO TRANSMITTED VARIABLES.
- N EQU 12
- MAXN EQU 9
-
- STAT_RDY EQU 0F7H STATUS PORT DATA AVAILABLE CODE
- STAT_PRT EQU 00AH ADDRESS OF STATUS PORT
- DATA_PRT EQU 008H " " DATA "
-
- NAME WAVE
- ENTRY WAVE
-
- PASS: MACRO ARG ; STORES THE 16BIT NO. IN DE
- ; IN A LOCATION WHOSE BASE
- ; ADDRESS IS CALCULATED FROM ARG.
- ; & WHOSE OFFSET = 2 x IY
- PUSH H ;
- PUSH B ; SAVE ALL REGISTERS USED
- PUSH Y ;
- MOV H,ARG(IX) ; GET BASE ADDRESS OF
- MOV L,ARG-1(IX) ; ARRAY => HL
- DADY Y ; OFFSET = 2 * Y
- PUSH Y
- POP B ; OFFSET --> BC
- DSBC B ; ADDRESS OF ARRAY[N] = HL-OFFSET
- XCHG ; ADDRESS => DE : ARG => HL
- MOV A,H ;
- STAX D ;
- DCX D ;
- MOV A,L ;
- STAX D ;
- POP Y
- POP B
- POP H
- ENDMAC
-
- WAVE:
- ENTR D,2,0
- JMP START
- OLD_X: DS 2
-
- START:
- PUSH Y : SAVE IY FOR PASCAL/Z
- MOV B,MAXN(IX) : GET VALUE OF
- MOV C,MAXN-1(IX) : MAXN => BC.
- LXI H,0
- DSBC B : MAXN = or > 1 ?
- JM START2 : IF YES THEN START
- PUSH B
- POP Y
- CALL PASS_N : MAXN --> N
- JMP WAVE_END : ELSE RETURN.
-
- START2:
- LXI Y,0 : COUNTER FOR POINTS READ.
- CALL W8_4_PEN : PEN DOWN YET?
- CALL FIRST_PR
- LOOP:
- JMP ANYMORE : DOES N := MAXN YET ?
- PROCEED:
- JMP PEN_UP_YET
- STILL_DOWN:
- JMP NEXT_PR
- WAVE_END:
- CALL PASS_N
- POP Y : RESTORE ORIGINAL Y FOR PASCAL/Z
- EXIT D,VBYTES
-
- * SUBROUTINES:
- * W8_4_PEN:READS DATA PORT UNTIL CONTROL BYTE = F4 : i.e. PEN IS DOWN.
-
- W8_4_PEN:
- CALL STAT_CHK ;WAIT TILL DATA AVAILABLE
- IN DATA_PRT ;GET IT
- CPI 0F4H ;PEN DOWN ?
- JNZ W8_4_PEN ;NO : KEEP WAITING.
- RET ;YES!
-
- FIRST_PR:
- CALL X_IN ;DISCARD THE FIRST
- CALL Y_IN ;POINT AS IT CAN
- CALL W8_4_PEN ;BE GARBAGE.
- CALL X_IN ;GET X[1]
- MOV B,XVALUE(IX) ;
- MOV C,XVALUE-1(IX)
- MOV A,D
- STA OLD_X ;SAVE IT TO COMPARE WITH NEXT X
- STAX B ;& ALSO SEND IT TO PASCAL/Z LAND.
- DCX B
- MOV A,E
- STA OLD_X+1
- STAX B
- CALL Y_IN ;GET Y[1]
- CALL PASS_Y ;& SEND IT TO PASCAL/Z LAND.
- INX Y ;INCREMENT COUNTER
- RET
-
- * ANYMORE CHECKS WHETHER N HAS REACHED MAXN i.e. is array filled
- ANYMORE:
- PUSH H
- MOV H,MAXN(IX)
- MOV L,MAXN-1(IX)
- PUSH D
- PUSH Y ;GET COUNT FROM Y
- POP D ;TO DE + COMPARE
- DSBC D ;TO MAXN.
- POP D
- POP H
- JZ WAVE_END
- JMP PROCEED
-
- * PEN_UP_YET:READS DATA PORT,LOOKING FOR CONTROL BYTE = F3
- PEN_UP_YET:
- CALL STAT_CHK ;WAIT FOR DATA
- IN DATA_PRT ;GET A BYTE
- CPI 0F4H ;CONTROL BYTE = F4?(PEN STILL DOWN)
- JZ STILL_DOWN
- JMP WAVE_END ;EXIT IF PEN NOT DOWN
-
- NEXT_PR:
- CALL X_IN : GET NEW X => DE
- PUSH D : & SAVE IT
- LXI H,OLD_X
- MOV B,M
- INX H
- MOV C,M : GET OLD_X => BC
- XCHG : MOVE NEW X => HL
- INX B
- INX B : ADD 2 TO OLDX
- DSBC B : NEW_X = or > (OLD_X + 2) ?
- JM TOO_CLOSE : IF NOT : DON`T WANT IT
- POP D : IF SO : RESTORE NEW X
- MOV A,D
- STA OLD_X : SAVE IT TO COMPARE WITH NEXT X
- MOV A,E
- STA OLD_X+1
- CALL PASS_X : & SEND X & Y
- CALL Y_IN : TO PASCAL/Z
- CALL PASS_Y : LAND
- INX Y : N := N + 1
- JMP LOOP
- TOO_CLOSE:
- POP D : RESTORE STACK
- CALL Y_IN : CLEAR PORT
- JMP LOOP
-
- * STAT_CHK :CHECKS STATUS PORT
- STAT_CHK:
- IN STAT_PRT ;DATA IN?
- CPI STAT_RDY
- RZ ;IF SO:GO GET IT.
- JMP STAT_CHK ;ELSE TRY AGAIN.
-
- * X_IN :GETS CURRENT X VALUE FROM HIPAD INTO DE
- X_IN: CALL STAT_CHK ;WAIT FOR DATA
- IN DATA_PRT ;GET 1ST BYTE (X7..X13)
- MOV D,A ;INTO D
- PUSH D
- CALL STAT_CHK
- POP D
- IN DATA_PRT ;2ND BYTE (X0..X6)
- MOV E,A ;INTO E
- SLAR E ;---|
- SLAR D ; |JUSTIFY
- SRAR D ; | RIGHT
- SRAR D ; | IN DE
- RRAR E ;---|
- RET
-
- * Y_IN :GETS CURRENT Y VALUE FROM HIPAD INTO HL
- Y_IN: XCHG
- CALL X_IN
- XCHG
- RET
-
- * PASS_X STORES THE 16 BIT # IN DE @ THE LOCATIONS WHOSE START
- * ADDRESS'S MSB = XVALUE + (IX) + (2 * (IY) ) : i.e. at X[N]
- PASS_X:
- PASS XVALUE
- RET
- * PASS_Y STORES THE 16 BIT # IN HL @ THE LOCATIONS WHOSE START
- * ADDRESS'S MSB = YVALUE + (IX) + (2 * (IY)) i.e. at Y[N]
- PASS_Y:
- XCHG
- PASS YVALUE
- XCHG
- RET
-
- PASS_N: ; PUT CONTENTS OF IY INTO N.
- PUSH IY
- POP H ; IY => HL.
- MOV D,N(IX) : ADDRESS OF N
- MOV E,N-1(IX) : => DE.
- MOV A,H
- STAX D
- DCX D
- MOV A,L
- STAX D
- RET
-
-
- END WAVE
-