home *** CD-ROM | disk | FTP | other *** search
/ GEMini Atari / GEMini_Atari_CD-ROM_Walnut_Creek_December_1993.iso / files / utility / overscn3 / overscan.s < prev    next >
Encoding:
Text File  |  1989-07-07  |  79.6 KB  |  1,868 lines

  1. ;----------------------------------------------------;
  2. ;                                                    ;
  3. ;      OVERSCAN.S       Version 1.6                  ;
  4. ;      Bernd Gebauer   ,Berlin 31.05.89              ;
  5. ;      Karsten Isakovic,Berlin 07.07.89              ;
  6. ;                                                    ;
  7. ;  RAMTOS 1.4 / BETATOS / ROMTOS 1.4 / BLITTER TOS   ;
  8. ; -------------------------------------------------  ;
  9. ;                                                    ;
  10. ;      GFA-Assembler 1.2                             ;
  11. ;                                                    ;
  12. ;----------------------------------------------------;
  13.  
  14.  
  15. ; ------------ NEGATIVE LINE-A VARIABLEN -------------
  16.  
  17. M_POS_HX       = -$358
  18. WKXRez         = -$2b4
  19. WKYRez         = -$2b2
  20. CUR_X          = -$158
  21. CUR_Y          = -$156
  22. CUR_FLAG       = -$154
  23. MOUSE_FLAG     = -$153
  24. SAVE_LEN       = -$14a
  25. v_cel_ht       = -$2e
  26. v_cel_mx       = -$2c
  27. v_cel_my       = -$2a
  28. v_cel_wr       = -$28
  29. v_cur_add      = -$22
  30. v_cur_of       = -$1e
  31. v_cur_x        = -$1c
  32. v_cur_y        = -$1a
  33. v_rez_hz       = -$c
  34. v_rez_vt       = -4
  35. bytes_lin      = -2
  36. ; ---------- LINE-A VARIABLEN ------------------------
  37.  
  38. v_planes       = 0
  39. width          = 2
  40. col_bit0       = $18
  41. col_bit1       = $1a
  42. col_bit2       = $1c
  43. col_bit3       = $1e
  44. lstlin         = $20
  45. lnmask         = $22
  46. wmode          = $24
  47. x1             = $26
  48. y1             = $28
  49. x2             = $2a
  50. y2             = $2c
  51. patptr         = $2e
  52. patmsk         = $32
  53. mfill          = $34
  54. clip           = $36
  55.  
  56. ; ----------------- HARDWARE + TOS -------------------
  57.  
  58. gemdos         = 1
  59. bios           = 13
  60. xbios          = 14
  61. Pterm0         = 0       ; Gemdos
  62. Cconin         = 1       ; Gemdos
  63. Cnecin         = 8       ; Gemdos
  64. Cconws         = 9       ; Gemdos
  65. Dgetdrv        = 25      ; Gemdos
  66. Ptermres       = 49      ; Gemdos
  67. Fopen          = 61      ; Gemdos
  68. Fclose         = 62      ; Gemdos
  69. Fwrite         = 64      ; Gemdos
  70. Fseek          = 66      ; Gemdos
  71. Pterm          = 76      ; Gemdos
  72. Kbshift        = 11      ; bios
  73. Physbase       = 2       ; xbios
  74. Setscreen      = 5       ; xbios
  75. Supexec        = 38      ; xbios
  76. Dosound        = 32      ; xbios
  77. dostrap        = $84
  78. gemtrap        = $88
  79. xbiostrap      = $b8
  80. memtop         = $436
  81. defshiftmd     = $44b
  82. sshiftmd       = $44c
  83. v_bas_add      = $44e
  84. _nvbls         = $454
  85. _vblqueue      = $456
  86. dumpflag       = $4ee
  87. sysbase        = $4f2
  88. hardcopy       = $502
  89. vid_bashigh    = $ff8201
  90. vid_basmid     = $ff8203
  91. vid_ismid      = $ff8207
  92. vid_pal3       = $ff8246
  93. vid_palF       = $ff825e
  94. add_len        = $9000
  95.  
  96.                .TEXT 
  97. main:          bra.s     Start_of_Code       ; Zum Anfang springen
  98.  
  99. ;#############################################################
  100. ;#
  101. ;# Die Tabelle der BildschirmWerte
  102. ;#
  103. ;#############################################################
  104. ScreenTab:     .DC.w 400,832,672             ;   X-Auflösung Low,Mid,High
  105.                .DC.w 280,280,480             ;   Y-Auflösung
  106.                .DC.w 236,236,100             ;   Bytes pro Zeile
  107.                .DC.l -$1600,-$1600,$2000     ;   VideoAdd  <> Memtop Offset
  108.                .DC.l 252,248,9800            ;   v_bas_add <> Memtop Offset
  109.                .DC.w 320,640,640             ;   Alte X-Auflösung
  110.                .DC.w 200,200,400             ;   Alte Y-Auflösung
  111. TruePhys:      .DC.w 0   ;                       Physbase Emulation aus
  112. ActivateKey:   .DC.b 9,0 ;                       Hardcopy Taste
  113. ;#############################################################
  114. ;#
  115. ;# Das Hauptprogramm
  116. ;#
  117. ;#############################################################
  118.  
  119. Start_of_Code: movea.l   4(sp),a5            ; Basepointer einrichten
  120.                lea.l     $100(a5),sp         ; Stack einrichten
  121.  
  122.                pea       do_setup(pc)        ; Test und Installation im
  123.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  124.                trap      #xbios              ; Ergebnis in inst_ok
  125.                addq.l    #6,sp
  126.  
  127.                move.w    inst_ok,d0
  128.                tst.w     d0                  ; war Installation erfolgreich ?
  129.                bne       not_ok              ; leider nein, raus
  130.  
  131.                move.w    #Dgetdrv,-(sp)      ; Bootlaufwerk holen
  132.                trap      #gemdos             ;
  133.                addq.l    #2,sp               ;
  134.                lea.l     save_name(pc),a0    ;
  135.                add.b     d0,(a0)             ; und einstellen
  136.  
  137.                move.w    #-1,-(sp)           ;   Irgendeine Sondertaste gedrückt
  138.                move.w    #Kbshift,-(sp)      ;
  139.                trap      #bios               ;
  140.                addq.l    #4,sp               ;
  141.                tst.w     d0
  142.                beq       DoIntro
  143.                bsr       UserInstall
  144.                bra       DoTitle
  145. DoIntro:       bsr       Intro               ; GrowBox und Sound ausgeben
  146. DoTitle:       pea       msg_title(pc)       ; Titelzeile ausgeben
  147.                move.w    #Cconws,-(sp)
  148.                trap      #gemdos
  149.                addq.l    #6,sp
  150.                pea       msg_installed(pc)   ; 'Installiert' Meldung ausgeben
  151.                move.w    #Cconws,-(sp)
  152.                trap      #gemdos
  153.                addq.l    #6,sp
  154.  
  155.                clr.w     -(sp)               ; Resident beenden
  156.                lea.l     _ende(pc),a0        ;   Programmende
  157.                suba.l    a5,a0               ; - Programmanfang
  158.                move.l    a0,-(sp)            ; = Programmlaenge
  159.                move.w    #Ptermres,-(sp)
  160.                trap      #gemdos
  161. ;-----------------------------------------------------
  162. not_ok:        pea       msg_title(pc)       ; Titelzeile ausgeben
  163.                move.w    #Cconws,-(sp)
  164.                trap      #gemdos
  165.                addq.l    #6,sp
  166.                move.w    inst_ok,d0
  167.                cmpi.w    #1,d0               ; war's das falsche TOS ?
  168.                bne       main_2              ; nein -> Kein Overscan-Modus
  169.  
  170.                pea       msg_notactive(pc)   ; 'Nicht aktiviert' Meldung ausgeben
  171.                move.w    #Cconws,-(sp)
  172.                trap      #gemdos
  173.                addq.l    #6,sp
  174.                bra       Goodbye             ; einfach beenden
  175. ;-----------------------------
  176. main_2:        cmpi.w    #2,d0
  177.                bne       main_3
  178.                pea       msg_noTos(pc)       ; 'Falsches TOS' Meldung ausgeben
  179.                move.w    #Cconws,-(sp)
  180.                trap      #gemdos
  181.                addq.l    #6,sp
  182.                bra       wait_key            ; einfach beenden
  183. ;-----------------------------
  184. main_3:        pea       msg_already(pc)     ; 'Schon installiert' Meldung
  185.                move.w    #Cconws,-(sp)       ; ausgeben
  186.                trap      #gemdos
  187.                addq.l    #6,sp               ;  und
  188. ;-----------------------------
  189. wait_key:      move.w    #Cnecin,-(sp)       ; Auf Tastendruck warten
  190.                trap      #gemdos
  191.                addq.l    #2,sp
  192. ;-----------------------------
  193. Goodbye:       clr.w     -(sp)               ; Programm beenden (Returncode 0)
  194.                trap      #gemdos
  195.  
  196. ;############################################################
  197. ;#
  198. ;# Die Installations-Routine
  199. ;#
  200. ;#############################################################
  201.  
  202. do_setup:      movem.l   d0-d7/a0-a6,-(sp)
  203.                move.w    #3,inst_ok          ; Status : schon installiert
  204.  
  205.                movea.l   dostrap,a0          ; GemDos-Trap nach OVERSCAN absuchen
  206.  
  207. tstXBRA:       cmpi.l    #'XBRA',-12(a0)     ; XBRA ?
  208.                bne       noXBRA              ; nein -> Ende der Vektorkette
  209.                cmpi.l    #'OVER',-8(a0)      ; OVER ?
  210.                beq       EndSetup            ; ja   -> Schon Installiert !
  211.                movea.l   -4(a0),a0           ;
  212.                bra       tstXBRA             ; weiter suchen
  213.  
  214. noXBRA:        move.w    #2,inst_ok          ; Status : falsches TOS
  215. ;----------------------------  auf richtige TOS-Version testen
  216.  
  217.                sf        BadTos              ; TOS als ok annehmen
  218.  
  219. testBETATOS:   movea.l   #$170ee,a0          ;-------- Ist es BETA-RAMTOS ?
  220.                cmpi.l    #$cec0e84f,(a0)     ; schon gepatched ?
  221.                beq       isBETA              ; ja
  222.                cmpi.l    #$e848cec0,(a0)     ;     LSR #4,D0 / MULU D0,D7 ?
  223.                bne       testRAMTOS1_4       ; nein -> RAMTOS1.4
  224.                move.l    #$cec0e84f,$170ee   ;     MULU D0,D7 / LSR #4,D7
  225. isBETA:        movea.l   $5232,a0            ;     A0 = Zeiger auf MemAllocList
  226.                bra       TOSok               ;
  227.  
  228. testRAMTOS1_4: movea.l   #$17192,a0          ;-------- Ist es RAMTOS 1.4 ?
  229.                cmpi.l    #$cec0e84f,(a0)     ; schon gepatched ?
  230.                beq       isRAMTOS1_4
  231.                cmpi.l    #$e848cec0,(a0)     ;
  232.                bne       testROMTOS1_4       ; nein -> ROMTOS1.4
  233.                move.l    #$cec0e84f,$17192   ;     1. mal Scrollfehler
  234. isRAMTOS1_4:   move.l    #$cec0e84f,$171d6   ;     2. mal Scrollfehler beheben
  235.                movea.l   $5232,a0            ;     A0 = Zeiger auf MemAllocList
  236.                bra       TOSok               ;
  237.  
  238. testROMTOS1_4: movea.l   sysbase,a1          ;-------- Ist es ROMTOS 1.4 ?
  239.                cmpi.w    #$0104,2(a1)        ;     os_version testen
  240.                bne       testTOS1_2          ; nein -> TOS 1.2 (BlitterTOS)
  241.                movea.l   $532c,a0            ;     A0 = Zeiger auf MemAllocList
  242.                bra       TOSok               ;
  243.  
  244. testTOS1_2:    cmpi.w    #$0102,2(a1)        ;-------- Ist es TOS 1.2 ?
  245.                bne       EndSetup            ; nein -> falsches TOS -> ENDE
  246.                st        BadTos              ;     BlitterTOS -> Flag setzen
  247.                movea.l   $7e92,a0            ;     A0 = Zeiger auf MemAllocList
  248.  
  249. TOSok:         move.w    #1,inst_ok          ; Status : Nicht im OVERSCAN-Modus
  250. ;---------------------------------------------
  251. ; Ist der Schalter umgelegt (OVERSCAN aktiv) ?
  252. ; Es wird gewartet, bis der Videoadresszähler bis zum Ende
  253. ; der normalen Bildschirmseite hochgezählt hat.
  254. ; Dann wird getestet, ob er auf den Anfang zurückspringt.
  255. ; Tut er das nicht, ist OVERSCAN aktiv.
  256.                clr.w     d0
  257.                move.b    vid_basmid,d0       ;
  258.                move.w    d0,d1               ;
  259.                addi.w    #$7d,d1             ;
  260. Wait1:         cmp.b     vid_ismid,d1        ;
  261.                bne       Wait1               ;
  262. Wait2:         cmp.b     vid_ismid,d1        ;
  263.                beq       Wait2               ;
  264.                cmp.b     vid_ismid,d0        ;
  265.                beq       EndSetup            ; Nicht aktiv -> Beenden
  266.  
  267.                clr.w     inst_ok             ; Status : OVERSCAN aktiv
  268.  
  269.                move.l    v_bas_add,StartBasAdd    ; Startaddr des Bildschirms
  270.  
  271.                move.l    memtop,d0           ;     Letzte beschreibbare Addresse
  272.                addi.l    #$8000,d0           ;     bestimmen und merken
  273.                move.l    d0,MemEnd           ;
  274.  
  275.                subi.l    #add_len,8(a0)      ;     Belegten Speicherblock
  276.                subi.l    #add_len,memtop     ;     ... verkürzen
  277.  
  278.                tst.b     BadTos              ; BlitterTOS ?
  279.                beq       no_extra_buff       ; nein, weiter
  280.                subi.l    #32768,8(a0)        ;     32K Sicherheitpuffer ...
  281.                subi.l    #32768,memtop       ;     ... vor Bildspeicher anlegen
  282. no_extra_buff: 
  283.                clr.w     d0
  284.                move.b    sshiftmd,d0
  285.                move.w    d0,Reso             ;     Auflösung merken
  286.                .DC.w $a000                   ; LineA init
  287.                move.l    d0,LineA            ;     Zeiger auf LineA Variablen
  288.                move.l    memtop,MyMemtop     ;     AltenWert sichern
  289.                bsr       SetOverscan         ;     Overscan Werte einstellen
  290. ;
  291. ; Diese einmalige Initialisieren der Werte reicht nicht aus,
  292. ; da sie beim Starten vom AES wieder zurückgesetzt werden.
  293. ; Wir müssen also die Werte kurz nach v_opnwk nochmal setzen
  294. ;
  295. ;----------------------> ALSO  GEM-Routine (AES/VDI) umleiten
  296.                lea.l     OldVec(pc),a0       ; Alten GemTrapVektor retten
  297.                move.l    gemtrap,(a0)        ;
  298.                lea.l     MyGem(pc),a0        ;
  299.                move.l    a0,gemtrap          ; und neuen Vektor eintragen
  300.                tst.b     BadTos              ; BlitterTOS ?
  301.                beq       NoSlot              ; nein -> Nicht in VBL einhängen
  302.  
  303.                move.w    _nvbls,d0           ; Anzahl Routinen in _vblqueue
  304.                lsl.w     #2,d0               ; mal sizeof(long)
  305.                movea.l   _vblqueue,a0        ; Zeiger auf _vblqueue
  306.                moveq.l   #4,d1               ; ersten Slot auslassen
  307. TestSlot:      tst.l     0(a0,d1.w)          ; ist Eintrag frei ?
  308.                beq.s     SlotFound           ; ja, gefunden
  309.                addq.w    #4,d1               ; offset für nächsten Slot
  310.                cmp.w     d0,d1               ; Ende der Liste ?
  311.                bne.s     TestSlot            ; nein, nächsten Slot testen
  312.                bra       NoSlot              ; keinen freien Slot gefunden, raus
  313. SlotFound:     
  314.                lea.l     MyVB(pc),a1         ; eigene VBL-Routine ...
  315.                move.l    a1,0(a0,d1.w)       ; ... in Slot eintragen
  316. NoSlot:        
  317. ;---------------------------- Gemdos umleiten
  318.                lea.l     OldDos(pc),a0       ;     Alten GemdosVektor retten
  319.                move.l    dostrap,(a0)        ;
  320.                lea.l     MyDos(pc),a0        ;
  321.                move.l    a0,dostrap          ;     und neuen Vektor eintragen
  322. ;---------------------------- Xbios umleiten
  323.                lea.l     OldXbios(pc),a0     ;     Alten XbiosVektor retten
  324.                move.l    xbiostrap,(a0)      ;
  325.                lea.l     MyXbios(pc),a0      ;
  326.                move.l    a0,xbiostrap        ;     und neune Vektor eintragen
  327. ;---------------------------- Hardcopy-Routine umleiten
  328.                lea.l     OldHard(pc),a0      ;     Alten HardcopyVektor retten
  329.                move.l    hardcopy,(a0)       ;
  330.                lea.l     MyHard(pc),a0       ;
  331.                move.l    a0,hardcopy         ;     und neuen Vektor eintragen
  332.  
  333.                sf        GemStarted
  334. EndSetup:      movem.l   (sp)+,d0-d7/a0-a6
  335.                rts       
  336.  
  337. ;#############################################################
  338. ;#
  339. ;# Die umgebogenen Traps und Vektoren
  340. ;# ----------------------------------
  341. ;#        MyGem      AES/VDI Trap
  342. ;#        MyDos      GEMDOS  Trap
  343. ;#        MyXbios    XBIOS   TRAP
  344. ;#        MyHard     Hardcopy-Vektor
  345. ;#        MyVB       VerticalBlank-Vektor (nur bei BlitterTOS )
  346. ;#        MyMouse    Mouse-Vektor         (nur bei BlitterTOS)
  347. ;#
  348. ;################################################ GEM- TRAP
  349.  
  350. ; XBRA-Protokoll
  351.                .DC.b "XBRAOVER"              ; !! Ja, das ist alles !!
  352. OldVec:        .DC.l 0
  353. MyGem:         cmpi.w    #$73,d0             ; Ist es ein VDI-Aufruf ?
  354.                bne       NotMyGem            ;   nein -> weiter
  355.                movea.l   d1,a0               ; Addresse der VDI-Parameterfelder
  356.                move.l    12(a0),WorkOut      ; WorkOut-Zeiger speichern
  357.                movea.l   (a0),a0             ; VDI-Control[0] = VDI-Befehlscode
  358.                cmpi.w    #1,(a0)             ; ist es Open-WorkStation ?
  359.                bne       NotMyGem            ;    nein-> weiter
  360.                movea.l   d1,a0
  361.                movea.l   4(a0),a0            ; WorkIn-Zeiger
  362.                cmpi.w    #5,(a0)             ;    WorkIn[0] gleich Screen ?
  363.                bge       NotMyGem            ;    nein -> weiter
  364. ;-------------> NACH !!! 'v_opnwk()' in Patchroutine springen
  365.                move.l    2(sp),Back          ; Orginal Rücksprungadresse merken
  366.                lea.l     PatchIt(pc),a0      ; Rücksprung auf 'PatchIt' ...
  367.                move.l    a0,2(sp)            ; ... umleiten
  368. NotMyGem:      movea.l   OldVec(pc),a0       ; Orginal GEM-Routine ...
  369.                jmp       (a0)                ; ... ausführen
  370. ;----------------------------------------------------------
  371. PatchIt:       bsr       SetOverscan         ; LineA Werte nochmal eintragen
  372.  
  373.                move.w    #-1,-(sp)           ;   Auf rechte Schifttaste testen
  374.                move.w    #Kbshift,-(sp)      ;
  375.                trap      #bios               ;
  376.                addq.l    #4,sp               ;
  377.                tst.w     d0
  378.                beq       PatchCont
  379.  
  380.                bsr       UserInstall
  381.  
  382. PatchCont:     bsr       ClearScreen         ; Rand löschen
  383.                pea       msg_erase(pc)       ; und Mitte auf Weiss
  384.                move.w    #Cconws,-(sp)       ;
  385.                trap      #gemdos             ;
  386.                addq.l    #6,sp               ;
  387.                st        GemStarted          ; Okay GEM läuft
  388.                movea.l   WorkOut,a0          ; Adresse des Workout-Feldes
  389.                move.w    RezX,0(a0)          ; Work_out[0] = Breite
  390.                move.w    RezY,2(a0)          ; Work_out[1] = Höhe
  391.  
  392.                move.w    VPlanes,d0          ; Farben Vorgeben
  393.                cmpi.w    #4,d0
  394.                bne       PatchMid
  395.                move.w    #200,78(a0)
  396.                move.w    #16,26(a0)
  397.                bra       PatchEnd
  398. PatchMid:      cmpi.w    #2,d0
  399.                bne       PatchHigh
  400.                move.w    #200,78(a0)
  401.                move.w    #4,26(a0)
  402.                bra       PatchEnd
  403. PatchHigh:     
  404.                move.w    #2,78(a0)
  405.                move.w    #2,26(a0)
  406.  
  407. PatchEnd:      move.l    Back,-(sp)          ; Zum 'v_opnwk()' - Aufrufer
  408.                rts                           ;   zurückspringen
  409. ;################################################ GEMDOS-Trap
  410.                .DC.b "XBRAOVER"
  411. OldDos:        .DC.l 0
  412. MyDos:         move.w    (sp),d0             ; Je nachdem ob GEMDOS vom
  413.                btst      #13,d0              ; Supervisor- oder User-modus
  414.                bne       no_super            ; aufgerufen wurde sind die
  415.                move.l    usp,a0              ; Parameter auf dem entsprechendem
  416.                bra       tst_term            ; Stack
  417. no_super:      lea.l     6(sp),a0
  418. tst_term:      cmpi.w    #Pterm0,(a0)        ; Der Overscan-Modus wird
  419.                beq       TermFound           ; NACH jedem Programm nocheinmal
  420.                cmpi.w    #Pterm,(a0)         ; neu installiert, da viele
  421.                bne       NoTerm              ; Programme den Bildschirm umsetzen
  422. TermFound:     movem.l   d0-d7/a0-a6,-(sp)   ; oder direkt beschreiben.
  423.                bsr       SetOverscan         ;
  424.                bsr       ClearScreen         ;
  425. NoClear:       movem.l   (sp)+,d0-d7/a0-a6
  426. NoTerm:        movea.l   OldDos(pc),a0
  427.                jmp       (a0)
  428. ;################################################ XBIOS-Trap
  429.                .DC.b "XBRAOVER"
  430. OldXbios:      .DC.l 0
  431. MyXbios:       move.w    TruePhys,d0
  432.                beq       No_Xbios
  433.                move.w    (sp),d0             ; Je nachdem ob XBIOS vom
  434.                btst      #13,d0              ; Supervisor- oder User-modus
  435.                bne       no_x_super          ; aufgerufen wurde sind die
  436.                move.l    usp,a0              ; Parameter auf dem entsprechendem
  437.                bra       tst_phys            ; Stack
  438. no_x_super:    lea.l     6(sp),a0
  439. tst_phys:      cmpi.w    #Physbase,(a0)      ; Beim Physbase-Aufruf wird
  440.                beq       PhysFound           ;
  441. No_Xbios:      movea.l   OldXbios(pc),a0
  442.                jmp       (a0)
  443. PhysFound:     move.l    v_bas_add,d0        ; v_bas_add zurückgegeben
  444.                rte       
  445. ;################################################ HARDCOPY-Vec
  446.                .DC.b "XBRAOVER"              ;  HARDCOPY
  447. OldHard:       .DC.l 0   ;
  448. MyHard:        move.w    #-1,-(sp)           ;   Auf Shift ALT/HELP testen
  449.                move.w    #Kbshift,-(sp)      ;
  450.                trap      #bios               ;
  451.                addq.l    #4,sp               ;
  452.                cmp.b     ActivateKey,d0      ;   ja -> eigene Routine
  453.                beq       NewHard             ;
  454.                movea.l   OldHard(pc),a0      ;   nein -> alte Routine anspringen
  455.                jmp       (a0)                ;
  456. ;------------------------------------------
  457. NewHard:       movem.l   d0-d7/a0-a6,-(sp)
  458.                bsr       SetOverscan         ;     Overscan Werte nochmal setzen
  459.                bsr       ClearScreen         ;     Bilschirmränder löschen
  460. DoNotClear:    move.w    #-1,dumpflag        ;  Hardcopy-DumpFlag löschen
  461. EndHard:       movem.l   (sp)+,d0-d7/a0-a6
  462.                rts                           ; zurück
  463. ;################################################ VBL-Vektor
  464.                .DC.b "XBRAOVER"              ; VerticalBlank nur bei BLITTER-TOS
  465.                .DC.l 0
  466. MyVB:          tst.b     GemStarted          ; Läuft GEM schon
  467.                beq.s     MyVB_1              ; nein, raus
  468.  
  469.                movea.l   _vblqueue,a0        ; in VBL-Slot 0 schon ...
  470.                tst.l     (a0)                ; ... GEM-Mausroutine installiert ?
  471.                beq.s     MyVB_1              ; nein, raus
  472.  
  473.                pea       MyMouse(pc)         ; durch eigene Mausroutine ...
  474.                move.l    (sp)+,(a0)          ; ... ersetzen
  475.  
  476. ; ???????????????????????????
  477.                movea.l   MouseVec,a0
  478.                cmpi.l    #$fcfe82,(a0)
  479.                bne.s     MyVB_1
  480.                move.w    sr,-(sp)
  481.                ori.w     #$700,sr
  482.                move.l    #$fcfe8c,(a0)
  483.                move.w    (sp)+,sr
  484. MyVB_1:        rts       
  485. ;################################################ MOUSE-Vektor
  486.                .DC.b "XBRAOVER"              ; MouseVec nur bei BLITTER-TOS
  487.                .DC.l 0
  488. MyMouse:       move.w    sr,-(sp)            ; Alte Interruptmaske merken
  489.                ori.w     #$0700,sr           ; alle Interrupts sperren
  490.  
  491.                movea.l   LineA,a0            ; Zeiger auf LineA Variablen
  492.                bclr      #0,CUR_FLAG(a0)     ; !0 -> Maus neu zeichnen ?
  493.                beq.s     MyMouse_2           ; nein, raus
  494.  
  495.                clr.l     d0
  496.                clr.l     d1
  497.                move.w    CUR_X(a0),d0        ; Maus X-Position holen
  498.                move.w    CUR_Y(a0),d1        ; Maus Y-Position holen
  499.                move.w    (sp)+,sr            ; wieder Interrupts zulassen
  500.                tst.b     MOUSE_FLAG(a0)      ; !0 -> Mausinterrupt ein ?
  501.                bne.s     MyMouse_1           ; ja, raus
  502.  
  503.                movem.w   d0/d1,-(sp)         ; Register retten
  504.  
  505.                lea.l     SAVE_LEN(a0),a2     ; Zeiger auf LineA SpriteSaveBuffer
  506.                bsr       UndrawSprite        ; Mauszeiger löschen
  507.  
  508.                movem.w   (sp)+,d0/d1         ; Register restaurieren
  509.  
  510.                movea.l   LineA,a0
  511.                lea.l     SAVE_LEN(a0),a2     ; Zeiger auf LineA SpriteSaveBuffer
  512.                lea.l     M_POS_HX(a0),a0     ; SDB-Zeiger für LineA-MausSprite
  513.                bsr       DrawSprite          ; Mauszeiger neu zeichnen
  514. MyMouse_1:     
  515.                rts                           ; raus
  516. MyMouse_2:     
  517.                move.w    (sp)+,sr            ; wieder Interrupts zulassen
  518.                rts                           ; raus
  519.  
  520.  
  521. ;#############################################################
  522. ;#
  523. ;# Die wichtigsten Unterprogramme
  524. ;# ------------------------------
  525. ;#     SetOverscan       LineA und Auflösung initialisieren
  526. ;#     ClearScreen       Nur BildschirmRänder auf Schwarz
  527. ;#     ClearFullScreen   Ganzen Bildschirmspeicher löschen
  528. ;#
  529. ;#############################################################
  530.  
  531. SetOverscan:   clr.l     d2
  532.                move.b    sshiftmd,d2         ; Aktuelle Aufösung
  533.                move.w    d2,Reso             ;    merken
  534.                add.w     d2,d2               ; mal 2 als Word-Offset in Tabelle
  535.                lea.l     ScreenTab(pc),a0    ; TabellenZeiger holen
  536.                move.w    0(a0,d2.w),RezX     ; X-Auflösung
  537.                move.w    6(a0,d2.w),RezY     ; Y-Auflösung
  538.                move.w    12(a0,d2.w),BpL     ; Bytes pro Zeile
  539.                add.w     d2,d2               ; mal 2 als Long-Offset
  540.                move.l    18(a0,d2.w),d0      ; Offset  MEMTOP <> VIDEO_ADD
  541.                move.l    30(a0,d2.w),d1      ; Offset  MEMTOP <> V_BAS_ADD
  542.                move.w    d1,Offset           ; merken
  543. ;----------------------------  Videoaddresse auf 'memtop + D0'
  544.                move.l    MyMemtop,v_bas_add
  545.                tst.b     BadTos              ; Bei BlitterTOS
  546.                beq       no_buff_1           ;     hinter Sicherheits-
  547.                addi.l    #32768,v_bas_add    ;     Puffer beginnen
  548. no_buff_1:     
  549.                add.l     d0,v_bas_add
  550.                move.b    v_bas_add+1,vid_bashigh  ; Addresse setzen
  551.                move.b    v_bas_add+2,vid_basmid
  552.                move.l    v_bas_add,VidAdd    ;       und merken
  553. ;----------------------------  v_bas_ad auf 'memtop + D1' setzen
  554.                move.l    MyMemtop,v_bas_add
  555.                tst.b     BadTos              ; Bei BlitterTOS
  556.                beq       no_buff_2           ;     hinter Sicherheitspuffer
  557.                addi.l    #32768,v_bas_add    ;
  558. no_buff_2:     
  559.                add.l     d1,v_bas_add        ;         v_bas_add setzen
  560.                move.l    v_bas_add,BasAdd    ;         und merken
  561. ;--------------- Werte in den negativen LineA Variablen anpassen
  562.                movea.l   LineA,a0            ; LineA Zeiger holen
  563.                move.w    RezX,v_rez_hz(a0)   ; Breite setzen
  564.                move.w    RezX,WKXRez(a0)     ;
  565.                subi.w    #1,WKXRez(a0)       ; Breite-1
  566.                move.w    RezY,v_rez_vt(a0)   ; Höhe   setzen
  567.                move.w    RezY,WKYRez(a0)     ;
  568.                subi.w    #1,WKYRez(a0)       ; Höhe-1
  569.                move.w    BpL,bytes_lin(a0)   ; Bytes pro Zeile setzen
  570.                move.w    BpL,width(a0)       ;
  571.                move.w    RezX,d0             ;
  572.                asr.w     #3,d0               ;
  573.                subq.w    #1,d0               ; Breite/8 -1
  574.                move.w    d0,v_cel_mx(a0)     ; -> Anzahl Buchstaben pro Zeile
  575.                clr.l     d0                  ;
  576.                move.w    RezY,d0             ;
  577.                divu.w    v_cel_ht(a0),d0     ;
  578.                subq.w    #1,d0               ; Höhe/Buchstabenhöhe -1
  579.                move.w    d0,v_cel_my(a0)     ; -> Anzahl Buchstabenzeilen
  580.                move.w    v_cel_ht(a0),d0     ;
  581.                mulu.w    BpL,d0              ; AnzBuchstaben*BytesProZeile
  582.                move.w    d0,v_cel_wr(a0)     ; -> Blocklänge für Scrolling
  583.                move.w    v_planes(a0),VPlanes     ; Anzahl der Farbebenen
  584.                tst.b     BadTos              ; BLITTER-TOS ?
  585.                beq       setLineA_1          ; nein -> fertig
  586. ;-----------------------------
  587.                move.w    #3,MonPLine
  588.                move.b    sshiftmd,d0
  589.                cmpi.b    #1,d0
  590.                bgt       setLineA_1
  591.                move.w    #2,MonPLine
  592.                tst.b     d0
  593.                bne       setLineA_1
  594.                move.w    #1,MonPLine
  595. setLineA_1:    bsr       ResetCursor         ; Neue CursorAddresse bestimmen
  596.                rts       
  597. ;-----------------------------
  598. CallSetOverscan:         
  599.                move.w    sr,d0
  600.                btst      #13,d0
  601.                beq       DoCallOver
  602.                bra       SetOverscan
  603. DoCallOver:    pea       SetOverscan(pc)     ; im
  604.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  605.                trap      #xbios              ;
  606.                addq.l    #6,sp
  607.                rts       
  608. ;#############################################################
  609. ClearScreen:   bsr       BlackColor          ; Löschfarbe holen in D0
  610.                move.l    d0,d4               ;
  611. ;-----------------------------
  612.                movea.l   VidAdd,a1           ; Oberen Rand löschen
  613.                movea.l   BasAdd,a0           ;
  614.                subq.l    #2,a0               ; Falls HIGH_OFF nicht /4 teilbar
  615. Hflp:          move.l    d4,(a1)+            ; Vor dem Bildschirm Rücklauf
  616.                cmpa.l    a0,a1               ; Pixel auf Schwarz setzen
  617.                blt       Hflp                ;
  618. ;-----------------------------
  619.                move.w    Reso,d5             ;
  620.                movea.l   BasAdd,a0           ; Links & Rechts im Rücklauf löschen
  621.                clr.l     d0                  ; Den ungenutzten Bereich im
  622.                clr.l     d1                  ; Rücklauf auf Schwarz setzen
  623.                move.w    BpL,d0              ; Bytes pro Zeile - Pixel/xxx
  624.                move.w    RezX,d1             ;
  625.                addq.w    #1,d5
  626.                asr.w     d5,d1               ;   >>3:High  >>2:Mid  >>1:Low
  627.                sub.w     d1,d0               ;
  628.                move.w    RezY,d2             ; Höhe des Bereichs
  629.                subq.w    #1,d2               ;
  630.                subq.w    #1,d0               ;
  631. Hlp1:          adda.l    d1,a0               ; Normalen Bildbereich überspringen
  632.                move.w    d0,d3               ;
  633. Hlp2:          move.b    d4,(a0)+            ; Bereich löschen
  634.                dbf       d3,Hlp2             ;
  635.                dbf       d2,Hlp1             ;
  636. ;-----------------------------
  637.                move.l    a0,d0               ; Unteren Bildrand löschen
  638.                bclr      #0,d0               ; Zeiger auf gerade Addresse
  639.                movea.l   d0,a0               ; bringen
  640.                move.l    MemEnd,d1           ; Anzahl der zulöschenden Blöcke
  641.                sub.l     d0,d1               ; Speicherende minus ZeigerAddr
  642.                asr.l     #4,d1               ; durch 16 (Blocklänge)
  643.                subq.l    #1,d1               ; minus 1 (wegen dbf)
  644. ;-----------------------------
  645. Hlp3:          move.l    d4,(a0)+            ; auf Schwarz löschen
  646.                move.l    d4,(a0)+            ;
  647.                move.l    d4,(a0)+            ;
  648.                move.l    d4,(a0)+            ;
  649.                dbf       d1,Hlp3             ;
  650.                rts                           ; fertig
  651. ;-----------------------------
  652. CallClearScreen:         
  653.                move.w    sr,d0
  654.                btst      #13,d0
  655.                beq       DoCallClearSc
  656.                bra       ClearScreen
  657. DoCallClearSc: pea       ClearScreen(pc)     ; im
  658.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  659.                trap      #xbios              ;
  660.                addq.l    #6,sp
  661.                rts       
  662. ;#############################################################
  663. ; Gesamten Bildspeicher löschen (auf schwarz)
  664. ; Löschfarbe bestimmen
  665. ClearFullScreen:         
  666.                bsr       BlackColor          ; Löschwert holen in D0
  667.                move.l    #$8000,d1           ; Länge des alten Bildschirmspeichers
  668.                addi.l    #add_len,d1         ; plus Erweiterung
  669.                lsr.l     #4,d1               ; geteilt durch 16L
  670.                subq.l    #1,d1               ; minus 1 wegen dbf
  671. ;-----------------------------
  672.                movea.l   MyMemtop,a0         ; ab MEMTOP löschen
  673.                tst.b     BadTos              ; BlitterTOS ?
  674.                beq       sc_clp              ; Sicherheitspuffer beachten
  675.                adda.l    #32768,a0           ; alte Länge
  676. ;-----------------------------
  677. sc_clp:        move.l    d0,(a0)+            ;
  678.                move.l    d0,(a0)+            ;
  679.                move.l    d0,(a0)+            ;
  680.                move.l    d0,(a0)+            ;
  681.                dbf       d1,sc_clp           ; die nächsten 16 Bytes
  682.                bsr       ResetCursor
  683.                rts                           ; fertig
  684. ;-----------------------------
  685. CallClearFull: 
  686.                move.w    sr,d0
  687.                btst      #13,d0
  688.                beq       DoCallClearFu
  689.                bra       ClearFullScreen
  690. DoCallClearFu: pea       ClearFullScreen(pc) ; im
  691.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  692.                trap      #xbios              ;
  693.                addq.l    #6,sp
  694.                rts       
  695. ;-----------------------------
  696. BlackColor:    move.l    #-1,d0              ; erstmal Füllwert $FFFFFFFF
  697.                move.w    Reso,d1             ; Bildschirmmodus ...
  698.                cmpi.w    #2,d1               ; ... Monochrom ?
  699.                bne       NotWhite            ; nein, weiter
  700.                btst      #0,$ff8241          ; Inverse Monochrome ?
  701.                bne       NotWhite            ; nein, Farbe richtig
  702.                not.l     d0                  ; sonst Füllwert $0
  703. NotWhite:      rts       
  704. ;-----------------------------
  705. CallBlackColor:          
  706.                move.w    sr,d0
  707.                btst      #13,d0
  708.                beq       DoCallBlackCo
  709.                bra       BlackColor
  710. DoCallBlackCo: pea       BlackColor(pc)      ; im
  711.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  712.                trap      #xbios              ;
  713.                addq.l    #6,sp
  714.                rts       
  715. ;#############################################################
  716. ; Retten des alten SchirmInhaltes in den neuen OVERSCAN Bildschirm
  717. ;
  718. ScreenSave:    movem.l   d0-d7/a0-a6,-(sp)   ;
  719.                movea.l   StartBasAdd,a0      ; Bildschirmspeicher kurz
  720.                movea.l   MyMemtop,a1         ; vor MemTop kopieren !
  721.                suba.l    #$8000,a1           ;
  722.                move.l    #1000,d0
  723. ScSaveLoop:    movem.l   (a0)+,d1-d7/a2
  724.                movem.l   d1-d7/a2,(a1)
  725.                lea.l     32(a1),a1           ; 32 Bytes transportieren
  726.                dbf       d0,ScSaveLoop
  727.                movem.l   (sp)+,d0-d7/a0-a6
  728.                rts       
  729. ;---------------------------------------------------------
  730. ScreenCopy:    movem.l   d0-d7,-(sp)         ;
  731.                movea.l   BasAdd,a0           ; Bildschirmspeicher wieder
  732.                movea.l   MyMemtop,a1         ; zurückkopieren
  733.                suba.l    #$8000,a1           ;
  734.                move.w    #160,d0             ; Alte Breite in BYTE D0
  735.                move.w    #200,d1             ; Alte Höhe            D1
  736.                cmpi.w    #2,Reso             ;
  737.                bne       CopyNoHigh          ;
  738.                move.w    #80,d0              ; High-Reso
  739.                move.w    #400,d1             ;
  740. CopyNoHigh:    clr.l     d2                  ;
  741.                move.w    BpL,d2              ; Neue Bytes Pro Line  D3
  742.                sub.w     d0,d2               ; Differenz Neue-Alte
  743.                asr.w     #2,d0               ; /4 -> Longs
  744.                subq.w    #1,d0               ; wegen dbf -> LONGs to copy
  745.                subq.w    #1,d1               ; Lines to Copy
  746.                subq.w    #1,d2               ; Rest zu löschen
  747.  
  748. CopyLoop:      move.w    d0,d3               ;
  749. Copy_1:        move.l    (a1)+,(a0)+         ; Alten Schirm kopieren
  750.                dbf       d3,Copy_1           ;
  751.                move.w    d2,d3               ;
  752. Copy_2:        clr.b     (a0)+               ;
  753.                dbf       d3,Copy_2           ; Zeile bis Ende löschen
  754.                dbf       d1,CopyLoop         ;
  755.  
  756.                bsr       CallClearScreen
  757.                bsr       ResetCursor         ; CursorAddr bestimmen
  758.                movem.l   (sp)+,d0-d7
  759.                rts       
  760. ;#####################################################################
  761. ; Neue CursorAddresse bestimmen
  762. ;
  763. ResetCursor:   movea.l   LineA,a0            ;
  764.                move.l    BasAdd,v_cur_add(a0)     ;  Neue Addresse
  765.                move.w    v_cur_y(a0),d0      ;    = V_bas_add
  766.                mulu.w    v_cel_wr(a0),d0     ;
  767.                add.l     d0,v_cur_add(a0)    ;      + y * cel_wr
  768.                move.w    v_cur_x(a0),d0      ;
  769.                bclr.l    #0,d0               ;      + x^1 * v_planes
  770.                mulu.w    v_planes(a0),d0     ;
  771.                add.l     d0,v_cur_add(a0)    ;      + x^1 * planes
  772.                move.w    v_cur_x(a0),d0      ;
  773.                andi.l    #$fffe,d0           ;
  774.                add.w     d0,v_cur_add(a0)    ;      + x&1
  775.                clr.l     d0                  ;
  776.                move.w    v_cur_of(a0),d0     ;
  777.                add.l     d0,v_cur_add(a0)    ;      + cursor_offset
  778.                rts       
  779. ;#############################################################
  780. ;#
  781. ;# INTRO GrowBox Effekt und Sound
  782. ;#
  783. ;#############################################################
  784.  
  785. Intro:         bsr       ScreenSave
  786.                pea       SoundTab(pc)        ; Sound abspielen
  787.                move.w    #Dosound,-(sp)
  788.                trap      #xbios
  789.                addq.l    #6,sp
  790. ;-----------------------------
  791.                clr.w     d0
  792.                bsr       set_color
  793.                move.w    Reso,d5             ; Aktuelle Aufösung
  794.                add.w     d5,d5               ; mal 2 als Word-Offset in Tabelle
  795.                lea.l     ScreenTab(pc),a0
  796.                move.w    RezX,d6             ; D6 = (Breite - AlteBreite)/2
  797.                cmp.w     42(a0,d5.w),d6      ; Neue Breite kleiner als Alte ?
  798.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  799.                sub.w     42(a0,d5.w),d6
  800.                asr.w     #1,d6
  801.                move.w    d6,d0               ; als X1
  802.                move.w    d0,d2
  803.                add.w     42(a0,d5.w),d2      ; X2 = X1 + AlteAuflösung
  804.                move.w    RezY,d7             ; D7 = (Höhe   - AlteHöhe  )/2
  805.                cmp.w     48(a0,d5.w),d7      ; Neue Höhe kleiner als Alte ?
  806.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  807.                sub.w     48(a0,d5.w),d7
  808.                asr.w     #1,d7
  809.                move.w    d7,d1               ; als Y1
  810.                move.w    d1,d3
  811.                add.w     48(a0,d5.w),d3      ; Y2 = Y1 + AlteAuflösung
  812.                move.w    d6,Dx               ; Alle Werte abspeichern
  813.                move.w    d7,Dy               ;
  814.                move.w    d0,Xa               ;
  815.                move.w    d1,Ya               ;
  816.                move.w    d2,Xe               ;
  817.                move.w    d3,Ye               ;
  818.  
  819.                movem.l   d0-d7/a0-a6,-(sp)
  820.                bsr       CallClearFull
  821.                movem.l   (sp)+,d0-d7/a0-a6
  822.  
  823.                bsr       draw_rect           ; Das gefüllte Rechteck zeichnen
  824. ;-------------------------------------------------------------
  825.                move.w    d6,Max              ; In welche Richtung ist der
  826.                cmp.w     d6,d7               ; Zugewinn am größten ?
  827.                blt       grow_box            ;
  828.                move.w    d7,Max              ;
  829. grow_box:      move.w    #1,d6               ; Zaehler
  830. grow_loop:     
  831.                clr.w     d7                  ; Schleife für die größer werdenden
  832.                move.w    Dx,d4               ; Rechtecke. Die Bewegung soll
  833.                mulu.w    d6,d4               ; proportional verlaufen...
  834.                divu.w    Max,d4              ; ...deswegen der ganze Hermann
  835.                move.w    Dy,d5               ;
  836.                mulu.w    d6,d5
  837.                divu.w    Max,d5
  838.  
  839.                cmpi.w    #0,d0               ; X links oben
  840.                beq       no_d0
  841.                move.w    Xa,d0
  842.                sub.w     d4,d0
  843.                addq.w    #1,d7
  844. no_d0:         cmpi.w    #0,d1               ; Y links oben
  845.                beq       no_d1
  846.                move.w    Ya,d1
  847.                sub.w     d5,d1
  848.                addq.w    #1,d7
  849. no_d1:         cmp.w     RezX,d2             ; X rechts unten
  850.                beq       no_d2
  851.                move.w    Xe,d2
  852.                add.w     d4,d2
  853.                addq.w    #1,d7
  854. no_d2:         cmp.w     RezY,d3             ; Y rechts unten
  855.                beq       no_d3
  856.                move.w    Ye,d3
  857.                add.w     d5,d3
  858.                addq.w    #1,d7
  859. no_d3:         bsr       draw_box            ; das Rechteck zeichnen
  860. ;-----------------------------
  861.                addq.w    #1,d6               ;
  862.                tst.w     d7                  ; Solange sich noch was ändert
  863.                bne       grow_loop           ; die Rechteckschleife wiederholen
  864.  
  865. EndIntro:      bsr       ResetCursor
  866.                bra       ScreenCopy
  867.  
  868. ;-----------------------------
  869. set_color:     movea.l   LineA,a0            ; Farbe setzen
  870.                move.w    d0,col_bit0(a0)     ;
  871.                move.w    d0,col_bit1(a0)     ;
  872.                move.w    d0,col_bit2(a0)     ;
  873.                move.w    d0,col_bit3(a0)     ;
  874.                rts       
  875. ;---------------------------------
  876. draw_box:      movea.l   LineA,a0            ; Ein Rechteck aus Linien zeichnen
  877.                clr.w     wmode(a0)           ; d0/d1 linke  obere  Ecke
  878.                move.w    #$ffff,lnmask(a0)   ; d2/d3 rechte untere Ecke
  879.                move.w    #1,lstlin(a0)
  880.                move.w    d0,x1(a0)
  881.                move.w    d1,y1(a0)
  882.                move.w    d2,x2(a0)
  883.                move.w    d1,y2(a0)
  884.                bsr       draw_line           ; Oben
  885.                movea.l   LineA,a0
  886.                move.w    d2,x1(a0)
  887.                move.w    d1,y1(a0)
  888.                move.w    d2,x2(a0)
  889.                move.w    d3,y2(a0)
  890.                bsr       draw_line           ; Rechts
  891.                movea.l   LineA,a0
  892.                move.w    d2,x1(a0)
  893.                move.w    d3,y1(a0)
  894.                move.w    d0,x2(a0)
  895.                move.w    d3,y2(a0)
  896.                bsr       draw_line           ; Unten
  897.                movea.l   LineA,a0
  898.                move.w    d0,x1(a0)
  899.                move.w    d1,y1(a0)
  900.                move.w    d0,x2(a0)
  901.                move.w    d3,y2(a0)
  902.                bsr       draw_line           ; Links
  903.                rts       
  904. ;-----------------------------
  905. draw_diag:     movea.l   LineA,a0            ; Diagonalen zeichnen
  906.                move.w    d0,x1(a0)           ;
  907.                move.w    d1,y1(a0)           ; Parameter wie oben
  908.                move.w    d2,x2(a0)           ;
  909.                move.w    d3,y2(a0)
  910.                bsr       draw_line           ; Diagonale links
  911.                movea.l   LineA,a0
  912.                move.w    d2,x1(a0)
  913.                move.w    d1,y1(a0)
  914.                move.w    d0,x2(a0)
  915.                move.w    d3,y2(a0)
  916.                bsr       draw_line           ; Diagonale rechts
  917. EndBox:        rts       
  918. ;-----------------------------
  919. draw_line:     movem.l   d0-d7,-(sp)         ; Einzelne Linie Ziehen
  920.                .DC.w $a003
  921.                movem.l   (sp)+,d0-d7
  922.                rts       
  923. ;-----------------------------
  924. pattern:       .DC.w $ffff                   ; Fuellmuster
  925. ;-----------------------------
  926. draw_rect:     movem.l   d0-d7,-(sp)         ; Ein Rechteck zeichnen
  927.                movea.l   LineA,a0            ;
  928.                mê@ÇOנננכFAÇ✓é⇧üבÄGאOנננננננijOëוij    הOüéÇ✓OנÇ ê⇦êOנÿ ✓ppנננננננננננננננî⇧äijÇOננננÇ    êCÄGאOננננננננננijOëגij    גOäê ⇨üêOÇüê⇦êOÿ           move.w    d2,d3               ;
  929. Copy_2:        clr.b     (a0)+               ;
  930.                dbf       d3,Copy_2           ; Zeile bis Ende löschen
  931.                dbf       d1,CopyLoop         ;
  932.  
  933.                bsr       CallClearScreen
  934.                bsr       ResetCursor         ; CursorAddr bestimmen
  935.                movem.l   (sp)+,d0-d7
  936.                rts       
  937. ;#####################################################################
  938. ; Neue CursorAddresse bestimmen
  939. ;
  940. ResetCursor:   movea.l   LineA,a0            ;
  941.                move.l    BasAdd,v_cur_add(a0)     ;  Neue Addresse
  942.                move.w    v_cur_y(a0),d0      ;    = V_bas_add
  943.                mulu.w    v_cel_wr(a0),d0     ;
  944.                add.l     d0,v_cur_add(a0)    ;      + y * cel_wr
  945.                move.w    v_cur_x(a0),d0      ;
  946.                bclr.l    #0,d0               ;      + x^1 * v_planes
  947.                mulu.w    v_planes(a0),d0     ;
  948.                add.l     d0,v_cur_add(a0)    ;      + x^1 * planes
  949.                move.w    v_cur_x(a0),d0      ;
  950.                andi.l    #$fffe,d0           ;
  951.                add.w     d0,v_cur_add(a0)    ;      + x&1
  952.                clr.l     d0                  ;
  953.                move.w    v_cur_of(a0),d0     ;
  954.                add.l     d0,v_cur_add(a0)    ;      + cursor_offset
  955.                rts       
  956. ;#############################################################
  957. ;#
  958. ;# INTRO GrowBox Effekt und Sound
  959. ;#
  960. ;#############################################################
  961.  
  962. Intro:         bsr       ScreenSave
  963.                pea       SoundTab(pc)        ; Sound abspielen
  964.                move.w    #Dosound,-(sp)
  965.                trap      #xbios
  966.                addq.l    #6,sp
  967. ;-----------------------------
  968.                clr.w     d0
  969.                bsr       set_color
  970.                move.w    Reso,d5             ; Aktuelle Aufösung
  971.                add.w     d5,d5               ; mal 2 als Word-Offset in Tabelle
  972.                lea.l     ScreenTab(pc),a0
  973.                move.w    RezX,d6             ; D6 = (Breite - AlteBreite)/2
  974.                cmp.w     42(a0,d5.w),d6      ; Neue Breite kleiner als Alte ?
  975.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  976.                sub.w     42(a0,d5.w),d6
  977.                asr.w     #1,d6
  978.                move.w    d6,d0               ; als X1
  979.                move.w    d0,d2
  980.                add.w     42(a0,d5.w),d2      ; X2 = X1 + AlteAuflösung
  981.                move.w    RezY,d7             ; D7 = (Höhe   - AlteHöhe  )/2
  982.                cmp.w     48(a0,d5.w),d7      ; Neue Höhe kleiner als Alte ?
  983.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  984.                sub.w     48(a0,d5.w),d7
  985.                asr.w     #1,d7
  986.                move.w    d7,d1               ; als Y1
  987.                move.w    d1,d3
  988.                add.w     48(a0,d5.w),d3      ; Y2 = Y1 + AlteAuflösung
  989.                move.w    d6,Dx               ; Alle Werte abspeichern
  990.                move.w    d7,Dy               ;
  991.                move.w    d0,Xa               ;
  992.                move.w    d1,Ya               ;
  993.                move.w    d2,Xe               ;
  994.                move.w    d3,Ye               ;
  995.  
  996.                movem.l   d0-d7/a0-a6,-(sp)
  997.                bsr       CallClearFull
  998.                movem.l   (sp)+,d0-d7/a0-a6
  999.  
  1000.                bsr       draw_rect           ; Das gefüllte Rechteck zeichnen
  1001. ;-------------------------------------------------------------
  1002.                move.w    d6,Max              ; In welche Richtung ist der
  1003.                cmp.w     d6,d7               ; Zugewinn am größten ?
  1004.                blt       grow_box            ;
  1005.                move.w    d7,Max              ;
  1006. grow_box:      move.w    #1,d6               ; Zaehler
  1007. grow_loop:     
  1008.                clr.w     d7                  ; Schleife für die größer werdenden
  1009.                move.w    Dx,d4               ; Rechtecke. Die Bewegung soll
  1010.                mulu.w    d6,d4               ; proportional verlaufen...
  1011.                divu.w    Max,d4              ; ...deswegen der ganze Hermann
  1012.                move.w    Dy,d5               ;
  1013.                mulu.w    d6,d5
  1014.                divu.w    Max,d5
  1015.  
  1016.                cmpi.w    #0,d0               ; X links oben
  1017.                beq       no_d0
  1018.                move.w    Xa,d0
  1019.                sub.w     d4,d0
  1020.                addq.w    #1,d7
  1021. no_d0:         cmpi.w    #0,d1               ; Y links oben
  1022.                beq       no_d1
  1023.                move.w    Ya,d1
  1024.                sub.w     d5,d1
  1025.                addq.w    #1,d7
  1026. no_d1:         cmp.w     RezX,d2             ; X rechts unten
  1027.                beq       no_d2
  1028.                move.w    Xe,d2
  1029.                add.w     d4,d2
  1030.                addq.w    #1,d7
  1031. no_d2:         cmp.w     RezY,d3             ; Y rechts unten
  1032.                beq       no_d3
  1033.                move.w    Ye,d3
  1034.                add.w     d5,d3
  1035.                addq.w    #1,d7
  1036. no_d3:         bsr       draw_box            ; das Rechteck zeichneo_Sub
  1037.                bra       ChangeClear
  1038. NoSub:         cmpi.w    #78,d0              ; +
  1039.                bne       NoAdd
  1040.                bsr       Do_Add
  1041.                bra       ChangeClear
  1042. NoAdd:         cmpi.w    #25,d0              ; P
  1043.                bne       NoP
  1044.                bsr       Do_Phys
  1045.                bra       ChangeClear
  1046. NoP:           cmpi.w    #46,d0              ; C
  1047.                bne       NoC
  1048.                bsr       Do_Activ
  1049.                bra       ChangeClear
  1050. NoC:           cmpi.w    #35,d0              ; H
  1051.                bne       NoH
  1052.                bsr       ResoChangeTest
  1053.                bne       ChangeClear
  1054.                move.w    #2,d0
  1055.                bra       SetScreenReso
  1056. NoH:           cmpi.w    #50,d0              ; M
  1057.                bne       NoM
  1058.                bsr       ResoChangeTest
  1059.                bne       ChangeClear
  1060.                move.w    #1,d0
  1061.                bra       SetScreenReso
  1062. NoM:           cmpi.w    #38,d0              ; L
  1063.                bne       EndChange
  1064.                bsr       ResoChangeTest
  1065.                bne       ChangeClear
  1066.                move.w    #0,d0
  1067.                bra       SetScreenReso
  1068.  
  1069. EndChange:     rts       
  1070. ChangeClear:   bra       CallClearFull
  1071. ;----------------------------------------------
  1072. ClearPal:      move.w    vid_pal3,Pal3Save   ; Farbregister 3 retten
  1073.                move.w    vid_palF,PalFSave
  1074.                clr.w     vid_pal3            ; auf schwarz setzen
  1075.                clr.w     vid_palF
  1076.                rts       
  1077. CallClearPal:  move.w    sr,d0
  1078.                btst      #13,d0
  1079.                beq       DoCallClearPa
  1080.                bra       ClearPal
  1081. DoCallClearPa: pea       ClearPal(pc)        ; Farbregister 3 löschen
  1082.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  1083.                trap      #xbios              ;
  1084.                addq.l    #6,sp
  1085.                rts       
  1086. ;----------------------------------------------
  1087. RestorePal:    move.w    Pal3Save,vid_pal3   ; Farbregister 3 zurück
  1088.                move.w    PalFSave,vid_palF
  1089.                rts       
  1090. CallRestorePal:          
  1091.                move.w    sr,d0
  1092.                btst      #13,d0
  1093.                beq       DoCallRestore
  1094.                bra       RestorePal
  1095. DoCallRestore: pea       RestorePal(pc)      ; Farbregister 3 löschen
  1096.                move.w    #Supexec,-(sp)      ; Supervisormodus durchführen
  1097.                trap      #xbios              ;
  1098.                addq.l    #6,sp
  1099.                rts       
  1100. ;----------------------------------------------
  1101. InitReso:      move.w    #8,Y_Inc
  1102.                move.w    Reso,d0             ; Aktuelle Auflösung
  1103.                cmpi.w    #2,d0               ;
  1104.                bne       NoHighReso          ;
  1105.                move.w    #16,Y_Inc           ;     Y-Inkrement feststellen
  1106. ;-----------------------------
  1107. NoHighReso:    move.l    #8,d1               ;
  1108.                tst.w     d0
  1109.                beq       InitOffset
  1110.                asr.l     d0,d1               ;
  1111. InitOffset:    move.l    d1,Off_Inc          ;     Offset-Inkrement festlegen
  1112. ;-----------------------------
  1113.                clr.l     d1                  ;     @⇨נâij⇩Oêê⇦⇧ä⇧ê⇧üê≡pנננננננננננננננÇê@ÇOנננëוIJëהOננננננננננננננijppנננננננננננננננÄ    ëå@ÇOנננכFAëהOננננננננננננננijppנננננננננננננננÇê@ÇOנננכFAëגנננננננננננננננijppנננננננננננננננÄ⇦⇧ijÇOננננëהAëגנננננננננננננננijOהOIJIJנבäê⇦@BppנננננננננננננננÇ⇧Ç@ÇOנננ£çæIJëגננננננננננננננijppנננננננננננננננÇê@ÇOנננëגIJâÇ⓪⇨ננננננננננננijOÉ⇨âנijO£çüנijנהovea.l   LineA,a0            ;
  1114.                move.l    BasAdd,v_cur_add(a0)     ;  Neue Addresse
  1115.                move.w    v_cur_y(a0),d0      ;    = V_bas_add
  1116.                mulu.w    v_cel_wr(a0),d0     ;
  1117.                add.l     d0,v_cur_add(a0)    ;      + y * cel_wr
  1118.                move.w    v_cur_x(a0),d0      ;
  1119.                bclr.l    #0,d0               ;      + x^1 * v_planes
  1120.                mulu.w    v_planes(a0),d0     ;
  1121.                add.l     d0,v_cur_add(a0)    ;      + x^1 * planes
  1122.                move.w    v_cur_x(a0),d0      ;
  1123.                andi.l    #$fffe,d0           ;
  1124.                add.w     d0,v_cur_add(a0)    ;      + x&1
  1125.                clr.l     d0                  ;
  1126.                move.w    v_cur_of(a0),d0     ;
  1127.                add.l     d0,v_cur_add(a0)    ;      + cursor_offset
  1128.                rts       
  1129. ;#############################################################
  1130. ;#
  1131. ;# INTRO GrowBox Effekt und Sound
  1132. ;#
  1133. ;#############################################################
  1134.  
  1135. Intro:         bsr       ScreenSave
  1136.                pea       SoundTab(pc)        ; Sound abspielen
  1137.                move.w    #Dosound,-(sp)
  1138.                trap      #xbios
  1139.                addq.l    #6,sp
  1140. ;-----------------------------
  1141.                clr.w     d0
  1142.                bsr       set_color
  1143.                move.w    Reso,d5             ; Aktuelle Aufösung
  1144.                add.w     d5,d5               ; mal 2 als Word-Offset in Tabelle
  1145.                lea.l     ScreenTab(pc),a0
  1146.                move.w    RezX,d6             ; D6 = (Breite - AlteBreite)/2
  1147.                cmp.w     42(a0,d5.w),d6      ; Neue Breite kleiner als Alte ?
  1148.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  1149.                sub.w     42(a0,d5.w),d6
  1150.                asr.w     #1,d6
  1151.                move.w    d6,d0               ; als X1
  1152.                move.w    d0,d2
  1153.                add.w     42(a0,d5.w),d2      ; X2 = X1 + AlteAuflösung
  1154.                move.w    RezY,d7             ; D7 = (Höhe   - AlteHöhe  )/2
  1155.                cmp.w     48(a0,d5.w),d7      ; Neue Höhe kleiner als Alte ?
  1156.                blt       EndIntro            ;     ja -> Nur Schirm kopieren
  1157.                sub.w     48(a0,d5.w),d7
  1158.                asr.w     #1,d7
  1159.                move.w    d7,d1               ; als Y1
  1160.                move.w    d1,d3
  1161.                add.w     48(a0,d5.w),d3      ; Y2 = Y1 + AlteAuflösung
  1162.                move.w    d6,Dx               ; Alle Werte abspeichern
  1163.                move.w    d7,Dy               ;
  1164.                move.w    d0,Xa               ;
  1165.                move.w    d1,Ya               ;
  1166.                move.w    d2,Xe               ;
  1167.                move.w    d3,Ye               ;
  1168.  
  1169.                movem.l   d0-d7/a0-a6,-(sp)
  1170.                bsr       CallClearFull
  1171.                movem.l   (sp)+,d0-d7/a0-a6
  1172.  
  1173.                bsr       draw_rect           ; Das gefüllte Rechteck zeichnen
  1174. ;-------------------------------------------------------------
  1175.                move.w    d6,Max              ; In welche Richtung ist der
  1176.                cmp.w     d6,d7               ; Zugewinn am größten ?
  1177.                blt       grow_box            ;
  1178.                move.w    d7,Max              ;
  1179. grow_box:      move.w    #1,d6               ; Zaehler
  1180. grow_loop:     
  1181.                clr.w     d7                  ; Schleife für die größer werdenden
  1182.                move.w    Dx,d4               ; Rechtecke. Die Bewegung soll
  1183.                mulu.w    d6,d4               ; proportional verlaufen...
  1184.                divu.w    Max,d4              ; ...deswegen der ganze Hermann
  1185.                move.w    Dy,d5               ;
  1186.                mulu.w    d6,d5
  1187.                divu.w    Max,d5
  1188.  
  1189.                cmpi.w    #0,d0               ; X links oben
  1190.                beq       no_d0
  1191.                move.w    Xa,d0
  1192.                sub.w     d4,d0
  1193.                addq.w    #1,d7
  1194. no_d0:         cmpi.w    #0,d1               ; Y links oben
  1195.                beq       no_d1
  1196.                move.w    Ya,d1
  1197.                sub.w     d5,d1
  1198.                addq.w    #1,d7
  1199. no_d1:         cmp.w     RezX,d2             ; X rechts unten
  1200.                beq       no_d2
  1201.                move.w    Xe,d2
  1202.                add.w     d4,d2
  1203.                addq.w    #1,d7
  1204. no_d2:         cmp.w     RezY,d3             ; Y rechts unten
  1205.                beq       no_d3
  1206.                move.w    Ye,d3
  1207.                add.w     d5,d3
  1208.                addq.w    #1,d7
  1209. no_d3:         bsr       draw_box            ; das Rechteck zeichne  Off_Inc,d0          ; Linke obere Ecke nach rechts
  1210.                add.l     d0,(a0)
  1211.                bra       CallSetOverscan
  1212. ;-----------------------------
  1213. Do_Sub:        movea.l   Off_Add,a0          ; Offset erhöhen
  1214.                clr.l     d0
  1215.                move.w    BpL,d0              ; Linke obere Ecke nach oben
  1216.                sub.l     d0,(a0)
  1217.                bra       CallSetOverscan
  1218. ;-----------------------------
  1219. Do_Add:        movea.l   Off_Add,a0          ; Offset erhöhen
  1220.                clr.l     d0
  1221.                move.w    BpL,d0              ; Linke obere Ecke nach unten
  1222.                add.l     d0,(a0)
  1223.                bra       CallSetOverscan
  1224. ;-----------------------------
  1225. Do_Phys:       move.w    TruePhys,d0         ; Den jetzigen Zustand ausgeben
  1226.                tst.w     d0
  1227.                bne       PhysIsOn
  1228.                pea       msg_phys_on(pc)
  1229.                bra       Write_phys
  1230. PhysIsOn:      pea       msg_phys_off(pc)
  1231. Write_phys:    move.w    #Cconws,-(sp)
  1232.                trap      #gemdos
  1233.                addq.l    #6,sp
  1234.                move.w    #Cnecin,-(sp)
  1235.                trap      #gemdos
  1236.                addq.l    #2,sp
  1237.                swap.w    d0
  1238.                cmpi.w    #44,d0              ; Nur bei 'Y'
  1239.                bne       EndPhys
  1240.                not.w     TruePhys            ; -> Zustand ändern
  1241. EndPhys:       rts       
  1242. ;-----------------------------
  1243. Do_Activ:      move.b    ActivateKey,d0      ; Den jetzigen Zustand ausgeben
  1244.                cmpi.b    #9,d0
  1245.                beq       ActivShift
  1246.                pea       msg_shift_off(pc)
  1247.                bra       Write_Shift
  1248. ActivShift:    pea       msg_shift_on(pc)
  1249. Write_Shift:   move.w    #Cconws,-(sp)
  1250.                trap      #gemdos
  1251.                addq.l    #6,sp
  1252.                move.w    #Cnecin,-(sp)
  1253.                trap      #gemdos
  1254.                addq.l    #2,sp
  1255.                swap.w    d0
  1256.                cmpi.w    #49,d0              ; Nur bei 'N'
  1257.                bne       EndShift
  1258.                bchg      #0,ActivateKey      ; Zustand ändern
  1259. EndShift:      rts       
  1260.  
  1261. ;-----------------------------
  1262. ResoChangeTest:          
  1263.                pea       msg_change(pc)      ; Hilfstext ausgeben
  1264.                move.w    #Cconws,-(sp)
  1265.                trap      #gemdos
  1266.                addq.l    #6,sp
  1267.                move.w    #Cnecin,-(sp)
  1268.                trap      #gemdos
  1269.                addq.l    #2,sp
  1270.                swap.w    d0
  1271.                cmpi.w    #44,d0
  1272.                rts       
  1273. ;-----------------------------
  1274. SetScreenReso: move.w    d0,-(sp)            ; Neue Auflösung mit Setscreen
  1275.                move.l    #-1,-(sp)           ; setzen
  1276.                move.l    #-1,-(sp)           ;
  1277.                move.w    #Setscreen,-(sp)    ;
  1278.                trap      #xbios              ;
  1279.                lea.l     $c(sp),sp
  1280.                bsr       CallSetOverscan     ; Overscan neu installieren
  1281.                bsr       CallClearFull       ;
  1282.                bra       InitReso            ; und initialisieren
  1283. ;-----------------------------
  1284. DrawSetup:     bsr       set_color           ;  Box mit Diagonalen zeichnen
  1285.                move.w    #0,d0
  1286.                move.w    #0,d1
  1287.                move.w    RezX,d2
  1288.                subq.w    #1,d2
  1289.                move.w    RezY,d3
  1290.                subq.w    #1,d3
  1291.                bsr       draw_box
  1292.                bra       draw_diag
  1293. ;-----------------------------
  1294. WriteSetup:    lea.l     user_x(pc),a1       ;  Zahlenwerte schreiben
  1295.                move.w    RezX,d0
  1296.                bsr       WriteDec
  1297.                lea.l     user_y(pc),a1
  1298.                move.w    RezY,d0
  1299.                bsr       WriteDec
  1300.                lea.l     user_off(pc),a1
  1301.                move.w    Offset,d0
  1302.                bra       WriteHex
  1303. ;-----------------------------
  1304. WriteDec:      movem.l   d0-d7,-(sp)         ; Zahlen ausgabe in Dezimal
  1305.                lea.l     end_number(pc),a0   ; Alten String löschen
  1306.                move.w    #3,d2               ;
  1307. WriteClr:      move.b    #' ',-(a0)          ;
  1308.                dbf       d2,WriteClr         ;
  1309.                lea.l     end_number(pc),a0   ;
  1310.                swap.w    d0                  ; Oberen Werte löschen
  1311.                clr.w     d0
  1312.                swap.w    d0
  1313. WriteLp:       divu.w    #10,d0
  1314.                swap.w    d0
  1315.                move.w    d0,d1
  1316.                clr.w     d0                  ; Modulo Rest löschen
  1317.                swap.w    d0
  1318.                addi.w    #'0',d1
  1319.                move.b    d1,-(a0)
  1320.                tst.l     d0
  1321.                bne       WriteLp
  1322. ;--------------------- @FûÉ #KCBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓§ÖK¢✓✓✓✓⑧LK♪Jץ
  1323. H✓✓✓✓✓✓✓✓✓✓✓ז⑤⑨^✓⑧]\ךךXÖ[âBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓§ÖK¥ז✓✓✓✓סןףף¥ץי♪Jץ
  1324. CBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓ÿ\✓✓✓✓✓✓✓ךך[YץבBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓⑧Y⑨K¢✓✓✓✓✓לïץ⇨Bê✓✓✓✓✓✓✓✓✓✓✓✓✓✓⑨XH✓✓✓✓✓✓\ך\ùף¥[XÖ\è⑧טH✓✓✓✓ז⑥ÿZÖZ[⑨H⑧]\ךךXÖ[âBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓§ÖK¥ז✓✓✓✓סןףף¥ץי♪Jץ
  1325. CBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓ÿ\✓✓✓✓✓✓✓ךך[YץבBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓⑧Y⑨K¢✓✓✓✓✓לïץ⇨Bê✓✓✓✓✓✓✓✓✓✓✓✓✓✓§Ö[K¢✓✓✓
  1326. ץ
  1327. Jי⑨ ♪Y
  1328. בBê✓✓✓✓✓✓✓✓✓✓✓✓✓✓¥ז✓✓✓✓✓✓
  1329. ;-----------------------------
  1330. WriteHex:      movem.l   d0-d7,-(sp)         ; Zahlen Ausgabe in Hexadezimal
  1331.                lea.l     end_number(pc),a0   ; Alten String löschen
  1332.                move.w    #3,d2
  1333. WriteHlp:      move.b    d0,d1
  1334.                andi.w    #$f,d1
  1335.                cmpi.w    #9,d1
  1336.                ble       NotAF
  1337.                subi.w    #10,d1
  1338.                addi.w    #'A',d1
  1339.                bra       WriteIt
  1340. NotAF:         addi.w    #'0',d1
  1341. WriteIt:       move.b    d1,-(a0)
  1342.                asr.w     #4,d0
  1343.                dbf       d2,WriteHlp
  1344. ;-----------------------------
  1345.                move.l    a1,-(sp)            ; Text ausgeben
  1346.                move.w    #Cconws,-(sp)
  1347.                trap      #gemdos
  1348.                addq.l    #6,sp
  1349.                pea       user_number(pc)     ; Zahlzeile ausgeben
  1350.                move.w    #Cconws,-(sp)
  1351.                trap      #gemdos
  1352.                addq.l    #6,sp
  1353.                movem.l   (sp)+,d0-d7
  1354.                rts       
  1355. ;#############################################################
  1356. ; eigene Versionen der DrawSprite und UndrawSprite Routinen
  1357. ; die nicht auf 32KB Bildschirmspeicher begrenzt sind.
  1358. ;
  1359. ; mit einigen Anpassungen für OVERSCAN
  1360. ; von Bernd Gebauer 31.05.89
  1361. ;
  1362.  
  1363. DrawSprite:    
  1364. ; Parameter
  1365. ; D0.W : X-Koordinate des Aktionspunktes des Sprites auf Schirm
  1366. ; D1.W : Y-Koordinate
  1367. ; A0   : Zeiger auf SDB-Struktur
  1368. ; A2   : Zeiger auf Sprite-Save-Buffer ( #Farbebenen*64 + 10 )
  1369.  
  1370.                move.w    6(a0),-(sp)         ; bgcol retten
  1371.                move.w    8(a0),-(sp)         ; fgcol retten
  1372.  
  1373.                clr.w     d2
  1374.                tst.w     4(a0)               ; form ( 1=VDI , -1=XOR )
  1375.                bge.s     lab_1
  1376.                moveq.l   #16,d2
  1377. lab_1:         
  1378.                move.w    d2,-(sp)            ; offset retten
  1379.  
  1380.                clr.w     d2
  1381.                bclr      #1,6(a2)
  1382.                sub.w     0(a0),d0            ; X -= xhot
  1383.                bcs.s     lab_2
  1384.  
  1385.                move.w    RezX,d3
  1386.                subi.w    #15,d3
  1387.                cmp.w     d3,d0               ; xhot > XRez-15 ?
  1388.                bhi.s     lab_4               ; ja, weiter
  1389.                bset      #1,6(a2)            ; Clipflag setzen
  1390.                bra.s     lab_3
  1391. ;-------------
  1392. lab_2:         
  1393.                addi.w    #16,d0
  1394.                moveq.l   #8,d2
  1395.                bra.s     lab_3
  1396. ;-------------
  1397. lab_4:         
  1398.                moveq.l   #16,d2
  1399. lab_3:         
  1400.  
  1401.                sub.w     2(a◆אV2⑧ç              sub.w     d5,d1
  1402.                addq.w    #1,d7
  1403. no_d1:         cmp.w     RezX,d2             ; X rechts unten
  1404.                beq       no_d2
  1405.                move.w    Xe,d2
  1406.                add.w     d4,d2
  1407.                addq.w    #1,d7
  1408. no_d2:         cmp.w     RezY,d3             ; Y rechts unten
  1409.                beq       no_d3
  1410.                move.w    Ye,d3
  1411.                add.w     d5,d3
  1412.                addq.w    #1,d7
  1413. no_d3:         bsr       draw_box            ; das Rechteck zeichne
  1414.                clr.w     d1
  1415.                bra.s     lab_7
  1416. ;-------------
  1417. lab_6:         
  1418.                move.w    RezY,d5
  1419.                sub.w     d1,d5
  1420.                addq.w    #1,d5
  1421. lab_7:         
  1422. ; D0 = X , D1 = Y
  1423.                bsr       CalcScreenPos
  1424. ; D0 = X mod 15 , D1.L = offset vom Bildschirmanfang
  1425.  
  1426.                movea.l   v_bas_add,a1        ; Bildspeicheradresse
  1427.                adda.l    d1,a1               ; + offset
  1428.  
  1429.                lea.l     func_2,a3
  1430.                move.w    d0,d6               ; X mod 15
  1431.                cmpi.w    #8,d6               ; (X mod 15) < 8 ?
  1432.                bcs.s     lab_8               ; ja, weiter
  1433.                lea.l     func_1,a3
  1434.                move.w    #16,d6
  1435.                sub.w     d0,d6               ; 16 - (X mod 15)
  1436. lab_8:         
  1437.  
  1438.                movea.l   tab1(pc,d2.w),a5
  1439.                movea.l   tab1+4(pc,d2.w),a6
  1440.                move.w    VPlanes,d2
  1441.                move.w    d2,d3
  1442.                add.w     d3,d3
  1443.                move.w    BpL,d4
  1444.                move.l    a1,2(a2)
  1445.                move.w    d5,0(a2)
  1446.                bset      #0,6(a2)
  1447.                lea.l     8(a2),a2
  1448.                move.l    a1,d7
  1449.                move.w    d5,d1
  1450.                bra.s     lab_9
  1451.  
  1452. ;-----------------------------------------------------
  1453.  
  1454. tab1:          
  1455.                .DC.l proc_1
  1456.                .DC.l proc_2
  1457.                .DC.l proc_3
  1458.                .DC.l proc_4
  1459.                .DC.l proc_5
  1460.                .DC.l proc_6
  1461.  
  1462. ;-----------------------------------------------------
  1463.  
  1464. loop_1:        
  1465.                clr.w     d0
  1466.                lsr.w     2(sp)
  1467.                addx.w    d0,d0
  1468.                lsr.w     4(sp)
  1469.                roxl.w    #3,d0
  1470.                add.w     0(sp),d0
  1471.                movea.l   tab2(pc,d0.w),a4
  1472.                movem.l   d1/d2,-(sp)
  1473.                jsr       (a6)
  1474.                movem.l   (sp)+,d1/d2
  1475.                move.w    d1,d5
  1476.                lsl.w     #2,d5
  1477.                suba.w    d5,a0
  1478.                move.w    d1,d5
  1479.                addq.l    #2,d7
  1480.                movea.l   d7,a1
  1481. lab_9:         
  1482.                dbra      d2,loop_1
  1483.                addq.l    #6,sp
  1484.                rts       
  1485.  
  1486. ;-----------------------------------------------------
  1487.  
  1488. tab2:          
  1489.                .DC.l proc_7
  1490.                .DC.l proc_8
  1491.                .DC.l proc_9
  1492.                .DC.l proc_a
  1493.                .DC.l proc_b
  1494.                .DC.l proc_c
  1495.                .DC.l proc_d
  1496.                .DC.l proc_e
  1497. ;-----------------------------------------------------
  1498.  
  1499. loop_2:        
  1500.                move.w    (a1),d2
  1501.                swap.w    d2
  1502.                move.w    0(a1,d3.w),d2
  1503.                move.l    d2,(a2)+
  1504.                jmp       (a3)
  1505. ;-------------
  1506. proc_1:        
  1507.                move.w    d2,0(a1,d3.w)
  1508.                swap.w    d2
  1509.                move.w    d2,(a1)
  1510.                adda.w    d4,a1
  1511. proc_2:        
  1512.                dbra      d5,loop_2
  1513.                rts       
  1514.  
  1515. ;-----------------------------------------------------
  1516.  
  1517. loop_3:        
  1518.                move.w    (a1),d2
  1519.                move.w    d2,(a2)+
  1520.                jmp       (a3)
  1521. ;-------------
  1522. proc_3:        
  1523.                move.w    d2,(a1)
  1524.                adda.w    d4,a1
  1525. proc_4:        
  1526.                dbra      d5,loop_3
  1527.                rts       
  1528.  
  1529. ;-----------------------------------------------------
  1530.  
  1531. loop_4:        
  1532.                move.w    (a1),d2
  1533.                move.w    d2,(a2)+
  1534.                swap.w    d2
  1535.                jmp       (a3)
  1536. ;-------------
  1537. proc_5:        
  1538.                swap.w    d2
  1539.                move.w    d2,(a1)
  1540.                adda.w    d4,a1
  1541. proc_6:        
  1542.                dbra      d5,loop_4
  1543.                rts       
  1544.  
  1545. ;-----------------------------------------------------
  1546.  
  1547. func_1:        
  1548.                moveq.l   #0,d0
  1549.                move.w    (a0)+,d0
  1550.                rol.l     d6,d0
  1551.                moveq.l   #0,d1
  1552.                move.w    (a0)+,d1
  1553.                rol.l     d6,d1
  1554.                jmp       (a4)
  1555. ;-----------------------------------------------------
  1556. func_2:        
  1557.                moveq.l   #0,d0
  1558.                move.w    (a0)+,d0
  1559.                swap.w    d0
  1560.                ror.l     d6,d0
  1561.                moveq.l   #0,d1
  1562.                move.w    (a0)+,d1
  1563.                swap.w    d1
  1564.                ror.l     d6,d1
  1565.                jmp       (a4)
  1566. ;-----------------------------------------------------
  1567. proc_7:        
  1568. ; (~(D0|D1))&D2 --> D2
  1569.                or.l      d1,d0
  1570.                not.l     d0
  1571.                and.l     d0,d2
  1572.                jmp       (a5)
  1573. ;-----------------------------------------------------
  1574. proc_8:        
  1575. ; (D0|D2)&(~D1) --> D2
  1576.                or.l      d0,d2
  1577.                not.l     d1
  1578.                and.l     d1,d2
  1579.                jmp       (a5)
  1580. ;-----------------------------------------------------
  1581. proc_9:        
  1582. ; ((~D0)&D2)|D1 --> D2
  1583.                not.l     d0
  1584.                and.l     d0,d2
  1585.                or.l      d1,d2
  1586.                jmp       (a5)
  1587. ;-----------------------------------------------------
  1588. proc_a:        
  1589. ; (D0|D1|D2) --> D2
  1590.                or.l      d0,d2
  1591.                or.l      d1,d2
  1592.                jmp       (a5)
  1593. ;-----------------------------------------------------
  1594. proc_b:        
  1595. ; (~(D1^D2))&D0 --> D2
  1596.                eor.l     d1,d2
  1597.                not.l     d0
  1598.                and.l     d0,d2
  1599.                jmp       (a5)
  1600. ;-----------------------------------------------------
  1601. proc_c:        
  1602. ; (D0|D2)^D1 --> D2
  1603.                or.l      d0,d2
  1604.                eor.l     d1,d2
  1605.                jmp       (a5)
  1606. ;-----------------------------------------------------
  1607. proc_d:        
  1608. ; ((~D0)&D2)^D1 --> D2
  1609.                not.l     d0
  1610.                and.l     d0,d2
  1611.                eor.l     d1,d2
  1612.                jmp       (a5)
  1613. ;-----------------------------------------------------
  1614. proc_e:        
  1615. ; (D0^D2)|D1 --> D2
  1616.                eor.l     d0,d2
  1617.                or.l      d1,d2
  1618.                jmp       (a5)
  1619. ;-----------------------------------------------------
  1620. UndrawSprite:  
  1621. ; A2 = Zeiger auf SpriteSaveBlock
  1622.                bclr      #0,6(a2)
  1623.                beq       lab_10              ; raus
  1624.                move.w    0(a2),d4            ; xhot
  1625.                move.w    d4,d2               ; xhot
  1626.                subq.w    #1,d2               ; xhot - 1
  1627.                move.w    BpL,d3
  1628.                movea.l   2(a2),a0            ; Zeiger auf Bildschirmoffset
  1629.                lea.l     8(a2),a1            ; Zeiger auf Spritedaten
  1630.                move.w    VPlanes,d5
  1631.                subq.w    #2,d5
  1632.                bhi.s     lab_11
  1633.                beq.s     lab_12
  1634.  
  1635.                btst      #1,6(a2)
  1636.                bne.s     lab_13
  1637. loop_9:        
  1638.                move.w    (a1)+,(a0)
  1639.                adda.w    d3,a0               ; + Bytes per Line
  1640.                dbf       d2,loop_9           ; nächste Zeile
  1641.                rts                           ; raus
  1642. ;-----------------------
  1643. lab_13:        
  1644.                move.l    (a1)+,(a0)
  1645.                adda.w    d3,a0
  1646.                dbra      d2,lab_13
  1647.                rts       
  1648. ;-----------------------------------------------------
  1649. lab_12:        
  1650.                movea.l   a0,a5
  1651.                add.w     d4,d4
  1652.                btst      #1,6(a2)
  1653.                bne.s     lab_14
  1654.                movea.l   a1,a2
  1655.                adda.w    d4,a2
  1656. loop_5:        
  1657.                move.w    (a1)+,(a0)+
  1658.                move.w    (a2)+,(a0)
  1659.                adda.w    d3,a5
  1660.                movea.l   a5,a0
  1661.                dbra      d2,loop_5
  1662.                rts       
  1663. ;-------------
  1664. lab_14:        
  1665.                movea.l   a1,a2
  1666.                adda.w    d4,a2
  1667.                adda.w    d4,a2
  1668. loop_6:        
  1669.                move.w    (a1)+,(a0)+
  1670.                move.w    (a2)+,(a0)+
  1671.                move.w    (a1)+,(a0)+
  1672.                move.w    (a2)+,(a0)
  1673.                adda.w    d3,a5
  1674.                movea.l   a5,a0
  1675.                dbra      d2,loop_6
  1676.                rts       
  1677.  
  1678. ;-----------------------------------------------------
  1679.  
  1680. lab_11:        
  1681.                movea.l   a0,a5
  1682.                add.w     d4,d4
  1683.                btst      #1,6(a2)            ; VDI oder XOR ?
  1684.                bne.s     lab_15              ;
  1685.                movea.l   a1,a2
  1686.                adda.w    d4,a2
  1687.                movea.l   a2,a3
  1688.                adda.w    d4,a3
  1689.                movea.l   a3,a4
  1690.                add.w     d4,d4
  1691. loop_7:        
  1692.                move.w    (a1)+,(a0)+
  1693.                move.w    (a2)+,(a0)+
  1694.                move.w    (a3)+,(a0)+
  1695.                move.w    (a4)+,(a0)
  1696.                adda.w    d3,a5
  1697.                movea.l   a5,a0
  1698.                dbra      d2,loop_7
  1699.                rts       
  1700. ;-------------
  1701. lab_15:        
  1702.                add.w     d4,d4
  1703.                movea.l   a1,a2
  1704.                adda.w    d4,a2
  1705.                movea.l   a2,a3
  1706.                adda.w    d4,a3
  1707.                movea.l   a3,a4
  1708.                adda.w    d4,a4
  1709. loop_8:        
  1710.                move.w    (a1)+,(a0)+
  1711.                move.w    (a2)+,(a0)+
  1712.                move.w    (a3)+,(a0)+
  1713.                move.w    (a4)+,(a0)+
  1714.                move.w    (a1)+,(a0)+
  1715.                move.w    (a2)+,(a0)+
  1716.                move.w    (a3)+,(a0)+
  1717.                move.w    (a4)+,(a0)
  1718.                adda.w    d3,a5
  1719.                movea.l   a5,a0
  1720.                dbra      d2,loop_8
  1721. lab_10:        
  1722.                rts       
  1723. ;-----------------------------------------------------
  1724.  
  1725. CalcScreenPos: 
  1726. ; Parameter :
  1727. ; in :
  1728. ; D0.W = X-Position
  1729. ; D1.W = Y-Position
  1730. ; out :
  1731. ; D0.W = X mod 15
  1732. ; D1.L = offset vom Bildschirmanfang
  1733. ; alle anderen Register unverändert
  1734.  
  1735.                movem.w   d2/d3,-(sp)
  1736.  
  1737.                mulu.w    BpL,d1              ; Y *= Bytes per line
  1738.                clr.l     d2
  1739.                move.w    d0,d2               ; (long) X
  1740.                andi.w    #$fff0,d2
  1741.                move.w    MonPLine,d3
  1742.                asr.l     d3,d2
  1743.                add.l     d2,d1
  1744.                andi.w    #$f,d0              ; X mod 15
  1745.  
  1746.                movem.w   (sp)+,d2/d3
  1747.  
  1748.                rts       
  1749. ;#############################################################
  1750.  
  1751.                .DATA 
  1752.  
  1753. msg_title:     .DC.b 13,10
  1754.                .DC.b '⌠ Overscan Version 1.6    K.Isakovic ⌠',13,10,0
  1755. msg_installed: .DC.b '| installed.              B.Gebauer  |',13,10
  1756.                .DC.b '|                                    |',13,10
  1757.                .DC.b '⌡ Hold Shift-Key for Setup           ⌡',13,10,0
  1758. msg_notactive: .DC.b '⌡ NOT aktivated.          B.Gebauer  ⌡',13,10,0
  1759. msg_noTos:     .DC.b '| NOT installed.          B.Gebauer  |',13,10,7,7
  1760.                .DC.b '⌡ Only with TOS 1.2/1.4 or BETA-TOS  ⌡',13,10,0
  1761. msg_already:   .DC.b '⌡ already installed...    B.Gebauer  ⌡',13,10,7,7,0
  1762.  
  1763. msg_erase:     .DC.b 27,'E',0
  1764. user_x:        .DC.b 27,'Y',33,40,27,'p','X:',0
  1765. user_y:        .DC.b 'Y:',0
  1766. user_off:      .DC.b 'Off:',0
  1767. user_number:   .DC.b '    '
  1768. end_number:    .DC.b ' ',0
  1769.  
  1770. msg_help:      .DC.b 27,'H',27,'p'
  1771.                .DC.b '⌠ OVERSCAN Version 1.6    K.Isakovic ⌠',13,10
  1772.                .DC.b '|    Setup-Menu           B.Gebauer  |',13,10
  1773.                .DC.b '|------------------------------------|',13,10
  1774.                .DC.b '|                                    |',13,10
  1775.                .DC.b '| Cursorkeys : Width & Heigth        |',13,10
  1776.                .DC.b '| Block  / * : Edge left/right       |',13,10
  1777.                .DC.b '| Block  - + : Edge up/down          |',13,10
  1778.                .DC.b '|                                    |',13,10
  1779.                .DC.b '|      P     : Physbase emulation    |',13,10
  1780.                .DC.b '|      C     : Clear screen key      |',13,10
  1781.                .DC.b '|                                    |',13,10
  1782.                .DC.b '|    L M H   : Low Middle High Res.  |',13,10
  1783.                .DC.b '|                                    |',13,10
  1784.                .DC.b '|      S     : Save & Quit           |',13,10
  1785.                .DC.b '|      Q     : Quit without saving   |',13,10
  1786.                .DC.b '|                                    |',13,10
  1787.                .DC.b '|     Help   : This page             |',13,10
  1788.                .DC.b '|                                    |',13,10
  1789.                .DC.b '|------------------------------------|',13,10
  1790.                .DC.b '⌡   Press Return...                  ⌡',13,10,0
  1791.  
  1792. msg_change:    .DC.b 10,10
  1793.                .DC.b 13,10,'       Change Resolution.'
  1794.                .DC.b 13,10,'     Are you shure (y/n) ?',0
  1795.  
  1796. msg_phys_on:   .DC.b 10,10,13,10,'     Physbase emulation on  (y/n)',0
  1797. msg_phys_off:  .DC.b 10,10,13,10,'     Physbase emulation off (y/n)',0
  1798.  
  1799. msg_shift_on:  .DC.b 10,10,13,10,' Clear-screen with RIGHT-SHIFT/ALT/HELP (y/n)',0
  1800. msg_shift_off: .DC.b 10,10,13,10,' Clear-screen with ALT/HELP  (y/n)',0
  1801.  
  1802. save_name:     .DC.b 'A:\AUTO\OVERSCAN.PRG',0
  1803.  
  1804. msg_save:      .DC.b 27,'q',13,10,'  Setup saved...',13,10,0
  1805. msg_notfound:  .DC.b 27,'q',' not found !',13,10
  1806.                .DC.b 'press < Return > ',13,10,0
  1807. msg_nosave:    .DC.b 27,'q',13,10,'  Setup not saved...'
  1808.                .DC.b 13,10,0
  1809. SoundTab:      .DC.b 0,112,1,4,2,56,3,2,4,28,5,1
  1810.                .DC.b 6,20
  1811.                .DC.b 7,0
  1812.                .DC.b 8,16,9,16,10,16
  1813.                .DC.b 11,0,12,16,13,4
  1814.                .DC.b 255,16
  1815.                .DC.b 7,63
  1816.                .DC.b 255,4
  1817.                .DC.b 11,0,12,32,13,0
  1818.                .DC.b 7,56
  1819.                .DC.b 255,50
  1820.                .DC.b 7,63
  1821.                .DC.b 255,0
  1822.  
  1823.                .BSS 
  1824. GemStarted:    .DS.w 1   ; Läuft GEM schon ?
  1825. BadTos:        .DS.w 1   ; !0 == BlitterTOS
  1826. Offset:        .DS.w 1   ; Offset VideoAdd <> MyMemtop
  1827. RezX:          .DS.w 1   ; Breite des Bildschirms
  1828. RezY:          .DS.w 1   ; Höhe   des Bildschirms
  1829. BpL:           .DS.w 1   ; BytesPerLine , also Bytes pro Bildschirmzeile
  1830. Reso:          .DS.w 1   ; Aktuelle Auflösung
  1831. MonPLine:      .DS.w 1   ; ??? (was immer sich Julian dabei dachte...)
  1832. VPlanes:       .DS.w 1   ; Anzahl der Farbebenen
  1833. LineA:         .DS.l 1   ; Zeiger auf LineA Variablen
  1834. MouseVec:      .DS.l 1   ; temp. Kbdvbase
  1835. WorkOut:       .DS.l 1   ; Zeiger auf das WorkOut-Feld der 'v_opnwk()'-
  1836. ;           aufrufenden Funktion (hoffentlich der DESKTOP !)
  1837. Back:          .DS.l 1   ; RücksprungAddresse zu dieser Funktion
  1838. MyMemtop:      .DS.l 1   ;   Zwischenspeicher zur Restauration des Desktops nach
  1839. VidAdd:        .DS.l 1   ;   einem inkompatiblen Programm
  1840. BasAdd:        .DS.l 1   ;
  1841. MemEnd:        .DS.l 1   ;   Letzte beschreibbare Speicheraddresse
  1842. StartBasAdd:   .DS.l 1   ;   v_bas_add zu Beginn des Programms
  1843. Dx:            .DS.w 1   ; Zwischenspeicher für GrowBox Effekt
  1844. Dy:            .DS.w 1   ; Abweichung der Auflösung
  1845. Max:           .DS.w 1   ; Grössere Abweichung
  1846. Xa:            .DS.w 1   ;
  1847. Ya:            .DS.w 1   ; Koordinaten des GrowBox Effekt
  1848. Xe:            .DS.w 1   ;
  1849. Ye:            .DS.w 1   ;
  1850. X_Add:         .DS.l 1   ; Zeiger auf die aktuellen Bildschirmwerte
  1851. Y_Add:         .DS.l 1   ;
  1852. Off_Add:       .DS.l 1   ;
  1853. Y_Inc:         .DS.w 1   ; Inkrement der Bildschirmwerte
  1854. Off_Inc:       .DS.l 1   ;
  1855. X_Min:         .DS.w 1   ; Grenzen der Bildschirmwerte
  1856. X_Max:         .DS.w 1   ;
  1857. Y_Min:         .DS.w 1   ;
  1858. Y_Max:         .DS.w 1   ;
  1859. Pal3Save:      .DS.w 1   ; Farbpalette 3
  1860. PalFSave:      .DS.w 1   ; Farbpalette 15
  1861. ResoSave:      .DS.w 1   ; Start-Auflösung
  1862. UserKey:       .DS.w 1   ; Tastendruck beim UserSetup
  1863. UserSave:      .DS.w 1   ; EndeFlag für UserSetup
  1864. Handle:        .DS.w 1   ; Dateihandle
  1865. inst_ok:       .DS.w 1   ; Installationsstatus
  1866. _ende:         .DS.w 1
  1867.  
  1868.  
  1869.