home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol131 / wave.src < prev    next >
Encoding:
Text File  |  1984-04-29  |  4.4 KB  |  211 lines

  1. * PROCEDURE WAVE(VAR XVALUE,YVALUE:INT_ARRAY;VAR N:INTEGER;MAXN:INTEGER);
  2.  
  3. * AN EXTERNAL ROUTINE TO FILL ARRAYS X AND Y FROM THE HIPAD,IN STREAM MODE.
  4. * POINT COLLECTING STARTS WHEN THE PEN GOES DOWN.(i.e.CONTROL BYTE = 0F4H)
  5. * A POINT IS REJECTED IF IT IS < 0.2mm TO THE RIGHT OF THE PRECEDING POINT.
  6. * THE PROCEDURE ENDS IF THE PEN COMES UP OR WHEN MAXN POINTS HAVE BEEN READ.
  7.  
  8. VBYTES    EQU  9    # OF BYTES ON STACK
  9. XVALUE    EQU 16    OFFSETS TO (IX) FOR ADDRESS OF POINTERS
  10. YVALUE    EQU 14    TO TRANSMITTED VARIABLES.
  11. N    EQU 12
  12. MAXN    EQU  9
  13.  
  14. STAT_RDY EQU 0F7H  STATUS PORT DATA AVAILABLE CODE
  15. STAT_PRT EQU 00AH  ADDRESS OF STATUS PORT
  16. DATA_PRT EQU 008H     "    "   DATA    "
  17.  
  18.         NAME    WAVE
  19.         ENTRY    WAVE
  20.  
  21. PASS:        MACRO    ARG    ; STORES THE 16BIT NO. IN DE
  22.                 ; IN A LOCATION WHOSE BASE
  23.                 ; ADDRESS IS CALCULATED FROM ARG.
  24.                 ; & WHOSE OFFSET = 2 x IY
  25.         PUSH    H    ;
  26.         PUSH    B    ; SAVE ALL REGISTERS USED 
  27.         PUSH    Y    ;
  28.         MOV H,ARG(IX)    ; GET BASE ADDRESS OF
  29.         MOV L,ARG-1(IX)    ; ARRAY => HL
  30.         DADY    Y    ; OFFSET = 2 * Y
  31.         PUSH    Y
  32.         POP    B    ; OFFSET --> BC
  33.         DSBC    B    ; ADDRESS OF ARRAY[N] = HL-OFFSET
  34.         XCHG        ; ADDRESS => DE : ARG => HL
  35.         MOV A,H        ;
  36.         STAX    D    ;
  37.         DCX    D    ;
  38.         MOV A,L        ;
  39.         STAX    D    ;
  40.         POP    Y
  41.         POP    B
  42.         POP    H
  43.         ENDMAC
  44.  
  45. WAVE:
  46.         ENTR D,2,0
  47.         JMP START
  48. OLD_X:    DS 2
  49.  
  50. START:
  51.         PUSH Y         : SAVE IY FOR PASCAL/Z
  52.         MOV B,MAXN(IX)     : GET VALUE OF
  53.         MOV C,MAXN-1(IX) : MAXN => BC.
  54.         LXI H,0
  55.         DSBC B         : MAXN = or > 1 ?
  56.         JM START2     : IF YES THEN START
  57.         PUSH B
  58.         POP Y
  59.         CALL PASS_N     : MAXN --> N
  60.         JMP WAVE_END     : ELSE RETURN.
  61.         
  62. START2:
  63.         LXI Y,0        : COUNTER FOR POINTS READ.
  64.         CALL W8_4_PEN    : PEN DOWN YET?
  65.         CALL FIRST_PR
  66. LOOP:
  67.         JMP ANYMORE    : DOES N := MAXN YET ?
  68. PROCEED:
  69.         JMP PEN_UP_YET
  70. STILL_DOWN:
  71.         JMP NEXT_PR
  72. WAVE_END:
  73.         CALL PASS_N
  74.         POP Y        : RESTORE ORIGINAL Y FOR PASCAL/Z
  75.         EXIT D,VBYTES
  76.  
  77. * SUBROUTINES:
  78. * W8_4_PEN:READS DATA PORT UNTIL CONTROL BYTE = F4 : i.e. PEN IS DOWN.
  79.  
  80. W8_4_PEN:
  81.         CALL STAT_CHK    ;WAIT TILL DATA AVAILABLE
  82.         IN DATA_PRT    ;GET IT
  83.         CPI 0F4H    ;PEN DOWN ?
  84.         JNZ W8_4_PEN    ;NO : KEEP WAITING.
  85.         RET        ;YES!
  86.  
  87. FIRST_PR:
  88.     CALL X_IN        ;DISCARD THE FIRST
  89.     CALL Y_IN        ;POINT AS IT CAN
  90.     CALL W8_4_PEN        ;BE GARBAGE.
  91.     CALL X_IN        ;GET X[1]
  92.     MOV B,XVALUE(IX)    ;
  93.     MOV C,XVALUE-1(IX)
  94.     MOV A,D
  95.     STA OLD_X        ;SAVE IT TO COMPARE WITH NEXT X
  96.     STAX B            ;& ALSO SEND IT TO PASCAL/Z LAND.
  97.     DCX B
  98.     MOV A,E
  99.     STA OLD_X+1
  100.     STAX B
  101.     CALL Y_IN        ;GET Y[1]
  102.     CALL PASS_Y        ;& SEND IT TO PASCAL/Z LAND.
  103.     INX Y            ;INCREMENT COUNTER
  104.     RET
  105.  
  106. * ANYMORE CHECKS WHETHER N HAS REACHED MAXN i.e. is array filled
  107. ANYMORE:
  108.     PUSH H
  109.     MOV H,MAXN(IX)
  110.     MOV L,MAXN-1(IX)
  111.     PUSH D
  112.     PUSH Y            ;GET COUNT FROM Y
  113.     POP D            ;TO DE + COMPARE
  114.     DSBC D            ;TO MAXN.
  115.     POP D
  116.     POP H
  117.     JZ WAVE_END
  118.     JMP PROCEED
  119.  
  120. * PEN_UP_YET:READS DATA PORT,LOOKING FOR CONTROL BYTE = F3
  121. PEN_UP_YET:
  122.         CALL STAT_CHK    ;WAIT FOR DATA
  123.         IN DATA_PRT    ;GET A BYTE
  124.         CPI 0F4H    ;CONTROL BYTE = F4?(PEN STILL DOWN)
  125.         JZ STILL_DOWN
  126.         JMP WAVE_END    ;EXIT IF PEN NOT DOWN
  127.  
  128. NEXT_PR:
  129.     CALL X_IN        : GET  NEW X => DE
  130.     PUSH D            : & SAVE IT
  131.     LXI H,OLD_X
  132.     MOV B,M
  133.     INX H
  134.     MOV C,M            : GET  OLD_X => BC
  135.     XCHG            : MOVE NEW X => HL
  136.     INX B
  137.     INX B            : ADD 2 TO OLDX
  138.     DSBC B            : NEW_X = or > (OLD_X + 2) ? 
  139.     JM TOO_CLOSE        : IF NOT : DON`T WANT IT
  140.     POP D            : IF SO : RESTORE NEW X
  141.     MOV A,D
  142.     STA OLD_X        : SAVE IT TO COMPARE WITH NEXT X
  143.     MOV A,E
  144.     STA OLD_X+1
  145.     CALL PASS_X        : & SEND X & Y
  146.     CALL Y_IN        : TO PASCAL/Z
  147.     CALL PASS_Y        : LAND
  148.     INX Y            : N := N + 1
  149.     JMP LOOP
  150. TOO_CLOSE:
  151.     POP D            : RESTORE STACK
  152.     CALL Y_IN        : CLEAR PORT
  153.     JMP LOOP
  154.  
  155. * STAT_CHK :CHECKS STATUS PORT 
  156. STAT_CHK:
  157.         IN STAT_PRT    ;DATA IN? 
  158.         CPI STAT_RDY 
  159.         RZ        ;IF SO:GO GET IT.
  160.         JMP STAT_CHK     ;ELSE TRY AGAIN.
  161.  
  162. * X_IN :GETS CURRENT X VALUE FROM HIPAD INTO DE
  163. X_IN:   CALL STAT_CHK    ;WAIT FOR DATA
  164.     IN DATA_PRT    ;GET 1ST BYTE (X7..X13)
  165.     MOV D,A        ;INTO D
  166.     PUSH D
  167.     CALL STAT_CHK
  168.     POP D
  169.     IN DATA_PRT    ;2ND BYTE (X0..X6)
  170.     MOV E,A        ;INTO E
  171.     SLAR E        ;---|
  172.     SLAR D        ;   |JUSTIFY
  173.     SRAR D        ;   | RIGHT 
  174.     SRAR D        ;   | IN DE
  175.     RRAR E        ;---|
  176.     RET
  177.  
  178. * Y_IN :GETS CURRENT Y VALUE FROM HIPAD INTO HL
  179. Y_IN:   XCHG
  180.     CALL X_IN
  181.     XCHG
  182.     RET
  183.  
  184. * PASS_X STORES THE 16 BIT # IN DE @ THE LOCATIONS WHOSE START
  185. * ADDRESS'S MSB = XVALUE + (IX) + (2 * (IY) ) : i.e. at X[N]
  186. PASS_X:
  187.     PASS XVALUE
  188.     RET
  189. * PASS_Y STORES THE 16 BIT # IN HL @ THE LOCATIONS WHOSE START
  190. * ADDRESS'S MSB = YVALUE + (IX) + (2 * (IY)) i.e. at Y[N]
  191. PASS_Y:
  192.     XCHG
  193.     PASS YVALUE
  194.     XCHG
  195.     RET
  196.  
  197. PASS_N:            ; PUT CONTENTS OF IY INTO N.
  198.     PUSH IY
  199.     POP H        ; IY => HL.
  200.     MOV D,N(IX)    : ADDRESS OF N
  201.     MOV E,N-1(IX)    : => DE.
  202.     MOV A,H
  203.     STAX D
  204.     DCX D
  205.     MOV A,L
  206.     STAX D
  207.     RET
  208.  
  209.  
  210.             END WAVE
  211.