home *** CD-ROM | disk | FTP | other *** search
/ Crazy Pacman / CrazyPacman.iso / pacman / PACMAN / SOURCE / P_ASM.ASM < prev    next >
Encoding:
Assembly Source File  |  1995-11-13  |  43.8 KB  |  1,526 lines

  1. ;== Konstanten =========================================================
  2. looplimit                    = 01ffh;
  3. SC_INDEX                     = 3c4h              ; Indexregister des Sequencer-Ctrl.
  4. SC_MAP_MASK                  = 2                 ; Nummer des Map-Mask-Registers
  5. SC_MEM_MODE                  = 4                 ; Nummer des Memory-Mode-Registers
  6. GC_INDEX                     = 3ceh              ; Indexregister des Graphics-Ctrl.
  7. GC_READ_MAP                  = 4                 ; Nummer des Read-Map-Registers
  8. GC_GRAPH_MODE                = 5                 ; Nummer des Graphics-Mode-Registers
  9. GC_MISCELL                   = 6                 ; Nummer des Miscellaneous-Registers
  10. CRTC_INDEX                   = 3d4h              ; Indexregistes des CRT-Controllers
  11. CC_MAX_SCAN                  = 9                 ; Nummer des Maximum-Scan-Line-Reg.
  12. CC_START_HI                  = 0Ch               ; Nummer des Hi-Start-Registers
  13. CC_UNDERLINE                 = 14h               ; Nummer des Underline-Registers
  14. CC_MODE_CTRL                 = 17h               ; Nummer des Mode-Control-Registers
  15. PIXX                         = 320               ; horizontale Auflösung
  16. SPEICHER                     = 500               ; zwischenspeicher zum laden eines pcx...
  17. INPUT_1                      = 3DAh              ; Input Status #1 Register
  18. VERT_RETRACE                 = 08h               ; INPUT_1: Vertical Retrace Bit
  19.  
  20. public                       _copybuf2plane
  21. public                       _copyplane2buf
  22. public                       _cpbuf2scr
  23. public                       _cpscr2buf
  24. public                       _cpback2scr
  25. public                       _get_kkey
  26. public                       _cpbuf2back
  27. public                       _init320400         ; 320*400-Punkte-Modus initialisieren
  28. public                       _setpix             ; Punkt setzen
  29. public                       _showpage           ; Seite 0 oder 1 anzeigen
  30. public                       _setpage            ; Seite für setpix und getpix festlegen
  31. public                       _getfontptr         ; liefert Zeiger auf 8*8-Zeichensatz
  32. public                       _stick
  33. public                       _set_color          ; Funktion als öffentlich deklarieren fuer Linker
  34. public                       _piclen             ; Funktion als öffentlich deklarieren fuer Linker
  35. public                       _show_pic           ; Funktion als öffentlich deklarieren fuer Linker
  36. public                       _sync_display
  37.  
  38. .model large
  39. .286
  40. .data
  41.  
  42. akt_mode                     dw 3                ; Modus bei init
  43. akt_v                        dw 2                ; Vesa benoetigt 1=ja 2 = nein
  44. akt_x                        dw 320              ; x-aufloesung
  45. akt_y                        dw 400              ; y-aufloesung
  46. akt_f                        dw 256              ; anzahl der Farben
  47. akt_m                        dw 013h             ; Modus Nummer um aufzurufen
  48. akt_l                        dw 65536/320+1      ; addline
  49. akt_b                        dw 256              ; addbytes
  50.  
  51. _vio_seg                     dw 0a000h           ; Video-Segment mit akt. Seite
  52. setfen                       dw 0,0
  53. init_mode                    dw 0
  54. xx                           dw 0
  55. yy                           dw 0
  56. akthand                      dw 0
  57. fonthandle                   dw 0
  58. xfontsize1                   dw 0
  59. tbreite                      dw 0
  60. abreite                      dw 0
  61. bpointer                     dw 0
  62. offdata                      dw 0
  63. tcounl                       dw 0
  64. bpend                        dw 0
  65. tcounh                       dw 0
  66. tcode                        dw 0
  67. xpos                         dw 0
  68. ypos                         dw 0
  69. xbpos                        dw 0
  70. ybpos                        dw 0
  71. xlen                         dw 0
  72. ylen                         dw 0
  73. fill                         dw 0
  74. chigh                        dw 0
  75. clow                         dw 0
  76. flag                         dw 0
  77. fno                          dw 0
  78. r                            dw 0
  79. g                            dw 0
  80. b                            dw 0
  81. full                         dw 0
  82. bbytesh                      dw 0
  83. bbytesl                      dw 0
  84. breite                       dw 0
  85. hoch                         dw 0
  86. gcounterh                    dw 0
  87. gcounterl                    dw 0
  88. fencoun0                     dw 0
  89. fencoun1                     dw 0
  90. lencoun                      dw 0
  91. blen                         dw 0
  92. bblen                        dw 0
  93. plen                         dw 0
  94. noread                       db 0
  95. zenum                        dw 0
  96. handle                       dw 0
  97. zeile1                       db 140 dup(0)
  98. zeile2                       db 140 dup(0)
  99. zeile3                       db 140 dup(0)
  100. zeile4                       db 140 dup(0)
  101. bild                         db 130 dup(0)
  102. fab2                         db 768 dup(0)
  103. fab                          db 48 dup(0)
  104. stelle                       db 0,0
  105. oldmode                      db 0,0
  106. buffer                       db SPEICHER dup(0)
  107. color                        db 0
  108. indata                       db 15 dup (0)
  109. tabelle1                     db 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,15
  110.  
  111. .code
  112.  
  113. _setpix    proc far
  114. sframe     struc                  ; Struktur zum Zugriff auf den Stack
  115. bp0        dw ?                   ; nimmt BP auf
  116. ret_adr0   dd ?                   ; Rücksprungadresse zum Aufrufer
  117. x0         dw ?                   ; X-Ordinate
  118. y0         dw ?                   ; Y-Ordinate
  119. ffarbe     dw ?                   ; Farbe
  120. sframe     ends                   ; Ende der Struktur
  121. frame      equ [ bp - bp0 ]       ; adressiert die Elemente der Struktur
  122.  
  123.            push  bp               ; Adressierung der Parameter über
  124.            mov   bp,sp            ; das BP-Register vorbereiten
  125.            push  di               ; DI auf dem Stack sichern
  126.            push  cx
  127.  
  128.            mov   ax,PIXX / 4      ; Offset in den Video-RAM berechnen
  129.            mul   frame.y0         ; und nach DI laden
  130.        mov   cx,frame.x0
  131.        mov   bx,cx
  132.        shr   bx,1
  133.        shr   bx,1
  134.        add   ax,bx
  135.        mov   di,ax
  136.  
  137.        and   cl,3             ;Bit-Maske für die zu adressierende
  138.        mov   ah,1             ;Map in AH berechnen
  139.        shl   ah,cl
  140.        mov   al,SC_MAP_MASK   ;nach AL die Registernummer
  141.        mov   dx,SC_INDEX      ;Indexadresse des Sequencers laden
  142.        out   dx,ax            ;Bit-Mask-Register laden
  143.  
  144.        mov   ax,_vio_seg       ;ES auf den Video-RAM setzen
  145.        mov   es,ax
  146.        mov   al,byte ptr frame.ffarbe  ;Farbe des Punktes laden
  147.        stosb                  ;und in die gewählte Bit-Map schreiben
  148.        pop     cx
  149.        pop   di               ;Register wieder vom Stack holen
  150.        pop   bp
  151.        ret                    ;zurück zum Aufrufer
  152. _setpix    endp                   ;Ende der Prozedur
  153.  
  154. _setpage   proc far
  155.        pop   bx               ;Rücksprungadresse vom Stack
  156.        pop   cx
  157.        pop   ax               ;Argument vom Stack
  158.        push  ax               ;und beides wieder rauf
  159.        push  cx
  160.        push  bx
  161.  
  162.        mov   bl,0a0h          ;von Seite 0 ausgehen
  163.        or    al,al            ;ist es die Seite 0?
  164.        je    sp1              ;Ja, Segmentadresse merken
  165.  
  166.        mov   bl,0a8h          ;Nein, Seite 1
  167. sp1:       mov   byte ptr _vio_seg + 1,bl  ;neue Segmentadresse merken
  168.        ret                    ;zurück zum Aufrufer
  169. _setpage   endp                   ;Ende der Prozedur
  170.  
  171. _showpage  proc far
  172.  
  173.        pop   bx               ;Rücksprungadresse vom Stack
  174.        pop   cx
  175.        pop   ax               ;Argument vom Stack
  176.  
  177.        push  ax               ;und beides wieder rauf
  178.        push  cx
  179.        push  bx
  180.  
  181.        or    al,al            ;ist es die Seite 0?
  182.        je    sp2              ;Ja, Nummer ist auf Hi-Byte des Offset
  183.  
  184.        mov   al,80h           ;Nein, Seite 1, mit Offset 8000h
  185.  
  186. sp2:       mov   dx,CRTC_INDEX    ;CRT-Controller adressieren
  187.        mov   ah,al            ;Hi-Byte des Offsets nach AH
  188.        mov   al,CC_START_HI   ;Registernummer nach AL
  189.        out   dx,ax            ;und ab gehts
  190.  
  191.        mov   dx,INPUT_1  ;zunächst auf Ende des vertikalen
  192. sp3:       in    al,dx            ;Rücklaufs warten
  193.        test  al,8
  194.        jne   sp3
  195.  
  196.  
  197. sp4:       in    al,dx            ;dann auf den Start des Rücklaufs
  198.        test  al,8
  199.        je    sp4
  200.  
  201.        ret                    ;zurück zum Aufrufer
  202.  
  203. _showpage  endp                   ;Ende der Prozedur
  204.  
  205. _getfontptr proc far
  206.  
  207.       push  bp                ;BP sichern
  208.  
  209.       mov   ax,1130h          ;Register für Funktionsaufruf laden
  210.       mov   bh,3
  211.       int   10h               ;BIOS-Video-Interrupt aufrufen
  212.  
  213.       mov   dx,es             ;Zeiger ES:BP in DX:AX zurückliefern
  214.       mov   ax,bp
  215.  
  216.       pop   bp                ;BP vom Stack zurückholen
  217.       ret                     ;zurück zum Aufrufer
  218.  
  219. _getfontptr endp                  ;Ende der Prozedur
  220.  
  221. ;══════════════════════════════════════════════════════════════════════════════
  222. get_decrunch    proc    near            ; einfache rll decruncher
  223.     push    bx
  224.     mov     bx,[bpointer]           ; holt buffer nach bp
  225.     inc     bpointer
  226.  
  227.     mov     al,[bx]
  228.     cmp     bx,[bpend]              ; wenn 50KB dann neuen buffer lesen
  229.     jne     short g_d_1
  230.     call    read_buffer             ; weitere 50KB lesen
  231.     mov     bx,[bpointer]           ;**************************
  232.     dec     bx
  233. g_d_1:
  234.     cmp     al,11000000b
  235.     jnb     zaehler                 ; ja, dann zaehler ausfindig machen
  236.     mov     cx,1                    ; sonst zaehler =1 und weg
  237.     pop     bx
  238.     ret
  239. zaehler:
  240.     mov     cx,00111111b            ; die 6 lo bits sind der zaehler
  241.     and     cl,al                   ; in cl jetzt der zaehler ...
  242.     inc     bx                     ; und counter + bx erhoehen
  243.     inc     bpointer
  244.     mov     al,[bx]
  245.     cmp     bx,[bpend]         ; wie oben
  246.     jne     short g_d_2
  247.     call    read_buffer
  248. g_d_2:
  249.     pop     bx
  250.     ret
  251. get_decrunch    endp
  252. ;══════════════════════════════════════════════════════════════════════════════
  253. farbe   proc    near
  254. palette:
  255.     call    shift_col
  256.     mov     bx,offset bild         ; und ganz normal weitermachen
  257.     add     bx,16
  258.     mov     ax,ds
  259.     mov     es,ax
  260.     mov     dx,bx
  261.     mov     bx,offset stelle
  262.     mov     bx,[bx]
  263.     mov     cx,16
  264.     mov     al,12h
  265.     mov     ah,10h
  266.     int     10h
  267.     ret
  268. farbe   endp
  269. ;══════════════════════════════════════════════════════════════════════════════
  270. shift_col       proc    near
  271.     call    test_change
  272.     cmp     cx,0
  273.     jz      sc2
  274.     mov     bx,offset bild
  275.     add     bx,16
  276.     mov     cx,48
  277. sc1:
  278.     mov     al,[bx]
  279.     push    cx
  280.     mov     cl,1
  281.     shr     al,cl
  282.     shr     al,cl
  283. sc3:
  284.     mov     [bx],al
  285.     inc     bx
  286.     pop     cx
  287.     loop    sc1
  288. sc2:
  289.     ret
  290. shift_col       endp
  291. ;══════════════════════════════════════════════════════════════════════════════
  292. test_change     proc    near  ; 0 oder 1 nach cx, 1 muss gechanged werden
  293.     mov     cx,48
  294.     mov     bx,offset bild
  295.     add     bx,16
  296. tc1:
  297.     mov     al,[bx]
  298.     cmp     al,00111111b
  299.     jae     tc2
  300.     inc     bx
  301.     loop    tc1
  302. tc2:
  303.     ret
  304. test_change     endp
  305. ;══════════════════════════════════════════════════════════════════════════════
  306. _set_color     PROC FAR              ; start ist die Proc, muss bei grossen Programmen far sein
  307.  
  308.     Push    BP            ; Stack retten
  309.     Mov     BP,SP         ; Stack retten
  310.     push    ds
  311.     mov     ax,@data
  312.     mov     ds,ax
  313.     mov     ax,[bp+6]
  314.     mov     fno,ax
  315.     mov     ax,[bp+8]
  316.     mov     r,ax
  317.     mov     ax,[bp+10]
  318.     mov     g,ax
  319.     mov     ax,[bp+12]
  320.     mov     b,ax
  321.     mov     dx,03c8h
  322.     mov     ax,[fno]
  323.     out     dx,al
  324.     mov     dx,03c9h
  325.     mov     ax,[r]
  326.     out     dx,al
  327.     mov     ax,[g]
  328.     out     dx,al
  329.     mov     ax,[b]
  330.     out     dx,al
  331.     pop    ds
  332.     mov     sp,bp
  333.     pop     bp
  334.     RET
  335. _set_color       endp
  336. ;══════════════════════════════════════════════════════════════════════════════
  337. _piclen     PROC FAR              ; start ist die Proc, muss bei grossen Programmen far sein
  338.  
  339.     Push    BP            ; Stack retten
  340.     Mov     BP,SP         ; Stack retten
  341.     push    di
  342.     push    si
  343.     push    bp
  344.     push    es
  345.     mov     ax,@data
  346.     mov     ds,ax
  347.  
  348.     mov     ax,[bp+6]
  349.     mov     dx,[bp+8]
  350.     mov     chigh,dx
  351.     mov     clow,ax
  352.  
  353.     mov     ax,[bp+10]
  354.     mov     flag,ax
  355.     mov     dx,[chigh]
  356.  
  357.     call    do_pcx
  358.  
  359.     mov     ah,3dh
  360.     mov     al,0
  361.     mov     dx,offset indata
  362.     int     21h
  363.     jc      zofehler
  364.     mov     [handle],ax
  365.     jmp     zweiter
  366. zofehler:
  367.     mov     cx,0
  368.     jmp     zopf                    ; stack noch nicht korrigiert
  369. zweiter:
  370.     mov     ah,3fh                  ; lesen einer Datei
  371.     mov     bx,[handle]
  372.     mov     dx,offset bild
  373.     mov     cx,128
  374.     int     21h
  375.     mov     bx,offset bild          ; Bild breite und hoehe einstellen
  376.     add     bx,8
  377.     mov     ax,[bx]
  378.     sub     bx,4
  379.     mov     dx,[bx]
  380.     sub     ax,dx
  381.     mov     breite,ax
  382.  
  383.     add     bx,2
  384.     mov     dx,[bx]
  385.     add     bx,4
  386.     mov     ax,[bx]
  387.     sub     ax,dx
  388.     mov     hoch,ax
  389.  
  390.     cmp     flag,1
  391.     jz      zy
  392.     mov     bx,offset breite
  393.     mov     cx,[bx]
  394.     jmp     zopf
  395. zy:
  396.     mov     bx,offset hoch
  397.     mov     cx,[bx]
  398. zopf:
  399.     push    cx
  400.     mov     ah,3eh                  ; schliessen einer datei
  401.     mov     bx,[handle]
  402.     int     21h
  403.  
  404.     pop     ax
  405.  
  406.     pop     es
  407.     pop     bp
  408.     pop     si
  409.     pop     di
  410.     mov     sp,bp
  411.     pop     bp
  412.     RET
  413. _piclen        endp
  414. ;══════════════════════════════════════════════════════════════════════════════
  415. open_header    proc    near
  416.     mov     ah,3dh                  ; oeffnen einer Datei
  417.     mov     al,0
  418.     mov     dx,offset indata
  419.     int     21h
  420.     jc      ofehler
  421.     mov     [handle],ax
  422.     jmp     weiter
  423. ofehler:
  424.     mov     cx,1
  425.     ret                    ; stack noch nicht korrigiert
  426. weiter:
  427.     mov     ah,3fh                  ; lesen einer Datei
  428.     mov     bx,[handle]
  429.     mov     dx,offset bild
  430.     mov     cx,128
  431.     int     21h
  432.     call    read_buffer
  433.     mov     cx,0
  434.     ret
  435. open_header    endp
  436. ;══════════════════════════════════════════════════════════════════════════════
  437. close   proc    near
  438.     mov     ah,3eh                  ; schliessen einer datei
  439.     mov     bx,[handle]
  440.     int     21h
  441.     ret
  442. close   endp
  443. ;══════════════════════════════════════════════════════════════════════════════
  444. make_offsets    proc    near
  445.     mov     zenum,4
  446.     mov     gcounterl,0
  447.     mov     gcounterh,0
  448.     mov     full,0
  449.     mov     bx,offset bild
  450.     add     bx,65
  451.     mov     dl,[bx]
  452.     cmp     dl,4
  453.     jz      mok
  454.     mov     cx,1
  455.     ret
  456. mok:
  457.     mov     bx,offset bild          ; Bild breite und hoehe einstellen
  458.     add     bx,8
  459.     mov     ax,[bx]
  460.     sub     bx,4
  461.     mov     dx,[bx]
  462.     sub     ax,dx
  463.     inc     ax
  464.     inc     ax
  465.     mov     breite,ax
  466.     mov     tbreite,ax
  467.     mov     [blen],ax
  468.  
  469.     add     bx,2
  470.     mov     dx,[bx]
  471.     add     bx,4
  472.     mov     ax,[bx]
  473.     sub     ax,dx
  474.     inc     ax
  475.     mov     hoch,ax
  476.  
  477.     mov     bx,offset bild
  478.     add     bx,66
  479.     mov     dx,[bx]
  480.     mov     bblen,dx
  481.  
  482.     mov     ax,[tbreite]
  483.     dec     ax
  484.     mov     cx,[akt_x]
  485.     sub     cx,ax
  486.     mov     [plen],cx
  487.  
  488.     mov     bx,offset bild        ; bytes pro zeile
  489.     add     bx,66
  490.     mov     ax,[bx]               ; bytes vom bild bleiben gleich
  491.     mov     bx,hoch
  492.     shl     bx,1                  ; 4 wegen bitplanes
  493.     shl     bx,1
  494.     mul     bx                    ; breite mal hoehe
  495.     mov     [bbytesh],dx          ; laenge des bildes in bytes high
  496.     mov     [bbytesl],ax          ; und low
  497.  
  498.     mov     ax,[xpos]
  499.     mov     fencoun1,ax
  500.     mov     xx,ax
  501.     mov     bx,0
  502.     mov     bx,ax
  503.     mov     ax,0
  504.     mov     ax,[akt_x]
  505.  
  506.     mov     cx,0
  507.     mov     cx,[ypos]
  508.     mov     yy,cx
  509.  
  510.     mov     fencoun0,ax
  511.     mov     bx,[akt_x]
  512.     mov     ax,[ypos]
  513.     mul     bx
  514.     add     fencoun1,ax
  515.  
  516.     mov     ax,[fencoun1]
  517.     mov     cl,10
  518.     shr     ax,cl
  519.     mov     lencoun,ax
  520.  
  521.     mov     bx,0
  522.     mov     dx,[fencoun0]           ; erstes segment granularität 64k
  523.     mov     bx,offset buffer
  524.     mov     bpointer,bx
  525.     add     bx,SPEICHER-1
  526.     mov     bpend,bx
  527.  
  528.     ret
  529. make_offsets    endp
  530. ;══════════════════════════════════════════════════════════════════════════════
  531. read_buffer     proc    near
  532.     pusha
  533.  
  534.     mov     ah,3fh                  ; lesen einer Datei
  535.     mov     bx,[handle]
  536.     mov     dx,offset buffer
  537.     mov     [bpointer],dx
  538.     mov     cx,SPEICHER
  539.     int     21h
  540.     jae     r_b_ok
  541.     mov     al,1
  542.     mov     [noread],al
  543. r_b_ok:
  544.     popa
  545.     ret
  546. read_buffer     endp
  547. ;══════════════════════════════════════════════════════════════════════════════
  548. _show_pic     PROC far              ; start ist die Proc, muss bei grossen Programmen far sein
  549.     Push    BP            ; Stack retten
  550.     Mov     BP,SP         ; Stack retten
  551.  
  552.     push    di
  553.     push    si
  554.     push    bp
  555.     push    es
  556.  
  557.     mov     ax,@data
  558.     mov     ds,ax
  559.  
  560.     mov     ax,[bp+6]            ; 1=Ersten parameter lesen
  561.     mov     xpos,ax
  562.  
  563.     mov     ax,[bp+8]            ; 2=Ersten parameter lesen
  564.     mov     ypos,ax
  565.  
  566.     mov     ax,[bp+10]            ; 2=Ersten parameter lesen
  567.     mov     bx,offset stelle
  568.     mov     cl,4
  569.     shl     al,cl
  570.     mov     [bx],ax
  571.  
  572.     mov     ax,[bp+12]
  573.     mov     dx,[bp+14]
  574.     mov     chigh,dx
  575.     mov     clow,ax
  576.  
  577.     call    do_pcx
  578.  
  579.     call    open_header
  580.     cmp     cx,1
  581.     jz      no1fehler
  582.  
  583.     call    make_offsets
  584.     call    farbe
  585.     mov     r,0
  586.     call    do_nprint
  587.     call    close
  588.  
  589.     mov     ax,0
  590.     pop     es
  591.     pop     bp
  592.     pop     si
  593.     pop     di
  594.  
  595.     mov     sp,bp
  596.     pop     bp
  597.     RET
  598. no1fehler:
  599.     mov     ax,1
  600.     pop     es
  601.     pop     bp
  602.     pop     si
  603.     pop     di
  604.  
  605.     mov     sp,bp
  606.     pop     bp
  607.     RET
  608.  
  609. _show_pic        endp
  610. ;══════════════════════════════════════════════════════════════════════════════
  611. _init320400 proc far
  612.  
  613.        ;-- zunächst ganz normal den Modus 13h einstellen, damit das
  614.        ;-- BIOS die meiste Arbeit der Initialisierung übernimmt.
  615.        ;-- Danach die Register verändern, die sich noch nicht in
  616.        ;-- der gewünschten Stellung befinden.
  617.  
  618.        mov   ax,0013h         ;normalen Modus 13h einstellen
  619.        int   10h
  620.  
  621.        mov   dx,GC_INDEX      ;Auftrennung der Speicheradressen
  622.        mov   al,GC_GRAPH_MODE ;im Graphics-Mode-Register des
  623.        out   dx,al            ;Gaphics-Controllers über das
  624.        inc   dx               ;Bit #4 abschalten
  625.        in    al,dx
  626.        and   al,11101111b
  627.        out   dx,al
  628.        dec   dx
  629.  
  630.        mov   al,GC_MISCELL    ;und das Ganze noch einmal im
  631.        out   dx,al            ;Miscellanous-Register über das
  632.        inc   dx               ;Bit #1
  633.        in    al,dx
  634.        and   al,11111101b
  635.        out   dx,al
  636.  
  637.        mov   dx,SC_INDEX      ;das Memory-Mode-Register im
  638.        mov   al,SC_MEM_MODE   ;Sequencer-Controlller dahingehend
  639.        out   dx,al            ;modifizieren, daß keine Auftrennung
  640.        inc   dx               ;der Adressen in verschiedene Bit-
  641.        in    al,dx            ;Planes mehr erfolgt und die aktuelle
  642.        and   al,11110111b     ;Plane über das Bit-Mask-Register
  643.        or    al,4             ;festgelegt wird
  644.        out   dx,al
  645.  
  646.        mov   ax,_vio_seg       ;alle vier Bit-Planes komplett mit
  647.        mov   es,ax            ;dem Farbcode 00h füllen und damit
  648.        xor   di,di            ;den Bildschirm zunächst löschen
  649.        mov   ax,di
  650.        mov   cx,8000h
  651.        rep   stosw
  652.  
  653.        mov   dx,CRTC_INDEX    ;Verdopplung der Punktzeilen im
  654.        mov   al,CC_MAX_SCAN   ;Maximum-Scan-Line-Register des
  655.        out   dx,al            ;CRT-Controllers über das Bit 7
  656.        inc   dx               ;abschalten, gleichzeitig die
  657.        in    al,dx            ;Zeichenhöhe in den Bits 0-4 auf
  658.        and   al,01110000b     ;1 einstellen
  659.        out   dx,al
  660.        dec   dx               ;DX wieder auf das CRT-Index-Reg
  661.  
  662.        mov   al,CC_UNDERLINE  ;Doppelwort-Modus über das Bit 6
  663.        out   dx,al            ;im Underline-Register des CRT-
  664.        inc   dx               ;Controllers abstellen
  665.        in    al,dx
  666.        and   al,10111111b
  667.        out   dx,al
  668.        dec   dx
  669.  
  670.        mov   al,CC_MODE_CTRL  ;über das Bit 6 im Mode-Control-
  671.        out   dx,al            ;Register des CRT-Controllers jetzt
  672.        inc   dx               ;vom Word- in den Byte-Modus wechseln
  673.        in    al,dx
  674.        or    al,01000000b
  675.        out   dx,al
  676.  
  677.        ret                    ;zurück zum Aufrufer
  678. _init320400 endp                  ;Ende der Prozedur
  679.  
  680. ;══════════════════════════════════════════════════════════════════════════════
  681.  
  682. nget_new_zeile   proc    near
  683.     cmp     zenum,4
  684.     jne     nsp222
  685.     mov     bx,offset zeile2
  686.     dec     zenum
  687.     ret
  688. nsp222:
  689.     cmp     zenum,3
  690.     jne     nsp223
  691.     mov     bx,offset zeile3
  692.     dec     zenum
  693.     ret
  694. nsp223:
  695.     cmp     zenum,2
  696.     jne     nsp22
  697.     mov     bx,offset zeile4
  698.     dec     zenum
  699.     ret
  700. nsp22:
  701.     mov     zenum,4
  702.     mov     bx,[bblen]
  703.     shl     bx,1
  704.     shl     bx,1                    ; mal 4 fuer die bitplanes
  705.     add     [gcounterl],bx
  706.     jnb     nsp2                     ; springe wenn carry geloescht
  707.     inc     [gcounterh]
  708. nsp2:
  709.     mov     dx,[gcounterh]
  710.     mov     bx,[bbytesh]
  711.     cmp     dx,bx
  712.     jb      kontrolle
  713.     mov     dx,[gcounterl]          ; anzahl der geschriebenen bytes mit
  714.     mov     bx,[bbytesl]            ; groesse des bildes vergleichen, high + low
  715.     cmp     dx,bx
  716.     jb      kontrolle
  717.     mov     bx,1
  718.     mov     full,bx
  719. kontrolle:
  720.     call    dograf1
  721.     cmp     [r],1                   ; irgendwas mit den Fonts
  722.     jne     nntgnz
  723.     mov     bx,1
  724.     mov     full,bx
  725.     ret                  ; fontfontfont
  726. nntgnz:
  727.     mov     bx,offset zeile1
  728.     ret
  729. nget_new_zeile   endp
  730.  
  731. dograf1         proc    near
  732.     push    cx
  733.     mov    ax,[xpos]
  734.     mov    xx,ax
  735.     mov     cx,[tbreite]
  736.     mov     abreite,cx
  737.     mov     di,[bblen]
  738. n1edog1:
  739.     mov     cx,8
  740. n1eoben1:
  741.     dec     abreite
  742.     jz      n1edog5
  743.     xor     ax,ax
  744.     shl     [zeile1+di],1
  745.     jae     n1eno_bit1
  746.     or      al,00000001b
  747. n1eno_bit1:
  748.     shl     [zeile2+di],1
  749.     jae     n1eno_bit2
  750.     or      al,00000010b
  751. n1eno_bit2:
  752.     shl     [zeile3+di],1
  753.     jae     n1eno_bit3
  754.     or      al,00000100b
  755. n1eno_bit3:
  756.     shl     [zeile4+di],1
  757.     jae     n1eno_bit4
  758.     or      al,00001000b
  759. n1eno_bit4:
  760.     or      al,[stelle+0]
  761.  
  762.     mov     color,al
  763.  
  764.        push  di               ;DI auf dem Stack sichern
  765.        push     cx
  766.  
  767.        mov   ax,PIXX / 4      ;Offset in den Video-RAM berechnen
  768.        mul   [yy]         ;und nach DI laden
  769.        mov   cx,[xx]
  770.        mov   bx,cx
  771.        shr   bx,1
  772.        shr   bx,1
  773.        add   ax,bx
  774.        mov   di,ax
  775.  
  776.        and   cl,3             ;Bit-Maske für die zu adressierende
  777.        mov   ah,1             ;Map in AH berechnen
  778.        shl   ah,cl
  779.        mov   al,SC_MAP_MASK   ;nach AL die Registernummer
  780.        mov   dx,SC_INDEX      ;Indexadresse des Sequencers laden
  781.        out   dx,ax            ;Bit-Mask-Register laden
  782.  
  783.        mov   ax,_vio_seg       ;ES auf den Video-RAM setzen
  784.        mov   es,ax
  785.        mov   al,byte ptr [color]  ;Farbe des Punktes laden
  786.        stosb                  ;und in die gewählte Bit-Map schreiben
  787.        pop     cx
  788.        pop   di               ;Register wieder vom Stack holen
  789.  
  790.     inc     xx
  791. n1gooom:
  792.     loop    n1eoben1
  793.     dec     di
  794.     jne     n1edog1
  795. n1edog5:
  796.     inc    yy
  797.     pop     cx
  798.     ret
  799. dograf1         endp
  800.  
  801. ;══════════════════════════════════════════════════════════════════════════════
  802. do_nprint        proc    near
  803.     cmp     [r],1
  804.     jne     norr
  805.     mov     es,[fonthandle]
  806. norr:
  807.     mov     si,[bblen]
  808.     mov     bx,offset zeile1
  809. ntill_EOF:                               ; aeussere schleife, spaeter bis eof
  810.     call    get_decrunch            ; zaehler und wert holen, nach cx,al
  811. nspread:                                 ; decrunch-schleife
  812.     mov     byte ptr ds:[bx+si],al
  813.     dec     si
  814.     jne     nnozeilenende
  815.     mov     si,[bblen]
  816.     call    nget_new_zeile
  817. nnozeilenende:
  818.     loop    nspread
  819.     cmp     full,1
  820.     jne     ntill_EOF
  821.     ret
  822. do_nprint        endp
  823. ;══════════════════════════════════════════════════════════════════════════════
  824. do_pcx proc    near
  825.     mov     es,dx
  826.     mov     bx,offset indata
  827.     mov     dx,bx
  828.     mov     bx,[clow]
  829.     mov     di,bx
  830. sshl2:
  831.     mov     bx,di
  832.     mov     al,es:[bx]
  833.     inc     di
  834.     mov     bx,dx
  835.     mov     [bx],al
  836.     inc     dx
  837.     or      al,al
  838.     jne     sshl2
  839.     dec     dx
  840.     mov     bx,dx
  841.     mov     byte ptr [bx],"."
  842.     inc     bx
  843.     mov     byte ptr [bx],"p"
  844.     inc     bx
  845.     mov     byte ptr [bx],"c"
  846.     inc     bx
  847.     mov     byte ptr [bx],"x"
  848.     inc     bx
  849.     mov     byte ptr [bx],0
  850.     ret
  851. do_pcx  endp
  852.  
  853. farbe2   proc    near
  854.     mov     ah,42h
  855.     mov     al,2
  856.     mov     cx,-1
  857.     mov     dx,-768
  858.     mov     bx,[handle]
  859.     int     21h
  860.     mov     ah,3fh
  861.     mov     bx,[handle]
  862.     mov     cx,768
  863.     mov     dx,offset fab2
  864.     int     21h
  865.     call    shift2_col
  866.     mov     bx,offset fab2         ; und ganz normal weitermachen
  867.     mov     ax,ds
  868.     mov     es,ax
  869.     mov     dx,bx
  870.     mov     cx,256
  871.     mov     bx,0
  872.     mov     al,12h
  873.     mov     ah,10h
  874.     int     10h
  875.     mov     ah,42h
  876.     mov     al,0
  877.     mov     cx,0
  878.     mov     dx,50128
  879.     mov     bx,[handle]
  880.     int     21h
  881.     ret
  882. farbe2   endp
  883. shift2_col       proc    near
  884.     call    test2_change
  885.     cmp     cx,0
  886.     jz      sc22
  887.     mov     bx,offset fab2
  888.     mov     cx,768
  889. sc21:
  890.     mov     al,[bx]
  891.     push    cx
  892.     mov     cl,1
  893.     shr     al,cl
  894.     shr     al,cl
  895.     mov     [bx],al
  896.     inc     bx
  897.     pop     cx
  898.     loop    sc21
  899. sc22:
  900.     ret
  901. shift2_col       endp
  902. test2_change     proc    near  ; 0 oder 1 nach cx, 1 muss gechanged werden
  903.     mov     cx,768
  904.     mov     bx,offset fab2
  905. tc21:
  906.     mov     al,[bx]
  907.     cmp     al,00111111b
  908.     jae     tc22
  909.     inc     bx
  910.     loop    tc21
  911. tc22:
  912.     ret
  913. test2_change     endp
  914.  
  915. _get_kkey   PROC FAR
  916.     mov     ax,0100h
  917.     int     16h
  918.     jne     gg_zeida
  919.     mov    ax,0
  920.     ret
  921. gg_zeida:
  922.     mov     ax,0
  923.     int     16h
  924.     cmp    al,0
  925.     jne    gg_out
  926.     mov    al,ah
  927. gg_out:
  928.     RET
  929. _get_kkey    endp
  930.  
  931. _copybuf2plane proc far
  932.  
  933. sfr0    struc                  ;Struktur zum Zugriff auf den Stack
  934. bp0        dw ?                   ;nimmt BP auf
  935. ret_adr0   dd ?                   ;Rücksprungadresse zum Aufrufer
  936. bufptrl0   dd ?                   ;Zeiger auf Puffer
  937. nachpage   dw ?                   ;nach Seite
  938. nachx      dw ?                   ;nach X-Ordinate
  939. nachy      dw ?                   ;nach Y-Ordinate
  940. breite0    dw ?                   ;Breite
  941. hoehe0     dw ?                   ;Höhe des Bereichs
  942. bg         dw ?                   ;Hintergrund beachten
  943. hinter     dw ?                   ;Hintergrund beachten
  944. sfr0    ends                   ;Ende der Struktur
  945.  
  946. fr         equ [ bp - bp0 ]          ;adr. die Elemente der Struktur
  947. bfr        equ byte ptr [ bp - bp0 ] ;adr. Stack-Element als Byte
  948.  
  949.        push  bp               ;Adressierung der Parameter über
  950.        mov   bp,sp            ;das BP-Register vorbereiten
  951.        push  di
  952.        push  si
  953.  
  954.        ;-- Segmentadresse für Zugriff auf Video-RAM berechnen ------
  955.  
  956.        mov   ah,0A0h          ;ES auf Anfang NACH-Seite
  957.        cmp   bfr.nachpage,0   ;ist es Seite 0?
  958.        je    cv0              ;Ja, AL schon o.k
  959.  
  960.        mov   ah,0A8h          ;Nein, Seite 1 bei A800h
  961.  
  962. cv0:       xor   al,al            ;Lo-Byte ist immer Null
  963.        mov   es,ax
  964.  
  965.        ;-- Offset für Zielposition in Page berechnen ---------------
  966.  
  967.        mov   ax,PIXX / 4      ;DI auf Zielposition NACH
  968.        mul   fr.nachy
  969.        mov   di,fr.nachx
  970.        mov   cx,di            ;X-Koordinate für Plane-Berechnung
  971.        shr   di,1             ;merken
  972.        shr   di,1
  973.        add   di,ax
  974.  
  975.        ;-- die zu adressierende Bit-Plane einstellen ---------------
  976.  
  977.        mov   ah,1             ;Plane-Nummer muß als Bit-Maske vorl.
  978.        and   cl,3             ;Plane-Nummer berechnen
  979.        shl   ah,cl
  980.        mov   dx,SC_INDEX      ;Zugriff auf die zu bearbeitende
  981.        mov   al,SC_MAP_MASK   ;Bit-Plane sichern
  982.        out   dx,ax
  983.  
  984.        ;-- Zähler für die Kopierschleife laden ---------------------
  985.  
  986.        mov   dh,bfr.hoehe0    ;DH = zeilen
  987.        mov   dl,bfr.breite0   ;DL = Bytes
  988.        mov   bx,PIXX / 4      ;BX als Offset zur nächsten zeile
  989.        sub   bl,dl
  990.        xor   ch,ch            ;Hi-Byte des Counters ist immer 0
  991.  
  992.        push    ds
  993.        ;mov   si,fr.bufptr0    ;DS:SI auf den Puffer setzen
  994.        lds      si,fr.bufptrl0
  995.  
  996.        cmp   bfr.bg,0         ;kein Hintergrund beachten?
  997.        jne   cv2              ;doch, andere Kopierroutine
  998.  
  999.        ;-- Kopierroutine für eine Bit-Plane, ohne Berücksichti- ----
  1000.        ;-- gung des Hintergrundes
  1001.  
  1002. cv1:       mov   cl,dl            ;Anzahl Bytes nach CL
  1003.  
  1004.        rep movsb              ;zeile kopieren
  1005.        add   di,bx            ;DI in nächste zeile
  1006.        dec   dh               ;noch eine zeile?
  1007.        jne   cv1              ;Ja ---> weiter
  1008.  
  1009.        jmp   short cvend      ;Nein, Puffer volständig kopiert
  1010.  
  1011.        ;-- Kopierroutine für individuelle Bit-Planes unter Auswer- -
  1012.        ;-- tung des übergebenen Puffers
  1013.  
  1014. cv2:       mov   cl,dl            ;Anzahl Bytes nach CL
  1015.  
  1016. cv3:       lodsb                  ;Byte aus Puffer laden
  1017.        cmp   al,bfr.hinter ;255           ;Hintergrund-Byte?
  1018.        je    cv5              ;Ja ---> nicht mitkopieren
  1019.        stosb                  ;Nein, im Video-RAM ablegen
  1020.        loop  cv3              ;nächstes Byte bearbeiten
  1021.  
  1022. cv4:       ;-- Zeiger auf Video-RAM in die nächste zeile schalten -----
  1023.  
  1024.        add   di,bx            ;DI in nächste zeile
  1025.        dec   dh               ;noch eine zeile?
  1026.        jne   cv2              ;Ja ---> weiter
  1027.        jmp   short cvend      ;Nein, Puffer volständig kopiert
  1028.  
  1029. cv5:       ;-- Hintergrund-Byte, nicht mitkopieren ---------------------
  1030.  
  1031.        inc   di               ;dieses Byte im VRAM nicht beschr.
  1032.        loop  cv3              ;noch ein Byte in dieser zeile?
  1033.        jmp   cv4              ;Nein ---> nächste zeile bearbeiten
  1034.  
  1035. cvend:
  1036.        pop    ds
  1037.        pop   si               ;Register wieder vom Stack holen
  1038.        pop   di
  1039.        pop   bp
  1040.        ret                    ;zurück zum Aufrufer
  1041.  
  1042. _copybuf2plane endp
  1043.  
  1044. ;-----------------------------------------------------------------------
  1045. ;-- CopyPlane2Buf: Kopiert ein rechtecikgen Teil aus einer Bit-Plane in
  1046. ;--                einen Puffer
  1047. ;-- DeklAufruf von TP: CopyPlane2Buf( byte *bufptr,
  1048. ;--                                   byte vonpage,
  1049. ;--                                   int  vonx,
  1050. ;--                                   int  vony,
  1051. ;--                                   byte breite,
  1052. ;--                                   byte hoehe );
  1053.  
  1054. _copyplane2buf proc far
  1055.  
  1056. sfr1    struc                  ;Struktur zum Zugriff auf den Stack
  1057. bp1        dw ?                   ;nimmt BP auf
  1058. ret_adr1   dd ?                   ;Rücksprungadresse zum Aufrufer
  1059. bufptrl1   dd ?                   ;Zeiger auf Puffer
  1060. vonpage    dw ?                   ;von Seite
  1061. vonx       dw ?                   ;von X-Ordinate
  1062. vony       dw ?                   ;von Y-Ordinate
  1063. breite1    dw ?                   ;Breite des Bereichs in Punkten
  1064. hoehe1     dw ?                   ;Höhe des Bereichs in Punktzeilen
  1065. sfr1    ends                   ;Ende der Struktur
  1066.  
  1067. fr         equ [ bp - bp1 ]          ;adr. die Elemente der Struktur
  1068. bfr        equ byte ptr [ bp - bp1 ] ;adr. Stack-Element als Byte
  1069.  
  1070.        push  bp               ;Adressierung der Parameter über
  1071.        mov   bp,sp            ;das BP-Register vorbereiten
  1072.        push  di
  1073.        push  si
  1074.        push  ds               ;DS sichern
  1075.  
  1076.        ;-- Segmentadresse für Zugriff auf Video-RAM berechnen ------
  1077.  
  1078.        mov   ah,0A0h          ;ES auf Anfang VON-Seite
  1079.        cmp   bfr.vonpage,0    ;ist es Seite 0?
  1080.        je    cc0              ;Ja, AL schon o.k
  1081.  
  1082.        mov   ah,0A8h          ;Nein, Seite 1 bei A800h
  1083.  
  1084. cc0:       xor   al,al            ;Lo-Byte ist immer Null
  1085.        mov   ds,ax
  1086.  
  1087.        ;-- Offset in die auszulesende Seite bilden -----------------
  1088.  
  1089.        mov   ax,PIXX / 4      ;SI auf Zielposition VON
  1090.        mul   fr.vony
  1091.        mov   si,fr.vonx
  1092.        mov   cx,si            ;Koordinate auch in CX merken
  1093.        shr   si,1
  1094.        shr   si,1
  1095.        add   si,ax
  1096.  
  1097.        ;-- die zu adressierende Bit-Plane einstellen ---------------
  1098.  
  1099.        and   cl,3             ;Bit-Maske für die zu adressierende
  1100.        mov   ah,cl            ;Map in AH berechnen
  1101.        mov   al,GC_READ_MAP   ;nach AL die Registernummer
  1102.        mov   dx,GC_INDEX      ;Indexadresse des Graphic-Ctrl laden
  1103.        out   dx,ax            ;Read-Map-Register laden
  1104.  
  1105.        ;-- Zähler für die Kopierschleife laden ---------------------
  1106.  
  1107.        mov   dh,bfr.hoehe1    ;DH = zeilen
  1108.        mov   dl,bfr.breite1   ;DL = Bytes
  1109.        mov   bx,PIXX / 4      ;BX als Offset zur nächsten zeile
  1110.        sub   bl,dl
  1111.        xor   ch,ch            ;Hi-Byte des Counters ist immer 0
  1112.  
  1113.        les    di,fr.bufptrl1
  1114.  
  1115.        ;-- Kopierroutine für eine Bit-Plane, ohne Berücksichti- ----
  1116.        ;-- gung des Hintergrundes
  1117.  
  1118. cc1:       mov   cl,dl            ;Anzahl Bytes nach CL
  1119.  
  1120.        rep   movsb              ;zeile kopieren
  1121.        add   si,bx            ;SI in nächste zeile
  1122.        dec   dh               ;noch eine zeile?
  1123.        jne   cc1              ;Ja, weiter
  1124.  
  1125.        pop   ds               ;DS zurückholen
  1126.        pop   si
  1127.        pop   di
  1128.        pop   bp
  1129.  
  1130.        ret                    ;zurück zum Aufurfer
  1131. _copyplane2buf endp
  1132.  
  1133.  
  1134. _cpscr2buf proc far
  1135.  
  1136. sfr1    struc                  ;Struktur zum Zugriff auf den Stack
  1137. bp1        dw ?                   ;nimmt BP auf
  1138. ret_adr1   dd ?                   ;Rücksprungadresse zum Aufrufer
  1139. bufptrl1   dd ?                   ;Zeiger auf Puffer
  1140. vonpage    dw ?                   ;von Seite
  1141. vonx       dw ?                   ;von X-Ordinate
  1142. vony       dw ?                   ;von Y-Ordinate
  1143. breite1    dw ?                   ;Breite des Bereichs in Punkten
  1144. hoehe1     dw ?                   ;Höhe des Bereichs in Punktzeilen
  1145. sfr1    ends                   ;Ende der Struktur
  1146.  
  1147. fr         equ [ bp - bp1 ]          ;adr. die Elemente der Struktur
  1148. bfr        equ byte ptr [ bp - bp1 ] ;adr. Stack-Element als Byte
  1149.  
  1150.        push  bp               ;Adressierung der Parameter über
  1151.        mov   bp,sp            ;das BP-Register vorbereiten
  1152.        push  di
  1153.        push  si
  1154.        push  ds               ;DS sichern
  1155.  
  1156.        ;-- Segmentadresse für Zugriff auf Video-RAM berechnen ------
  1157.  
  1158.        mov   ah,0A0h          ;ES auf Anfang VON-Seite
  1159.        cmp   bfr.vonpage,0    ;ist es Seite 0?
  1160.        je    cpc0             ;Ja, AL schon o.k
  1161.  
  1162.        mov   ah,0A8h          ;Nein, Seite 1 bei A800h
  1163.  
  1164. cpc0:      xor   al,al            ;Lo-Byte ist immer Null
  1165.        mov   ds,ax
  1166.  
  1167.        ;-- Offset in die auszulesende Seite bilden -----------------
  1168.  
  1169.        mov   ax,PIXX / 4      ;SI auf Zielposition VON
  1170.        mul   fr.vony
  1171.        mov   si,fr.vonx
  1172.        mov   cx,si            ;Koordinate auch in CX merken
  1173.        shr   si,1
  1174.        shr   si,1
  1175.        add   si,ax
  1176.  
  1177.        ;-- die zu adressierende Bit-Plane einstellen ---------------
  1178.  
  1179.        and   cl,3             ;Bit-Maske für die zu adressierende
  1180.        mov   ah,cl            ;Map in AH berechnen
  1181.        mov   al,GC_READ_MAP   ;nach AL die Registernummer
  1182.        mov   dx,GC_INDEX      ;Indexadresse des Graphic-Ctrl laden
  1183.        out   dx,ax            ;Read-Map-Register laden
  1184.  
  1185.        ;-- Zähler für die Kopierschleife laden ---------------------
  1186.  
  1187.        mov   dx,fr.hoehe1    ;DH = zeilen
  1188.  
  1189.        les    di,fr.bufptrl1
  1190.  
  1191.        ;-- Kopierroutine für eine Bit-Plane, ohne Berücksichti- ----
  1192.        ;-- gung des Hintergrundes
  1193.  
  1194. cpc1:
  1195.        mov   cx,fr.breite1    ;Dx = Bytes
  1196.        ;mov   cl,dl           ;Anzahl Bytes nach CL
  1197.  
  1198.        rep movsb              ;zeile kopieren
  1199.        dec   dx               ;noch eine zeile?
  1200.        jne   cpc1             ;Ja, weiter
  1201.  
  1202.        pop   ds               ;DS zurückholen
  1203.        pop   si
  1204.        pop   di
  1205.        pop   bp
  1206.  
  1207.        ret                    ;zurück zum Aufurfer
  1208. _cpscr2buf endp
  1209.  
  1210. _cpbuf2scr proc far
  1211.  
  1212. sfr0    struc                  ;Struktur zum Zugriff auf den Stack
  1213. bp0        dw ?                   ;nimmt BP auf
  1214. ret_adr0   dd ?                   ;Rücksprungadresse zum Aufrufer
  1215. bufptrl0   dd ?                   ;Zeiger auf Puffer
  1216. nachpage   dw ?                   ;nach Seite
  1217. nachx      dw ?                   ;nach X-Ordinate
  1218. nachy      dw ?                   ;nach Y-Ordinate
  1219. breite0    dw ?                   ;Breite
  1220. hoehe0     dw ?                   ;Höhe des Bereichs
  1221. sfr0    ends                   ;Ende der Struktur
  1222.  
  1223. fr         equ [ bp - bp0 ]          ;adr. die Elemente der Struktur
  1224. bfr        equ byte ptr [ bp - bp0 ] ;adr. Stack-Element als Byte
  1225.  
  1226.        push  bp               ;Adressierung der Parameter über
  1227.        mov   bp,sp            ;das BP-Register vorbereiten
  1228.        push  di
  1229.        push  si
  1230.  
  1231.        ;-- Segmentadresse für Zugriff auf Video-RAM berechnen ------
  1232.  
  1233.        mov   ah,0A0h          ;ES auf Anfang NACH-Seite
  1234.        cmp   bfr.nachpage,0   ;ist es Seite 0?
  1235.        je    cbv0              ;Ja, AL schon o.k
  1236.  
  1237.        mov   ah,0A8h          ;Nein, Seite 1 bei A800h
  1238.  
  1239. cbv0:       xor   al,al            ;Lo-Byte ist immer Null
  1240.        mov   es,ax
  1241.  
  1242.        ;-- Offset für Zielposition in Page berechnen ---------------
  1243.  
  1244.        mov   ax,PIXX / 4      ;DI auf Zielposition NACH
  1245.        mul   fr.nachy
  1246.        mov   di,fr.nachx
  1247.        mov   cx,di            ;X-Koordinate für Plane-Berechnung
  1248.        shr   di,1             ;merken
  1249.        shr   di,1
  1250.        add   di,ax
  1251.  
  1252.        ;-- die zu adressierende Bit-Plane einstellen ---------------
  1253.  
  1254.        mov   ah,1             ;Plane-Nummer muß als Bit-Maske vorl.
  1255.        and   cl,3             ;Plane-Nummer berechnen
  1256.        shl   ah,cl
  1257.        mov   dx,SC_INDEX      ;Zugriff auf die zu bearbeitende
  1258.        mov   al,SC_MAP_MASK   ;Bit-Plane sichern
  1259.        out   dx,ax
  1260.  
  1261.        ;-- Zähler für die Kopierschleife laden ---------------------
  1262.  
  1263.        mov   dx,fr.hoehe0    ;DH = zeilen
  1264.  
  1265.        push    ds
  1266.        lds      si,fr.bufptrl0
  1267.  
  1268.        ;-- Kopierroutine für eine Bit-Plane, ohne Berücksichti- ----
  1269.        ;-- gung des Hintergrundes
  1270.  
  1271. cbv1:      ;mov   cl,dl           ;Anzahl Bytes nach CL
  1272.        mov   cx,fr.breite0    ;DL = Bytes
  1273.  
  1274.        rep   movsb              ;zeile kopieren
  1275.        dec   dx               ;noch eine zeile?
  1276.        jne   cbv1              ;Ja ---> weiter
  1277.  
  1278.        ;-- Kopierroutine für individuelle Bit-Planes unter Auswer- -
  1279.        ;-- tung des übergebenen Puffers
  1280.  
  1281.        pop    ds
  1282.        pop   si               ;Register wieder vom Stack holen
  1283.        pop   di
  1284.        pop   bp
  1285.        ret                    ;zurück zum Aufrufer
  1286.  
  1287. _cpbuf2scr endp
  1288.  
  1289. _cpback2scr proc far
  1290. sfr0    struc                  ;Struktur zum Zugriff auf den Stack
  1291. bp0        dw ?                   ;nimmt BP auf
  1292. ret_adr0   dd ?                   ;Rücksprungadresse zum Aufrufer
  1293. b_seite    dw ?                   ;nach Seite
  1294. Back       dd ?                   ;Zeiger auf Puffer
  1295. b_x        dw ?                   ;nach X-Ordinate
  1296. b_y        dw ?                   ;nach Y-Ordinate
  1297. b_breite   dw ?                   ;Breite
  1298. b_hoehe    dw ?                   ;Höhe des Bereichs
  1299. sfr0    ends                   ;Ende der Struktur
  1300.  
  1301. fr         equ [ bp - bp0 ]          ;adr. die Elemente der Struktur
  1302. bfr        equ byte ptr [ bp - bp0 ] ;adr. Stack-Element als Byte
  1303.  
  1304.        push  bp               ;Adressierung der Parameter über
  1305.        mov   bp,sp            ;das BP-Register vorbereiten
  1306.        push  di
  1307.        push  si
  1308.        push     ds
  1309.  
  1310.        ;-- Segmentadresse für Zugriff auf Video-RAM berechnen ------
  1311.  
  1312.        mov   ah,0A0h          ;ES auf Anfang NACH-Seite
  1313.        cmp   bfr.b_seite,0    ;ist es Seite 0?
  1314.        je    b_cv0            ;Ja, AL schon o.k
  1315.  
  1316.        mov   ah,0A8h          ;Nein, Seite 1 bei A800h
  1317.  
  1318. b_cv0:     xor   al,al            ;Lo-Byte ist immer Null
  1319.        mov   es,ax
  1320.  
  1321.        ;-- Offset für Zielposition in Page berechnen ---------------
  1322.  
  1323.        mov   ax,PIXX / 4      ;DI auf Zielposition NACH
  1324.        mov     di,fr.b_y
  1325.        mul   fr.b_y
  1326.        mov   di,fr.b_x
  1327.        mov   cx,di            ;X-Koordinate für Plane-Berechnung
  1328.        shr   di,1             ;merken
  1329.        shr   di,1
  1330.        add   di,ax
  1331.  
  1332.        ;-- die zu adressierende Bit-Plane einstellen ---------------
  1333.  
  1334.        mov   ah,1             ;Plane-Nummer muß als Bit-Maske vorl.
  1335.        and   cl,3             ;Plane-Nummer berechnen
  1336.        shl   ah,cl
  1337.        mov   dx,SC_INDEX      ;Zugriff auf die zu bearbeitende
  1338.        mov   al,SC_MAP_MASK   ;Bit-Plane sichern
  1339.        out   dx,ax
  1340.  
  1341.        mov   ax,PIXX/4        ;SI auf Zielposition VON
  1342.        mul   fr.b_y
  1343.        mov   si,fr.b_x
  1344.        shr   si,1
  1345.        shr   si,1
  1346.        add   ax,si
  1347.        lds   si,fr.Back
  1348.        add     si,ax
  1349.  
  1350.        ;-- Zähler für die Kopierschleife laden ---------------------
  1351.  
  1352.        mov   dh,bfr.b_hoehe     ;DH = zeilen
  1353.        mov   dl,bfr.b_breite    ;DL = Bytes
  1354.        mov   bx,PIXX / 4      ;BX als Offset zur nächsten zeile
  1355.        sub   bl,dl
  1356.        xor   ch,ch            ;Hi-Byte des Counters ist immer 0
  1357.  
  1358.        ;-- Kopierroutine für eine Bit-Plane, ohne Berücksichti- ----
  1359.        ;-- gung des Hintergrundes
  1360.  
  1361. cpbbc1:    mov   cl,dl            ;Anzahl Bytes nach CL
  1362.  
  1363.        rep   movsb             ;zeile kopieren
  1364.        add   si,bx             ;SI in nächste zeile
  1365.        add   di,bx             ;SI in nächste zeile
  1366.        dec   dh                ;noch eine zeile?
  1367.        jne   cpbbc1            ;Ja, weiter
  1368.  
  1369.  
  1370.        pop     ds
  1371.        pop   si               ;Register wieder vom Stack holen
  1372.        pop   di
  1373.        pop   bp
  1374.        ret                    ;zurück zum Aufrufer
  1375. _cpback2scr endp
  1376.  
  1377. _cpbuf2back proc far
  1378.  
  1379. sfr0    struc                  ;Struktur zum Zugriff auf den Stack
  1380. bp0        dw ?                   ;nimmt BP auf
  1381. ret_adr0   dd ?                   ;Rücksprungadresse zum Aufrufer
  1382. back_ptr   dd ?
  1383. buf_ptr    dd ?                   ;Zeiger auf Puffer
  1384. bb_x       dw ?                   ;nach X-Ordinate
  1385. bb_y       dw ?                   ;nach Y-Ordinate
  1386. bb_breite  dw ?                   ;Breite
  1387. bb_hoehe   dw ?                   ;Höhe des Bereichs
  1388. sfr0    ends                   ;Ende der Struktur
  1389.  
  1390. fr         equ [ bp - bp0 ]          ;adr. die Elemente der Struktur
  1391. bfr        equ byte ptr [ bp - bp0 ] ;adr. Stack-Element als Byte
  1392.  
  1393.        push  bp               ;Adressierung der Parameter über
  1394.        mov   bp,sp            ;das BP-Register vorbereiten
  1395.        push  di
  1396.        push  si
  1397.  
  1398.        mov   ax,PIXX/4        ;SI auf Zielposition VON
  1399.        mul   fr.bb_y
  1400.        mov   di,fr.bb_x
  1401.        shr   di,1
  1402.        shr   di,1
  1403.        add   ax,di
  1404.        les   di,fr.back_ptr
  1405.        add     di,ax
  1406.  
  1407.        ;-- Zähler für die Kopierschleife laden ---------------------
  1408.  
  1409.        mov   dh,bfr.bb_hoehe  ;DH = zeilen
  1410.        mov   dl,bfr.bb_breite ;DL = Bytes
  1411.        mov   bx,PIXX / 4      ;BX als Offset zur nächsten zeile
  1412.        sub   bl,dl
  1413.        xor   ch,ch            ;Hi-Byte des Counters ist immer 0
  1414.  
  1415.        push    ds
  1416.  
  1417.        lds      si,fr.buf_ptr
  1418.  
  1419.        ;-- Kopierroutine für eine Bit-Plane, ohne Berücksichti- ----
  1420.        ;-- gung des Hintergrundes
  1421.  
  1422. cbbv1:     mov   cl,dl            ;Anzahl Bytes nach CL
  1423.  
  1424.        rep   movsb            ;zeile kopieren
  1425.        add   di,bx            ;DI in nächste zeile
  1426.        dec   dh               ;noch eine zeile?
  1427.        jne   cbbv1            ;Ja ---> weiter
  1428.  
  1429.  
  1430.        pop     ds
  1431.        pop   si               ;Register wieder vom Stack holen
  1432.        pop   di
  1433.        pop   bp
  1434.        ret                    ;zurück zum Aufrufer
  1435.  
  1436. _cpbuf2back endp
  1437.  
  1438. _stick   proc    far
  1439.  
  1440. ; Es wird davon ausgegangen, dass Joystick angeschlossen ist,
  1441. ; sollte keiner angeschlossen werden, verfaengt sich die Routine in eine
  1442. ; Endlosschleife ...
  1443. ; Funktion fuer Joystick 1 !!!
  1444.  
  1445. sfr0    struc                  ;Struktur zum Zugriff auf den Stack
  1446. bp0        dw ?                ;nimmt BP auf
  1447. ret_adr0   dd ?                ;Rücksprungadresse zum Aufrufer
  1448. j_x        dd ?
  1449. j_y        dd ?
  1450. sfr0    ends                   ;Ende der Struktur
  1451.  
  1452. fr      equ [ bp - bp0 ]          ;adr. die Elemente der Struktur
  1453. bfr     equ byte ptr [ bp - bp0 ] ;adr. Stack-Element als Byte
  1454.  
  1455.     push    bp               ;Adressierung der Parameter über
  1456.     mov     bp,sp            ;das BP-Register vorbereiten
  1457.     push    di
  1458.  
  1459.     mov     xx,0
  1460.     mov     yy,0
  1461.  
  1462.     mov     dx,201h         ; Portadresse bei AT's des Gameportes
  1463.     out     dx,al           ; irgendwas dahin schicken, um Kippstufe zu starten
  1464.     jmp     short check_1
  1465. x_inc:
  1466.     inc     xx
  1467.     test    al,02h          ; Bit 2 ist Y Pos von Joy 1
  1468.     jz      check_1
  1469. y_inc:
  1470.     inc     yy
  1471. check_1:
  1472.     in      al,dx           ; Status des Portes lesen
  1473.     test    al,01h          ; Bit 1 ist X Pos von Joy 1
  1474.     jnz      x_inc
  1475.     test    al,02h          ; Bit 2 ist Y Pos von Joy 1
  1476.     jnz      y_inc
  1477.  
  1478.     les     di,fr.j_x
  1479.     mov    ax,[xx]
  1480.     mov     es:[di],ax
  1481.  
  1482.     mov    ax,[yy]
  1483.  
  1484.     les     di,fr.j_y
  1485.     mov     es:[di],ax
  1486.  
  1487.     pop     di
  1488.     pop     bp
  1489.     ret                    ;zurück zum Aufrufer
  1490. _stick   endp
  1491. ;SYNC_DISPLAY
  1492. ;============
  1493. ;
  1494. ; Pauses the computer until the next Vertical Retrace starts
  1495. ;
  1496. ; ENTRY: No Parameters are passed
  1497. ;
  1498. ; EXIT:  No meaningful values returned
  1499. ;
  1500.  
  1501. _SYNC_DISPLAY    PROC    FAR
  1502.  
  1503.     MOV     DX, INPUT_1         ; Input Status #1 Register
  1504.  
  1505.     ; Wait for any current retrace to end
  1506.  
  1507. @SD_WAIT0:
  1508.     IN      AL, DX              ; Get VGA status
  1509.     AND     AL, VERT_RETRACE    ; In Display mode yet?
  1510.     JNZ     @SD_WAIT0           ; If Not, wait for it
  1511.  
  1512.     ; Wait for the start of the next vertical retrace
  1513.  
  1514. @SD_WAIT1:
  1515.     IN      AL, DX              ; Get VGA status
  1516.     AND     AL, VERT_RETRACE    ; Vertical Retrace Start?
  1517.     JZ      @SD_WAIT1           ; If Not, wait for it
  1518.  
  1519.     RET                         ; Exit & Clean Up Stack
  1520.  
  1521. _SYNC_DISPLAY    ENDP
  1522.  
  1523.     end
  1524.  
  1525.  
  1526.