extrn WaitRetrace:far

data segment public
  extrn sinus:dataptr           ;Sinustabelle
data ends


code segment public
assume cs:code,ds:data

public make_wob
make_wob proc pascal wob_pos,wob_hoehe,wob_offset:word
  xor cx,cx                     ;Zeilenzhler auf 0
  call waitretrace              ;Synchronisation mit Kathodenstrahl

next_line:
  inc cx                        ;Zeilenzhler hoch

  mov bx,cx                     ;Position innerhalb des Wobblers bestimmen
  sub bx,wob_pos
  mov si,bx                     ;merken fr Schluį

  add bx,wob_offset             ;Offset drauf fr Bewegung
  and bx,63                     ;nur Werte von 0..63 erlauben (Arraygrįe)
  shl bx,1                      ;Arrayzugriff auf Words
  mov bx,sinus[bx]              ;Wert holen  in bx

  cli                           ;Interrupts lschen, da SEHR zeitkritisch
  mov dx,3dah                   ;Input Status Register 1 selektieren

in_display:
  in al,dx                      ;Warten auf (Horizontal-) Retrace
  test al,1
  je in_display
in_retrace:
  in al,dx                      ;auf Display warten
  test al,1
  jne in_retrace

  cmp cx,wob_pos                ;gewnschte Zeile erreicht ?
  jb next_line                  ;nein -> Standarwert setzen

  mov dx,3d4h                   ;CRTC-Register 4 (Horizontal Sync Start)
  mov al,4                      ;selektieren
  mov ah,bl                     ;Sinus-Wert holen
  out dx,ax                     ;und eintragen

  cmp si,wob_hoehe              ;Ende erreicht ?
  jb next_line

  mov dx,3dah
warten:
  in al,dx                      ;Warten auf (Horizontal-) Retrace
  test al,1
  jne warten
  mov dx,3d4h                   ;Sync Start wieder normal setzen
  mov ax,5504h
  out dx,ax
  sti                           ;Interrupts wieder zulassen
  ret
make_wob endp

code ends
end
