home *** CD-ROM | disk | FTP | other *** search
/ The Equalizer BBS / equalizer-bbs-collection_2004.zip / equalizer-bbs-collection / DEMOSCENE-STUFF / #QUARTZ.ZIP / QUARTZ.ASM < prev    next >
Assembly Source File  |  1994-06-09  |  30KB  |  728 lines

  1. ;          ·   ·   ┌──────┐     ·   ┐
  2. ; ┌─────┌┬┐┐┌┐·┐··┌┐┌┌┌┐┬┐├·┌┐··┐┌┐·├·┌┐┌┐────────────────────────────────────┐
  3. ; │     │││││└┐│  ││││┌┤│ │ ┌┘  ││└┐│ │ ││     code and artwork by Dr.Chandra │
  4. ; └─────└·┘└└·┘└··└┤└┴└┴└·└┘└┘··└└·┘┴┘└·└┘────────────────────────────────────┘
  5. ;                  └──────┘
  6. ;
  7. ;-*---------------------------------------*-
  8. ;
  9. ;      Well thiz ain't nothing to be proud of... (If ya don't think so, watch
  10. ; some "big group" demos) :) but I released the full (lame) source w/the hope
  11. ; that it will help someone... (PS: Also sorry 'bout my poor English) ;)
  12. ;
  13. ;     Ok! The EXE is 2994 bytes long coz it's a "intro" (ehem) coded with the
  14. ; next millenium in mind... (Ya know all this Trekkie stuff... "Live Long and
  15. ; Eat my Phaser") :) (Greets 2 Captain Ifyarluck Pickacard!) :):)
  16. ;
  17. ;       PS: Some comments are written in Spanglish but *I know* my limitations
  18. ; and thought that this |&#/¡$+%@*! will probably will never cross the spanish
  19. ; frontier... (or it will?) :)
  20. ;
  21. ; -> Greets <- ...That's why all thiz ASM coding stands for... ;)
  22. ;
  23. ; * Marta... (she knows perfectly why... or not?) :)
  24. ; * JMdJ, Karlitos, and Takashi! (gr8 friends)
  25. ; * All CarWars players AROUND THE WORLD... Specially Heinrich Frobenius and
  26. ;   his troupe... (next time I'll *kill* you, I promise)
  27. ;   -- Omega Speedway Night-Bowl Final on June 17th -- ask4it!
  28. ;   -- Don't forget Karnaugh-Doughnut's Masacre on Wheels on June 20th --
  29. ; * Frank, Steve (Where are you?), Francesc and all other C00L sysops around!
  30. ;   (Those NON-C00L sysops know who they are...) :)
  31. ; * All ASM coders and DemoMakers... (Specially The Virtual Crew, Iguana,
  32. ;   Postumum, and all Spanish ones...) (Hi's & Yo's jmp to DΣ-PhÄ$$ΣD!,
  33. ;   Dyonisos, Chc, Darkmind, Ripness, Jare, JCAB, and all others!)
  34. ;   Thanks All Source Releasers, werever and whoever they are! :)
  35. ; * (this greet is Intentionally left blank)
  36. ; * And specially all FIBers around... (Please Remember to use *ALL KIND* of
  37. ;   alternative E-MAIL SYSTEMS and forget the nasty "CORREU" imposed by our
  38. ;   well know dictator... the infamous Victor "Hache" (Please, email him at
  39. ;   victor_h@akron.upc.es and tell he how *LAME* he is)
  40. ;   Hi's and Yo's jmp to Akira, Carlos (the one who introduced us to the SIRDs
  41. ;   time ago...), NΣMΣS|S (how come?), Ojetes Azules and all the others!
  42. ;   (except LSI related guys, you know who you are)
  43. ; * I Think I spent more time writting all this shit than coding the "intro"!
  44. ;
  45. ;-*---------------------------------------*-
  46.  
  47.         .286                    ; ¿ Did I really USED 286 instructions ? :)
  48.         .model small            ; of COZ! (haw, haw)
  49.         .stack 100
  50.  
  51.         .data
  52.  
  53. scroll_dir equ 160*17           ; índice a mem_video where scroll is!!
  54.  
  55. int_mask db ?                   ; Máscara existente en Ctrlador de Ints!
  56.  
  57. Equipment db 'Sorry, but you need a VGA card to run this AnSi.',0Dh,0Ah,'$'
  58. ; I removed 286 Messy 'cos there's no 286-checking routine... :)
  59.  
  60. smooth  dw 0                    ; Scanline a enseñar 0-1600
  61. sin_idx dw 0                    ; Indice a sintable para smooth!
  62.  
  63. ; Logo
  64. ; (Why akron? email victor_h@akron.upc.es 4 details)
  65.  
  66. akron label byte
  67.         db      2,16,25,'=Code by Dr.Chandra',24,24,24,24,24,24,24,24
  68.         db      24,25,13,1,'▄█▀▀▀█▄',25,30,'▄█',24,25,12,'██',25,4,'█'
  69.         db      '█ ▄▄',25,3,'▄▄  ',26,5,'▄  ',26,6,'▄  ▄▄██▄▄  ',26,7
  70.         db      '▄',24,25,12,'██',25,4,'██ ██',25,3,'██',25,6,'██ ██'
  71.         db      25,3,'▀▀',25,2,'██',25,8,'▄█▀',24,25,12,'██',25,4,'█'
  72.         db      '█ ██',25,3,'██  ▄█▀▀▀██ ██',25,8,'██',25,6,'▄█▀',24,25
  73.         db      12,'██ ▄▄▄ ██ ██',25,3,'██ ██',25,3,'██ ██',25,8,'██'
  74.         db      25,4,'▄█▀',24,25,13,'▀█▄▄██▀  ▀█',26,3,'▄█▀ ▀█',26,3,'▄'
  75.         db      '██ ██',25,8,'▀█▄▄▄ ██',26,5,'▄',24,25,18,'▀█▄',25,'-'
  76.         db      'BBS',24,25,2,26,'I─',24,24,25,2,26,'I─',24,25,9,'2:'
  77.         db      '343/130@fidonet, 14:4500/105@sbcnet, 16:1400/104@zy'
  78.         db      'xelnet',24,25,8,'34:3000/0@soundnet, 34:3000/10@sou'
  79.         db      'ndnet, 34:3000/100@soundnet',24,25,13,'757:101/23@r'
  80.         db      'edbbs, 93:308/4@bcnnet, 93:300/0@bcnnet',24,25,3,'7'
  81.         db      '57:101/23@redbbs, 93:308/4@bcnnet, 93:300/0@bcnnet,'
  82.         db      ' 147:1720/2@warpspd',24,25,4,'(+34-3)276-4345 (24 h'
  83.         db      ') - Barcelona (Spain) - Sysop: Francisco Carrillo',24
  84. akron_length equ ($ - akron)
  85.  
  86. msg_idx dw msg_start            ; Indice a msg a pintar.
  87. msg_start label byte            ; solo saldrán la primera vez!
  88.         db '* This File Came From Quartz BBS *',0
  89.         db '- Elite SoundBB -',0
  90.         db 'With All Stuff You L00K For:',0
  91. msg_ini label byte              ; estos se "ciclarán" tol rato... :)
  92.         db 'Last Demos & Sound Programs',0
  93.         db 'Best Gus And Sb Utilities Around',0
  94.         db '8 Bits Emulators Support',0
  95.         db 'Msx-1 And Cpc Games',0
  96.         db '1500 Spectrum Games On-Line!',0
  97.         db 'Cd-Rom x2 Speed With Best Freeware',0
  98.         db 'No Ratios! Free Access!',0
  99.         db 'Tons Of Message Areas!',0
  100.         db 'CooL SysOp! ;)',0
  101.         db 'Dont''t Forget To Contact Us',0
  102.         db '+34-3-2764345, 24 hrs, ZyX 19k2',0
  103.         db 'PReSS aNy Key To QuiT',0
  104.         db 'Remember...',0
  105. msg_end label byte
  106.  
  107. ;-----------------------------------------------------------------------------
  108.  
  109. back_ini label byte             ; Palette for RASTER_COLORING! :)
  110.         db 00h,00h,00h,02h,00h,02h,04h,00h,04h,07h,00h,06h,09h,00h,09h,0Ch
  111.         db 00h,0Bh,0Eh,00h,0Dh,11h,00h,0Fh,13h,00h,12h,16h,00h,14h,18h,00h
  112.         db 16h,1Ah,00h,18h,1Dh,00h,1Bh,1Fh,00h,1Dh,22h,00h,1Fh,24h,00h,21h
  113.         db 27h,00h,24h,29h,00h,26h,2Ch,00h,28h,2Eh,00h,2Ah,31h,00h,2Dh,32h
  114.         db 00h,2Dh,33h,00h,2Ch,33h,00h,2Bh,34h,00h,2Ah,35h,00h,2Ah,35h,00h
  115.         db 29h,36h,01h,28h,36h,01h,27h,37h,01h,27h,37h,01h,26h,38h,02h,25h
  116.         db 38h,02h,24h,39h,02h,24h,39h,02h,23h,3Ah,03h,22h,3Ah,03h,21h,3Bh
  117.         db 03h,20h,3Bh,04h,20h,3Bh,04h,1Fh,3Ch,05h,1Eh,3Ch,05h,1Dh,3Ch,05h
  118.         db 1Dh,3Dh,06h,1Ch,3Dh,06h,1Bh,3Dh,07h,1Ah,3Eh,07h,19h,3Eh,08h,19h
  119.         db 3Eh,08h,18h,3Eh,09h,17h,3Fh,0Ah,16h,3Fh,0Ah,16h,3Fh,0Bh,15h,3Fh
  120.         db 0Bh,14h,3Fh,0Ch,13h,3Fh,0Dh,13h,3Fh,0Dh,12h,3Fh,0Eh,11h,3Fh,0Fh
  121.         db 11h,3Fh,0Fh,10h,3Fh,10h,0Fh,3Fh,11h,0Fh,3Fh,11h,0Eh,3Fh,12h,0Dh
  122.         db 3Fh,13h,0Dh,3Fh,13h,0Ch,3Fh,14h,0Bh,3Fh,15h,0Bh,3Fh,16h,0Ah,3Fh
  123.         db 16h,0Ah,3Eh,17h,09h,3Eh,18h,08h,3Eh,19h,08h,3Eh,19h,07h,3Dh,1Ah
  124.         db 07h,3Dh,1Bh,06h,3Dh,1Ch,06h,3Ch,1Dh,05h,3Ch,1Dh,05h,3Ch,1Eh,05h
  125.         db 3Bh,1Fh,04h,3Bh,20h,04h,3Bh,20h,03h,3Ah,21h,03h,3Ah,22h,03h,39h
  126.         db 23h,02h,39h,24h,02h,38h,24h,02h,38h,25h,02h,37h,26h,01h,37h,27h
  127.         db 01h,36h,27h,01h,36h,28h,01h,35h,29h,00h,35h,2Ah,00h,34h,2Ah,00h
  128.         db 33h,2Bh,00h,33h,2Ch,00h,32h,2Dh,00h,31h,2Dh,00h,31h,2Eh,00h,30h
  129.         db 2Fh,00h,2Fh,2Fh,00h,2Fh,30h,00h,2Eh,31h,00h,2Dh,31h,00h,2Dh,32h
  130.         db 00h,2Ch,33h,00h,2Bh,33h,00h,2Ah,34h,00h,2Ah,35h,00h,29h,35h,00h
  131.         db 28h,36h,01h,27h,36h,01h,27h,37h,01h,26h,37h,01h,25h,38h,02h,24h
  132.         db 38h,02h,24h,39h,02h,23h,39h,02h,22h,3Ah,03h,21h,3Ah,03h,20h,3Bh
  133.         db 03h,20h,3Bh,04h,1Fh,3Bh,04h,1Eh,3Ch,05h,1Dh,3Ch,05h,1Dh,3Ch,05h
  134.         db 1Ch,3Dh,06h,1Bh,3Dh,06h,1Ah,3Dh,07h,19h,3Eh,07h,19h,3Eh,08h,18h
  135.         db 3Eh,08h,17h,3Eh,09h,16h,3Fh,0Ah,16h,3Fh,0Ah,15h,3Fh,0Bh,14h,3Fh
  136.         db 0Bh,13h,3Fh,0Ch,13h,3Fh,0Dh,12h,3Fh,0Dh,11h,3Fh,0Eh,11h,3Fh,0Fh
  137.         db 10h,3Fh,0Fh,0Fh,3Fh,10h,0Fh,3Fh,11h,0Eh,3Fh,11h,0Dh,3Fh,12h,0Dh
  138.         db 3Fh,13h,0Ch,3Fh,13h,0Bh,3Fh,14h,0Bh,3Fh,15h,0Ah,3Fh,16h,0Ah,3Fh
  139.         db 16h,09h,3Eh,17h,08h,3Eh,18h,08h,3Eh,19h,07h,3Eh,19h,07h,3Dh,1Ah
  140.         db 06h,3Dh,1Bh,06h,3Dh,1Ch,05h,3Ch,1Dh,05h,3Ch,1Dh,05h,3Ch,1Eh,04h
  141.         db 3Bh,1Fh,04h,3Bh,20h,03h,3Bh,20h,03h,3Ah,21h,03h,3Ah,22h,02h,39h
  142.         db 23h,02h,39h,24h,02h,38h,24h,02h,38h,25h,01h,37h,26h,01h,37h,27h
  143.         db 01h,36h,27h,01h,36h,28h,00h,35h,29h,00h,35h,2Ah,00h,34h,2Ah,00h
  144.         db 33h,2Bh,00h,33h,2Ch,00h,32h,2Dh,00h,31h,2Dh,00h,31h,2Eh,00h,30h
  145.         db 2Fh,00h,2Fh,2Fh,00h,2Fh,30h,00h,2Eh,31h,00h,2Dh,31h,00h,2Dh,32h
  146.         db 00h,2Ch,33h,00h,2Bh,33h,00h,2Ah,34h,00h,2Ah,35h,00h,29h,35h,01h
  147.         db 28h,36h,01h,27h,36h,01h,27h,37h,01h,26h,37h,02h,25h,38h,02h,24h
  148.         db 38h,02h,24h,39h,02h,23h,39h,03h,22h,3Ah,03h,21h,3Ah,03h,20h,3Bh
  149.         db 04h,20h,3Bh,04h,1Fh,3Bh,05h,1Eh,3Ch,05h,1Dh,3Ch,05h,1Dh,3Ch,06h
  150.         db 1Ch,3Dh,06h,1Bh,3Dh,07h,1Ah,3Dh,07h,19h,3Eh,08h,19h,3Eh,08h,18h
  151.         db 3Eh,09h,17h,3Eh,0Ah,16h,3Fh,0Ah,16h,3Fh,0Bh,15h,3Fh,0Bh,14h,3Fh
  152.         db 0Ch,13h,3Fh,0Ch,13h,3Dh,0Ch,12h,3Bh,0Bh,12h,39h,0Bh,11h,37h,0Ah
  153.         db 10h,35h,0Ah,10h,32h,0Ah,0Fh,30h,09h,0Eh,2Eh,09h,0Eh,2Ch,08h,0Dh
  154.         db 2Ah,08h,0Ch,28h,08h,0Ch,25h,07h,0Bh,23h,07h,0Ah,21h,06h,0Ah,1Fh
  155.         db 06h,09h,1Dh,05h,08h,1Bh,05h,08h,18h,05h,07h,16h,04h,06h,14h,04h
  156.         db 06h,12h,03h,05h,10h,03h,04h,0Eh,03h,04h,0Bh,02h,03h,09h,02h,02h
  157.         db 07h,01h,02h,05h,01h,01h,03h,00h,00h,00h
  158. back_len equ ($ - back_ini) / 3
  159.  
  160. ;-----------------------------------------------------------------------------
  161.  
  162. sintable label byte             ; (Sin(x) * 200-16)+1 (360 divisions)
  163.         db   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,   2
  164.         db   3,   3,   3,   4,   4,   5,   5,   6,   6,   7,   7,   8
  165.         db   8,   9,  10,  11,  11,  12,  13,  14,  14,  15,  16,  17
  166.         db  18,  19,  20,  21,  22,  23,  24,  25,  26,  27,  29,  30
  167.         db  31,  32,  33,  35,  36,  37,  38,  40,  41,  42,  44,  45
  168.         db  46,  48,  49,  51,  52,  54,  55,  57,  58,  60,  61,  63
  169.         db  64,  66,  67,  69,  70,  72,  73,  75,  77,  78,  80,  81
  170.         db  83,  84,  86,  88,  89,  91,  93,  94,  96,  97,  99, 101
  171.         db 102, 104, 105, 107, 108, 110, 112, 113, 115, 116, 118, 119
  172.         db 121, 122, 124, 125, 127, 128, 130, 131, 133, 134, 136, 137
  173.         db 138, 140, 141, 143, 144, 145, 147, 148, 149, 150, 152, 153
  174.         db 154, 155, 156, 158, 159, 160, 161, 162, 163, 164, 165, 166
  175.         db 167, 168, 169, 170, 171, 171, 172, 173, 174, 174, 175, 176
  176.         db 177, 177, 178, 178, 179, 179, 180, 180, 181, 181, 182, 182
  177.         db 182, 183, 183, 183, 184, 184, 184, 184, 184, 184, 184, 184
  178.         db 184, 184, 184, 184, 184, 184, 184, 184, 184, 183, 183, 183
  179.         db 182, 182, 182, 181, 181, 180, 180, 179, 179, 178, 178, 177
  180.         db 177, 176, 175, 174, 174, 173, 172, 171, 171, 170, 169, 168
  181.         db 167, 166, 165, 164, 163, 162, 161, 160, 159, 158, 156, 155
  182.         db 154, 153, 152, 150, 149, 148, 147, 145, 144, 143, 141, 140
  183.         db 139, 137, 136, 134, 133, 131, 130, 128, 127, 125, 124, 122
  184.         db 121, 119, 118, 116, 115, 113, 112, 110, 108, 107, 105, 104
  185.         db 102, 101,  99,  97,  96,  94,  93,  91,  89,  88,  86,  84
  186.         db  83,  81,  80,  78,  77,  75,  73,  72,  70,  69,  67,  66
  187.         db  64,  63,  61,  60,  58,  57,  55,  54,  52,  51,  49,  48
  188.         db  47,  45,  44,  42,  41,  40,  38,  37,  36,  35,  33,  32
  189.         db  31,  30,  29,  27,  26,  25,  24,  23,  22,  21,  20,  19
  190.         db  18,  17,  16,  15,  14,  14,  13,  12,  11,  11,  10,   9
  191.         db   8,   8,   7,   7,   6,   6,   5,   5,   4,   4,   3,   3
  192.         db   3,   2,   2,   2,   1,   1,   1,   1,   1,   1,   1,   1
  193. sin_len equ ($ - sintable)
  194.  
  195. ;font    label byte              ; I also had Designed thiz TeXTFoNT! ;)
  196. ;include font.inc                ; all 256 chars Included... hehehe!
  197.  
  198. ;-----------------------------------------------------------------------------
  199.            .code
  200. ;------------------------------------------------------------------------------
  201.  
  202. wait_for_retrace MACRO
  203.            LOCAL  @@xx
  204.  
  205.            mov    dx, 03dah
  206.      @@xx: in     al, dx
  207.            test   al, 8
  208.            jz     @@xx
  209.  
  210.            ENDM
  211.  
  212. ;-----------------------------------------------------------------------------
  213.  
  214. wait_for_display MACRO
  215.            LOCAL  @@xx
  216.  
  217.            mov    dx, 03dah            ; Wait for display
  218.      @@xx: in     al, dx
  219.            test   al,8
  220.            jnz    @@xx
  221.  
  222.            ENDM
  223.  
  224. ;-----------------------------------------------------------------------------
  225.  
  226. vsync      MACRO
  227.            LOCAL @@x1, @@x2
  228.  
  229.            mov    dx, 03dah
  230.      @@x1: in     al, dx
  231.            test   al, 8
  232.            jnz    @@x1
  233.  
  234.      @@x2: in     al, dx
  235.            test   al, 8
  236.            jz     @@x2
  237.  
  238.            ENDM
  239.  
  240. ;-----------------------------------------------------------------------------
  241.  
  242. hsync      MACRO
  243.            LOCAL @@x1, @@x2
  244.  
  245.            mov    dx, 03dah            ; Wait for horiz RETRACE!
  246.      @@x1: in     al, dx               ; ─┐
  247.            test   al, 1                ;  │
  248.            jnz    @@x1                 ;  │
  249.      @@x2: in     al, dx               ;  │
  250.            test   al, 1                ;  │ THNX to VGA.DOC! ;)
  251.            jz     @@x2                 ; ─┘
  252.  
  253.            ENDM
  254.  
  255. ;-----------------------------------------------------------------------------
  256.  
  257. smooth_in_retrace MACRO
  258.  
  259.            mov    dx, 3d4h             ; This is for Some Smooth
  260.            mov    ax, 8                ; esto tié que hacerse en retrace!
  261.            out    dx, ax               ; y la otra parte en display...
  262.            inc    dx                   ; a ver si alguien me dice el pq! :)
  263.            in     al, dx
  264.            mov    bx, [smooth]         ; A mi me vibraba cuando lo hacia a
  265.            and    al, 0E0h             ; y al final me he copiado de como lo
  266.            and    bl, 00Fh             ; hace Jare en "nosequedemo", es decir
  267.            or     al, bl               ; una parte en display y otra en
  268.            out    dx, al               ; retrace
  269.  
  270.            ENDM
  271.  
  272. ;-----------------------------------------------------------------------------
  273.  
  274. smooth_in_display MACRO
  275.  
  276.            cli
  277.            mov    dx, 3d4h             ; Inicio de MEM de video a enseñar!
  278.            mov    ax, 0ch              ; (direccion del 1er caracter)
  279.            out    dx, ax
  280.            inc    dx
  281.            mov    ax, [smooth]
  282.            shr    ax, 4                ; ax <- smooth / scanlines_per_char
  283.            mov    bl, 80               ; ax <- ax * chars_per_textline
  284.            mul    bl
  285.            mov    al, ah
  286.            out    dx, al
  287.  
  288.            mov    dx, 3d4h             ; Smooth ][ ;)
  289.            mov    ax, 0dh
  290.            out    dx, ax
  291.            inc    dx
  292.            mov    ax, [smooth]
  293.            shr    ax, 4
  294.            mul    bl
  295.            out    dx, al
  296.            sti
  297.  
  298.            ENDM
  299.  
  300. ;-----------------------------------------------------------------------------
  301.  
  302. back_palette MACRO
  303.            LOCAL  @@margin, @@h_buc
  304.  
  305.            mov    dx, 03c8h            ; Ponemos el color de los credits (2)
  306.            mov    al, 2                ; a cero para que no se vea por la parte
  307.            out    dx, al               ; superior de la Pantalla!
  308.            inc    dx
  309.            xor    ax, ax
  310.            out    dx, al
  311.            out    dx, al
  312.            out    dx, al
  313.  
  314.            wait_for_display
  315.  
  316.            mov    cx, 62               ; margen superior!
  317.  @@margin: hsync
  318.            loop   @@margin
  319.  
  320.            mov    cx, back_len
  321.            mov    si, OFFSET back_ini
  322.  
  323.   @@h_buc: lodsb                       ; fetch del siguiente ds:[si]
  324.            mov    ah, al               ; guardamos el componente rojo...
  325.            lodsb
  326.            mov    bl, al               ; ...el verde...
  327.            lodsb
  328.            mov    bh, al               ; ...y el azul!
  329.  
  330.            mov    dx, 03c8h
  331.            mov    al, 1                ; Num de registro de paleta
  332.            out    dx, al               ; que cambiaremos despues de hsync!
  333.  
  334.            hsync                       ; esperamos al inicio de CADA
  335.                                        ; barrido horizontal!
  336.            mov    dl, 0c9h
  337.            mov    al, ah               ; Escupimos las tres componentes
  338.            out    dx, al               ; que teniamos en AH, BL y BH!
  339.            mov    al, bl
  340.            out    dx, al
  341.            mov    al, bh
  342.            out    dx, al
  343.            loop   @@h_buc
  344.  
  345.            mov    al, 15               ; Despues del Bucle ponemos el color de
  346.            out    dx, al               ; los creditos tal y como le corresponde
  347.            out    dx, al               ; <15,15,15>
  348.            out    dx, al
  349.  
  350.            ENDM
  351.  
  352. ;-----------------------------------------------------------------------------
  353.  
  354. cambio_msg MACRO
  355.            LOCAL  @@pinta, @@pr_nxt, @@quit
  356.  
  357.            cmp    sin_idx, 0           ; Hay que pintarrrrr?
  358.            je     @@pinta
  359.            cmp    sin_idx, sin_len/2   ; y ahorrrra? :)
  360.            je     @@pinta
  361.            jmp    @@quit
  362.  
  363.   @@pinta: mov    ax, 0720h
  364.            mov    di, scroll_dir
  365.            mov    cx, 80
  366.            cld
  367.            rep    stosw                ; Borramos la linea
  368.  
  369.            mov    di, msg_idx          ; Leemos el (char *)  ;)
  370.            mov    si, di               ; y lo guardamos en SI!
  371.            mov    al, 0                ; buscamos un cero!
  372.            push   es                   ; salvamos es
  373.            push   ds
  374.            pop    es
  375.            mov    cx, 81               ; máximo a buscar (80 + el '\0')
  376.            repne  scasb                ; y buscamos el 0!!
  377.           ;jne    rutina_de_error      ; ASCIIZ demasiado largo...
  378.            pop    es
  379.            mov    msg_idx, di          ; DI apunta al principio del siguiente!
  380.            sub    di, si               ; vamos a calcular la longitud!
  381.  
  382.            mov    cx, di               ; cx = strlen(ASCIIZ_que_toca)
  383.            and    cx, 0FFFEh           ; cx tiene que ser par! ;)
  384.            mov    ax, 80
  385.            sub    ax, cx               ; ax = byte a empezar [0-39]
  386.            mov    di, scroll_dir
  387.            add    di, ax
  388.  @@pr_nxt: movsb
  389.            inc    di                   ; Nos saltamos el atributo!
  390.            loop   @@pr_nxt
  391.  
  392.            cmp    msg_idx, offset msg_end
  393.            jb     @@quit
  394.            mov    msg_idx, offset msg_ini
  395.    @@quit:
  396.            ENDM
  397.  
  398. ;-----------------------------------------------------------------------------
  399.  
  400. keyb_strobe MACRO
  401.  
  402.            in     al, 61h              ; y hacemos el Strobe de teclado :
  403.            or     al, 10000000b        ;  ┌ Activando el bit 7
  404.            out    61h,al               ;  │ y sacándolo pol puerto 61h
  405.            and    al, 01111111b        ;  │ apagamos el bit 7
  406.            out    61h,al               ;  └ y lo escupimos de nuevo
  407.  
  408.            ENDM
  409.  
  410. ;-----------------------------------------------------------------------------
  411.  
  412. uncrunch   proc   near
  413.  
  414.            mov    ax, seg akron        ; pantalla base!
  415.            mov    ds, ax
  416.            mov    ax, offset akron
  417.            mov    si, ax
  418.            xor    ax, ax
  419.            mov    di, ax
  420.            mov    cx, akron_length
  421.  
  422.            mov    dx,di                ; Save X coordinate for later.
  423.            xor    ax,ax                ; Set Current attributes.
  424.            cld
  425.  
  426. Loopa:     lodsb                       ; Get next character.
  427.            cmp    al,32                ; If a control character, jump.
  428.            jc     ForeGround
  429.            stosw                       ; Save letter on screen.
  430. Next:      loop   Loopa
  431.            jmp    Short Done
  432.  
  433. ForeGround:
  434.            cmp    al,16                ; If less than 16, then change the
  435.            jnc    BackGround           ; foreground color.  Otherwise jump.
  436.            and    ah,0f0h              ; strip off old foreground.
  437.            or     ah,al
  438.            jmp    Next
  439.  
  440. BackGround:
  441.            cmp    al,24                ; If less than 24, then change the
  442.            jz     NextLine             ; background color.  If exactly 24,
  443.            jnc    FlashBitToggle       ; then jump down to next line.
  444.            sub    al, 16               ; Otherwise jump to multiple output
  445.            add    al, al               ; routines.
  446.            add    al, al
  447.            add    al, al
  448.            add    al, al
  449.            and    ah, 8fh              ; Strip off old background.
  450.            or     ah, al
  451.            jmp    Next
  452.  
  453. NextLine:
  454.            add    dx,160               ; If equal to 24,
  455.            mov    di,dx                ; then jump down to
  456.            jmp    Next                 ; the next line.
  457.  
  458. FlashBitToggle:
  459.            cmp    al,27                ; Does user want to toggle the blink
  460.            jc     MultiOutput          ; attribute?
  461.            jnz    next
  462.            xor    ah,128               ; Done.
  463.            jmp    next
  464.  
  465. MultiOutput:
  466.            cmp    al,25                ; Set Z flag if multi-space output.
  467.            mov    bx,cx                ; Save main counter.
  468.            lodsb                       ; Get count of number of times
  469.            mov    cl,al                ; to display character.
  470.            mov    al,32
  471.            jz     StartOutput          ; Jump here if displaying spaces.
  472.            lodsb                       ; Otherwise get character to use.
  473.            dec    bx                   ; Adjust main counter.
  474.  
  475. StartOutput:
  476.            xor    ch,ch
  477.            inc    cx
  478.            rep    stosw
  479.            mov    cx,bx
  480.            dec    cx                   ; Adjust main counter.
  481.            loopnz loopa                ; Loop if anything else to do...
  482.  
  483. done:      ret
  484.  
  485. uncrunch   endp
  486.  
  487. ;-----------------------------------------------------------------------------
  488.  
  489. restore_time proc near
  490.  
  491.            xor    al, al               ; Someday I have time I'll comment IT!
  492.            out    70h,al               ; Please Don't credit me if you rip
  493.            in     al, 71h              ; it... I'ts not mine!!!!!
  494.            mov    dh, al
  495.            and    dh, 15
  496.            shr    al, 4
  497.            mov    dl, 10
  498.            mul    dl
  499.            add    dh, al
  500.  
  501.            mov    al, 2
  502.            out    70h, al
  503.            in     al, 71h
  504.            mov    cl, al
  505.            and    cl, 15
  506.            shr    al, 4
  507.            mov    dl, 10
  508.            mul    dl
  509.            add    cl, al
  510.  
  511.            mov    al, 4
  512.            out    70h, al
  513.            in     al, 71h
  514.            mov    ch, al
  515.            and    ch, 15
  516.            shr    al, 4
  517.            mov    dl, 10
  518.            mul    dl
  519.            add    ch, al
  520.  
  521.            xor    dl, dl
  522.            mov    ah, 2dh
  523.            int    21h
  524.  
  525.            mov    al, 7
  526.            out    70h, al
  527.            in     al, 71h
  528.            mov    dl, al
  529.            and    dl, 15
  530.            shr    al, 4
  531.            mov    ch, 10
  532.            mul    ch
  533.            add    dl, al
  534.  
  535.            mov    al, 8
  536.            out    70h,al
  537.            in     al, 71h
  538.            mov    dh, al
  539.            and    dh, 15
  540.            shr    al, 4
  541.            mov    ch, 10
  542.            mul    ch
  543.            add    dh, al
  544.  
  545.            mov    al, 4
  546.            out    70h,al
  547.            in     al, 71h
  548.            mov    cl, al
  549.            and    cl, 15
  550.            shr    al, 4
  551.            mov    ch, 10
  552.            mul    ch
  553.            add    cl, al
  554.  
  555.            xor    ch, ch
  556.            add    cx, 1900
  557.            mov    ah, 2bh
  558.            int    21h
  559.            ret
  560.  
  561. restore_time endp
  562.  
  563. ;-----------------------------------------------------------------------------
  564.  
  565. inicio:    xor    bx, bx               ; Vga detection routine *RIPPED*
  566.            mov    ax, 01a00h           ; from "the_cop" by Jare/Iguana.
  567.            int    10h                  ; Many thanks for the sources!
  568.            cmp    bl, 7
  569.            jc     notfound
  570.            cmp    bl, 0dh
  571.            jc     detected
  572. notfound:  mov    dx, OFFSET equipment
  573.            mov    ax, SEG equipment
  574.            mov    ds, ax;
  575.            mov    ah,9
  576.            int    21h
  577.            mov    ax,4c01h             ; This ErrorLevel *WILL* become a Std!
  578.            int    21h                  ; Back to Me$$y-Dos!
  579.  
  580. detected:  mov    ax, 0003h            ; Setup 80x25 color mode!
  581.            int    10h
  582.  
  583. ;          mov    ax, SEG Font         ; Ponemos las fuentes!
  584. ;          mov    es, ax
  585. ;          mov    bp, OFFSET Font
  586. ;          mov    bh, 16               ; 16 bytes/char
  587. ;          mov    cx, 256              ; FULL CHARSET!
  588. ;          mov    dx, 0                ; So starting on ascii 0
  589. ;          xor    bl, bl               ; 1er bloc...
  590. ;          mov    ax, 1110h            ; load 8x16 font ;)   et voilà!
  591. ;          int    10h                  ; :-P
  592.  
  593.            cli
  594.            in     al,21h
  595.            mov    [int_mask], al       ; old status of the INT ctrller saved!
  596.            or     al,11111111b
  597.            out    21h,al               ; NO ints (¿hay diferencia con un CLI?)
  598.            sti
  599.  
  600.            mov    dx, 3d4h             ; VGA params to change... ;)
  601.            mov    al, 0ah              ; Cursor START register
  602.            out    dx, al
  603.            inc    dl
  604.            in     al, dx
  605.            or     al, 00100000b        ; Apagamos el Cursor...! (bit 5==1)
  606.            out    dx, al               ; Many thanks to VGA.DOC ;)
  607.  
  608.            mov    ax, 0B800h           ; Inicializamos los registros de Segm.
  609.            mov    es, ax               ; ES <- Pantalla
  610.  
  611.            mov    dx, 03c8h
  612.            mov    al, 1                ; Zeropalette! (colores 1 y 2)
  613.            out    dx, al
  614.            inc    dx
  615.            xor    al, al
  616.            mov    cx, 6
  617.       @@1: out    dx, al
  618.            loop   @@1
  619.  
  620.            call   uncrunch             ; Pintamos la pantalla base!!
  621.  
  622.            mov    dx, 3d4h             ; Tocamos el Line Compare ;)
  623.            mov    al, 07h              ; para meter los creditz!
  624.            out    dx, al
  625.            inc    dl
  626.            in     al, dx
  627.            or     al, 00010000b        ; ponemos el bit 8 de LCr a 1 (+256) ;)
  628.            out    dx, al
  629.            dec    dl
  630.            mov    al, 09h              ; max scan line reg.
  631.            out    dx, al
  632.            inc    dl
  633.            in     al, dx
  634.            and    al, 10111111b        ; clear bit 9 LC (no + 512) :):)
  635.            out    dx, al
  636.            dec    dl
  637.            mov    al, 18h              ; set bits 0-7 LC (reg 18)
  638.            out    dx, al
  639.            inc    dl
  640.            mov    al, 124              ; (+256 pq el bit 8 == 1)
  641.            out    dx, al
  642.  
  643. main_loop: wait_for_retrace            ; pues eso!
  644.  
  645.            smooth_in_retrace
  646.  
  647.            cambio_msg                  ; Cambiamos el "texto" (si toca...)
  648.  
  649.            mov    bx, sin_idx          ; Ponemos en smooth un valor
  650.            inc    bx                   ; sinusoidal sacado de sinustable
  651.            cmp    bx, sin_len          ; Joder, como si no lo supierais! ;)
  652.            jne    cont
  653.            xor    bx, bx
  654.      cont: mov    sin_idx, bx
  655.            xor    ax, ax
  656.            mov    al, sintable[bx]
  657.            dec    al
  658.            mov    [smooth], ax
  659.  
  660.            mov    bx, sin_idx          ; Intensidad del Texto!!
  661.            add    bx, bx               ; bx = sin_idx * 2
  662.            cmp    bx, sin_len
  663.            jb     no_mod
  664.            sub    bx, sin_len          ; bx = (sin_idx * 2) mod sin_len!
  665.    no_mod: mov    ah, sintable[bx]
  666.            shr    ah, 2                ; al = sin(bx) / 4 [0..45]
  667.            mov    dx, 03c8h
  668.            mov    al, 7                ; Color del texto!!! :)
  669.            out    dx, al               ; Num de registro de paleta!
  670.            inc    dx
  671.            mov    al, ah
  672.            out    dx, al               ; Intesidad del texto! :)
  673.            out    dx, al
  674.            out    dx, al
  675.  
  676.            back_palette                ; Engañado el Monitor.... :)
  677.                                        ; Greets jmp here to DΣ-PhÄ$$ΣD!/TVC!
  678.  
  679.            smooth_in_display           ; Pues backpal nos deja a medio display
  680.  
  681.            mov    al, 0ah
  682.            out    20h, al
  683.            in     al, 20h              ; AL <- IRR del 8259
  684.  
  685.            and    al, 00000010b        ; Se ha activado el IR del teclado?
  686.            jz     cont_loop            ; no -> seguimos... ;)
  687.  
  688.            in     al, 60h              ; si hay una tecla, la leemos,
  689.            mov    ah, al               ; la guardamos en AH,
  690.            keyb_strobe                 ; y mandamos el strobe!
  691.  
  692.            cmp    ah, 10011100b        ; si es un break de return -> seguimos
  693.            je     cont_loop
  694.            and    ah, 10000000b        ; es un make o un break ?
  695.            jnz    end_loop             ; break -> salimos
  696.  
  697. cont_loop: jmp    main_loop
  698.  
  699.  end_loop: cli
  700.            mov    al, [int_mask]
  701.            out    21h, al              ; restore old interrupt mask!
  702.            sti
  703.  
  704.            mov    ax, 0003h
  705.            int    10h                  ; restorin' txt mode! toma chá!
  706.  
  707.            call   uncrunch             ; Pintamos la pantalla base!!
  708.  
  709.            mov    cx, 80*25
  710.            mov    di, 1
  711.            cld
  712.            mov    ax, 08h              ; Atributo para colorear! (GrisOscuro)
  713.       @@x: stosb                       ; "ponemos" el atributo y...
  714.            inc    di                   ; ...nos saltamos el caracter
  715.            loop   @@x
  716.  
  717.            mov    ah, 02               ; Bios SetCursor!
  718.            xor    bh, bh               ; pagina 0!
  719.            mov    dx, 1000h            ; Put the cursor 16 lines down! :)
  720.            int    10h
  721.  
  722.            call   restore_time         ; Restore Time From CMOS!
  723.  
  724. messydos:  mov    ax, 4c00h            ; retornem al dos
  725.            int    21h
  726.  
  727. end        inicio
  728.