home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / 1989 / 12 / praxis / asmgraph.asm next >
Encoding:
Assembly Source File  |  1989-09-14  |  11.6 KB  |  341 lines

  1. ;* ------------------------------------------------------- *
  2. ;*                   ASMGRAPH.ASM                          *
  3. ;*                                                         *
  4. ;*  Stellt Assemblerprozeduren bereit, um mit Topspeed     *
  5. ;*  Modula-2 den 16-Farbenmodus des Schneider PC 1512      *
  6. ;*  zu bedienen.                                           *
  7. ;*  Assemblieren mit:  MASM ASMGRAPH /ml;                  *
  8. ;*                                                         *
  9. ;*    (c) 1989  Cornelis van der Laan  &  TOOLBOX          *
  10. ;* ------------------------------------------------------- *
  11.             PAGE   68, 132
  12.  
  13.             NAME ASMGraph
  14.  
  15. G_ASMGraph  GROUP  C_ASMGraph
  16.  
  17. PUBLIC      ASMGraph$ASMHires, ASMGraph$ASMText
  18. PUBLIC      ASMGraph$ASMPlot,  ASMGraph$ASMPoint,
  19. PUBLIC      ASMGraph$ASMLine
  20.  
  21. ;* ------------------------------------------------------- *
  22. ;*  PROCEDURE ASMHires;
  23. ;*  PROCEDURE ASMText;
  24. ;*  PROCEDURE ASMPlot  (x, y : CARDINAL; color : CARDINAL);
  25. ;*  PROCEDURE ASMPoint (x, y : CARDINAL) : CARDINAL;
  26. ;*  PROCEDURE ASMLine  (x1, y1, x2, y2 : CARDINAL;
  27. ;*                      color          : CARDINAL);
  28. ;* ------------------------------------------------------- *
  29.  
  30. C_ASMGraph  SEGMENT BYTE PUBLIC 'FCODE'
  31.             ASSUME CS : C_ASMGraph
  32.  
  33. ;*  PROCEDURE ASMHires;
  34.  
  35. ASMGraph$ASMHires PROC FAR
  36.  
  37.             MOV  AX, 0006H      ; 640 x 200 hires-mode
  38.             INT  10H
  39.             MOV  AL, 0FH
  40.             MOV  DX, 03D9H      ; 16-Farben Modus wählen
  41.             OUT  DX, AL         ; Out (3D9H, 0FH)
  42.             RETF
  43.  
  44. ASMGraph$ASMHires ENDP
  45.  
  46.  
  47. ;* PROCEDURE ASMText;
  48.  
  49. ASMGraph$ASMText  PROC FAR
  50.  
  51.             MOV  AX, 0003H      ; Textmode Co80
  52.             INT  10H
  53.             RETF
  54.  
  55. ASMGraph$ASMText  ENDP
  56.  
  57.  
  58. ; PROCEDURE ASMPlot (x, y : CARDINAL; color : CARDINAL);
  59.  
  60. PlotX       EQU WORD PTR [BP + 10] ; Parameter
  61. PlotY       EQU WORD PTR [BP +  8]
  62. PlotColor   EQU BYTE PTR [BP +  6]
  63.  
  64. ASMGraph$ASMPlot  PROC FAR
  65.  
  66.               PUSH BP
  67.               MOV  BP, SP       ; Stack initialisieren
  68.               PUSH DI           ; Eventuelle Register-
  69.               PUSH SI           ; variablen sichern
  70.               PUSH DS
  71.               PUSH ES
  72.  
  73.               MOV  AX, 0B800H   ; DS initialisieren:
  74.               MOV  DS, AX       ; Zeiger auf
  75.                                 ; Bildschirmspeicher
  76. PlotStart :   MOV  CX, PlotX    ; Byte-Adresse des
  77.               CMP  CX, 639      ; gültige Koordinate ?
  78.               JA   PlotEnde     ; Nein -> RETURN
  79.               MOV  DX, PlotY    ; Punktes berechnen
  80.               CMP  DX, 199      ; gültige Koordinate ?
  81.               JA   PlotEnde     ; Nein -> RETURN
  82.               MOV  AL, 80       ; Zeilenlaenge 80 Byte
  83.               ROR  DX, 1        ; y DIV 2. Bit 0 aufheben
  84.               MUL  DL           ; Zeilenoffset berechnen
  85.               TEST DH, 80H      ; Bit 0 testen. War y
  86.               JZ   PlotY_Gerade ; ungerade, dann die zweite
  87.               ADD  AX, 2000H    ; Hälfte des Screens nehmen
  88. PlotY_Gerade: MOV  DX, CX       ; x-Koordinate holen
  89.               SHR  DX, 1        ; Auf Byte abbilden :
  90.               SHR  DX, 1        ; x := x DIV 8
  91.               SHR  DX, 1
  92.               ADD  AX, DX       ; Zum Offset addieren
  93.               MOV  DI, AX       ; Und Offset nach DI
  94.  
  95.               AND  CL, 07H      ; Bitmaske berechnen
  96.               MOV  AH, 80H
  97.               SHR  AH, CL       ; AH = zu setzendes Bit
  98.  
  99.               MOV  CX, 0004H    ; Schleifenzähler. 4 Ebenen
  100.               MOV  BH, PlotColor; Farbe
  101.               MOV  BL, 08H      ; Farbebene 8, 4, 2, 1
  102.               MOV  AL, 03       ; Read-Register 3, 2, 1, 0
  103.               MOV  DX, 03DEH
  104. PlotLoop :    OUT  DX, AL
  105.               XCHG AL, BL       ; Farbebene holen
  106.               DEC  DX           ; Port 3DDH
  107.               OUT  DX, AL       ; Write-Register setzen
  108.               INC  DX
  109.               TEST AL, BH       ; Farbeebene AND Farbe = ?
  110.               JZ   PlotLoeschen ; FALSE -> Punkt löschen
  111. PlotSetzen :  OR   [DI], AH     ; TRUE  -> Punkt setzen
  112.               XCHG AL, BL       ; Farben tauschen
  113.               DEC  AL           ; nächste Read-Ebene
  114.               SHR  BL, 1        ; nächste Write-Ebene
  115.               LOOP PlotLoop
  116.               JMP  SHORT PlotEnde
  117. PlotLoeschen: NOT  AH           ; Punkt löschen
  118.               AND  [DI], AH
  119.               NOT  AH           ; Alter Wert für Schleife !
  120.               XCHG AL, BL       ; Ohne Jmp ist's etwas
  121.               DEC  AL           ; schneller
  122.               SHR  BL, 1
  123.               LOOP PlotLoop
  124.  
  125. PlotEnde :    POP  ES
  126.               POP  DS
  127.               POP  SI
  128.               POP  DI
  129.               MOV  SP, BP
  130.               POP  BP
  131.               RETF 6            ; Stack in Ordnung bringen
  132.  
  133. ASMGraph$ASMPlot  ENDP
  134.  
  135.  
  136. ;*  PROCEDURE ASMPoint (x, y : CARDINAL) : CARDINAL;
  137.  
  138. PointX        EQU WORD PTR [BP + 8]         ; Parameter
  139. PointY        EQU WORD PTR [BP + 6]
  140.  
  141.  
  142. ASMGraph$ASMPoint PROC FAR
  143.  
  144.               PUSH BP
  145.               MOV  BP, SP       ; Stack initialisieren
  146.               PUSH DI
  147.               PUSH SI
  148.               PUSH DS
  149.               PUSH ES
  150.  
  151. PointStart :  MOV  CX, 0004H    ; 4 Farbebenen
  152.               MOV  BX, 0003H    ; Start mit Nr. 3
  153.               MOV  DX, 03DEH    ; Read-Register
  154.               MOV  AH, 0DH      ; BIOS-Request GetPixel
  155. PointEbenen : MOV  AL, BL       ; Farbebene holen
  156.               OUT  DX, AL       ; Read-Ebene setzen
  157.               PUSH CX           ; Register werden gebraucht
  158.               PUSH DX
  159.               MOV  CX, PointX   ; Arbeit vom BIOS machen
  160.               MOV  DX, PointY   ; lassen.
  161.               INT  10H          ; Und los ...
  162.               MOV  CL, BL
  163.               SHL  AL, CL       ; Bit an richtige Position
  164.               OR   BH, AL       ; bringen und in BH merken
  165.               POP  DX
  166.               POP  CX
  167.               DEC  BL           ; Nächste Read-Ebene
  168.               LOOP PointEbenen
  169.  
  170.               MOV  AL, BH       ; Ergebnis in AX zurückgeben
  171.               XOR  AH, AH       ; und HiByte zurücksetzen
  172.  
  173. PointEnde :   POP  ES
  174.               POP  DS
  175.               POP  SI
  176.               POP  DI
  177.               MOV  SP, BP
  178.               POP  BP
  179.               RETF 4            ; Parameter poppen
  180.  
  181. ASMGraph$ASMPoint ENDP
  182.  
  183.  
  184. ;*  PROCEDURE ASMLine (x1, y1, x2, y2 : CARDINAL;
  185. ;*                    color : CARDINAL);
  186.  
  187. LineX1        EQU WORD PTR [BP + 14]     ; Parameter
  188. LineY1        EQU WORD PTR [BP + 12]
  189. LineX2        EQU WORD PTR [BP + 10]
  190. LineY2        EQU WORD PTR [BP +  8]
  191. LineColor     EQU BYTE PTR [BP +  6]
  192.  
  193. ASMGraph$ASMLine  PROC FAR
  194.  
  195.               PUSH BP
  196.               MOV  BP, SP       ; Stack initialisieren
  197.               PUSH DI
  198.               PUSH SI
  199.               PUSH DS
  200.               PUSH ES
  201.  
  202. LineStart :   MOV  AX, LineX2   ; x2 nach AX
  203.               MOV  BX, LineY2   ; y2 nach BX
  204.               MOV  CX, LineX1   ; x1 nach CX
  205.               MOV  DX, LineY1   ; y1 nach DX
  206.               CMP  AX, CX       ; IF x2 < x1 THEN SwapX
  207.               JAE  DontSwapX
  208. SwapX :       XCHG AX, CX       ; Koordinaten tauschen
  209.               XCHG BX, DX
  210.               MOV  LineX2, AX   ; und x2 und y2 sichern
  211.               MOV  LineY2, BX   ; (wird noch gebraucht)
  212. DontSwapX :   SUB  AX, CX       ; dx := x2 - x1
  213.               MOV  DI, AX       ; dx nach DI
  214.               MOV  AL, LineColor
  215.               CMP  BX, DX       ; IF y2 < y1 THEN JMP Y_Decrease
  216.               JB   Y_Decrease   ; ELSE Y_Increase
  217. Y_Increase :  SUB  BX, DX       ; dy := y2 - y1
  218.               MOV  SI, BX       ; dy nach SI
  219.               XOR  BX, BX       ; BX = eps = 0
  220.               CMP  DI, SI       ; IF dx < dy
  221.               JB   SHORT SteilInc ; THEN JMP SteilInc
  222.               JMP  SHORT FlachInc ; ELSE FlachInc
  223. Y_Decrease :  SUB  BX, DX       ; y1 in DX bewahren !
  224.               NEG  BX           ; dy := y1 - y2
  225.               MOV  SI, BX       ; dy nach SI
  226.               XOR  BX, BX
  227.               CMP  DI, SI       ; IF dx < dy
  228.               JB   SHORT SteilDec ; THEN JMP SteilDec
  229.               JMP  SHORT FlachDec ; ELSE JMP FlachDec
  230. SteilInc :
  231. SteilIncLoop: PUSH AX           ; LOOP
  232.               PUSH BX           ; Register sichern
  233.               PUSH CX
  234.               PUSH DX
  235.               PUSH CX           ; Parameter pushen
  236.               PUSH DX
  237.               PUSH AX
  238.               CALL ASMGraph$ASMPlot ; Plot (x1, y1, color)
  239.               POP  DX               ; Register wieder holen
  240.               POP  CX
  241.               POP  BX
  242.               POP  AX
  243.               CMP  DX, LineY2   ; IF y1 = y2 THEN
  244.               JE   LineEnde     ;   RETURN
  245.               INC  DX           ; ELSE INC (y1)
  246.               ADD  BX, DI       ;   INC (eps, dx)
  247.               ADD  BX, DI       ;   INC (eps, dx)
  248.               CMP  BX, SI       ;   IF eps > dy THEN
  249.               JLE  SteilIncLoop ;
  250.               SUB  BX, SI       ;     DEC (eps, dy)
  251.               SUB  BX, SI       ;     DEC (eps, dy)
  252.               INC  CX           ;     INC (x1);
  253.               JMP  SHORT SteilIncLoop ; END (* LOOP *)
  254. FlachInc :
  255. FlachIncLoop: PUSH AX           ; Register sichern
  256.               PUSH BX
  257.               PUSH CX
  258.               PUSH DX
  259.               PUSH CX           ; Parameter pushen
  260.               PUSH DX
  261.               PUSH AX
  262.               CALL ASMGraph$ASMPlot ; Plot (x1, y1, color)
  263.               POP  DX               ; Register wieder holen
  264.               POP  CX
  265.               POP  BX
  266.               POP  AX
  267.               CMP  CX, LineX2
  268.               JE   LineEnde
  269.               INC  CX
  270.               ADD  BX, SI
  271.               ADD  BX, SI
  272.               CMP  BX, DI
  273.               JLE  FlachIncLoop
  274.               SUB  BX, DI
  275.               SUB  BX, DI
  276.               INC  DX
  277.               JMP  SHORT FlachIncLoop
  278. SteilDec :
  279. SteilDecLoop: PUSH AX           ; Register sichern
  280.               PUSH BX
  281.               PUSH CX
  282.               PUSH DX
  283.               PUSH CX           ; Parameter pushen
  284.               PUSH DX
  285.               PUSH AX
  286.               CALL ASMGraph$ASMPlot ; Plot (x1, y1, color)
  287.               POP  DX               ; Register wieder holen
  288.               POP  CX
  289.               POP  BX
  290.               POP  AX
  291.               CMP  DX, LineY2
  292.               JE   LineEnde
  293.               DEC  DX
  294.               ADD  BX, DI
  295.               ADD  BX, DI
  296.               CMP  BX, SI
  297.               JLE  SteilDecLoop
  298.               SUB  BX, SI
  299.               SUB  BX, SI
  300.               INC  CX
  301.               JMP  SHORT SteilDecLoop
  302. FlachDec :
  303. FlachDecLoop: PUSH AX           ; Register sichern
  304.               PUSH BX
  305.               PUSH CX
  306.               PUSH DX
  307.               PUSH CX           ; Parameter pushen
  308.               PUSH DX
  309.               PUSH AX
  310.               CALL ASMGraph$ASMPlot ; Plot (x1, y1, color)
  311.               POP  DX               ; Register wieder holen
  312.               POP  CX
  313.               POP  BX
  314.               POP  AX
  315.               CMP  CX, LineX2
  316.               JE   LineEnde
  317.               INC  CX
  318.               ADD  BX, SI
  319.               ADD  BX, SI
  320.               CMP  BX, DI
  321.               JLE  FlachDecLoop
  322.               SUB  BX, DI
  323.               SUB  BX, DI
  324.               DEC  DX
  325.               JMP  SHORT FlachDecLoop
  326.  
  327. LineEnde :    POP  ES
  328.               POP  DS
  329.               POP  SI
  330.               POP  DI
  331.               MOV  SP, BP       ; Lokale Variable poppen
  332.               POP  BP
  333.               RETF 10           ; Parameter poppen
  334.  
  335. ASMGraph$ASMLine  ENDP
  336.  
  337. C_ASMGraph    ENDS              ; Segmentende
  338.               END
  339. ;* ------------------------------------------------------- *
  340. ;*               Ende von ASMGRAPH.ASM                     *
  341.