home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug094.arc / FIX-256.ARC / QUIX.MAC < prev    next >
Text File  |  1988-06-14  |  8KB  |  587 lines

  1. ; Quix, by Vaughan Clarkson 12/1/88
  2.  
  3.     .z80
  4.     aseg
  5.     org    100h
  6.  
  7. bios    equ    0000h
  8. bdos    equ    0005h
  9. screen    equ    0f000h
  10. grafix    equ    0f800h
  11.  
  12. row    equ    64
  13. vmlatch    equ    1ch
  14. attrib    equ    144
  15. char    equ    16
  16. c_port    equ    8
  17. c_swtch    equ    40h
  18. speakr    equ    2
  19. outbit    equ    40h
  20. pstring    equ    9
  21.  
  22. ; The equates below are starting options and may be freely altered.
  23. no_line    equ    120        ; no of lines in the quix
  24. x1_1st    equ    80        ; initial x1 coordinate
  25. y1_1st    equ    120        ; initial y1 coordinate
  26. x2_1st    equ    200        ; initial x2 coordinate
  27. y2_1st    equ    20        ; initial y2 coordinate
  28. v1x1st    equ    3        ; initial x1 increment
  29. v1y1st    equ    3        ; initial y1 increment
  30. v2x1st    equ    4        ; initial x2 increment
  31. v2y1st    equ    2        ; initial y2 increment
  32.  
  33. begin:    ld    hl,screen+32*row-1
  34.     ld    (hl),-1
  35.     ld    a,attrib    ; Test whether Premium model or later
  36.     out    (vmlatch),a
  37.     ld    (hl),0
  38.     ld    a,80h
  39.     out    (vmlatch),a
  40.     ld    a,(hl)
  41.     or    a
  42.     jr    nz,start
  43.     ld    de,m_prem    ; 'QUIX works only on Premium ...'
  44.     ld    c,pstring
  45.     call    bdos
  46.     jp    bios
  47.  
  48. start:    ld    hl,screen
  49.     ld    (hl),' '
  50.     ld    de,screen+1
  51.     ld    bc,32*row-1
  52.     ldir
  53.     call    reform
  54.     ld    bc,0
  55. rfwait:    dec    bc
  56.     ld    a,b
  57.     or    c
  58.     jp    nz,rfwait
  59.     ld    b,8
  60.     ld    a,80h
  61. clgrfx:    push    bc
  62.     out    (vmlatch),a
  63.     ld    hl,grafix
  64.     ld    (hl),0
  65.     ld    de,grafix+1
  66.     ld    bc,128*char
  67.     ldir
  68.     inc    a
  69.     pop    bc
  70.     djnz    clgrfx
  71.     ld    a,80h            ; draw border
  72. s_bord:    out    (vmlatch),a
  73.     ld    hl,grafix
  74.     ld    (hl),80h
  75.     ld    de,grafix+1
  76.     ld    bc,char-1
  77.     ldir
  78.     ld    hl,grafix+63*char
  79.     ld    (hl),1
  80.     ld    de,grafix+63*char+1
  81.     ld    bc,char
  82.     ldir
  83.     inc    a
  84.     cp    88h
  85.     jr    nc,tbbord
  86.     ld    (hl),80h
  87.     ld    bc,char-1
  88.     ldir
  89.     ld    hl,grafix+127*char
  90.     ld    (hl),1
  91.     ld    de,grafix+127*char+1
  92.     ld    bc,char-1
  93.     ldir
  94.     jr    s_bord
  95.  
  96. tbbord:    xor    a
  97.     ld    (de),a
  98.     ld    a,80h
  99.     out    (vmlatch),a
  100.     ld    hl,grafix
  101.     ld    de,char
  102.     ld    b,64
  103.     ld    a,-1
  104. topbrd:    ld    (hl),a
  105.     add    hl,de
  106.     djnz    topbrd
  107.     ld    a,87h
  108.     out    (vmlatch),a
  109.     ld    hl,grafix+char-1
  110.     ld    b,64
  111.     ld    a,-1
  112. botbrd:    ld    (hl),a
  113.     add    hl,de
  114.     djnz    botbrd
  115.     ld    a,c_swtch        ; set up initial screen colours
  116.     out    (c_port),a
  117.     ld    hl,grafix
  118.     ld    (hl),12            ; light blue on black
  119.     ld    de,grafix+1
  120.     ld    bc,15*row
  121.     ldir
  122.     ld    (hl),0afh        ; white on light green
  123.     ld    bc,row-1
  124.     ldir
  125.     xor    a
  126.     out    (c_port),a
  127.     ld    b,8            ; set up screen & attributes
  128.     ld    hl,screen
  129.     ld    de,screen+1
  130.     ld    a,attrib
  131.     out    (vmlatch),a
  132.     xor    a
  133. setatt:    push    bc
  134.     ld    bc,2*row
  135.     ld    (hl),a
  136.     ldir
  137.     inc    a
  138.     pop    bc
  139.     djnz    setatt
  140.     ld    a,80h
  141.     out    (vmlatch),a
  142.     ld    hl,screen
  143.     ld    c,8
  144. setscn:    ld    b,2*row
  145.     ld    a,80h
  146. setrow:    ld    (hl),a
  147.     inc    a
  148.     inc    hl
  149.     djnz    setrow
  150.     dec    c
  151.     jr    nz,setscn
  152.     ld    hl,m_quix        ; 'QUIX demo ...'
  153.     ld    de,screen+15*row+10
  154.     ld    bc,35
  155.     ldir
  156.     ld    hl,ltable
  157.     ld    (hl),-1
  158.     ld    de,ltable+1
  159.     ld    bc,no_line*8-1
  160.     ldir
  161.     ld    hl,x1_1st
  162.     ld    (from_x),hl
  163.     ld    hl,y1_1st
  164.     ld    (from_y),hl
  165.     ld    hl,x2_1st
  166.     ld    (to_x),hl
  167.     ld    hl,y2_1st
  168.     ld    (to_y),hl
  169.     ld    hl,from_x
  170.     ld    de,ltable+no_line*8
  171.     ld    bc,8
  172.     ldir
  173.     ld    hl,v1x1st
  174.     ld    (comp1x),hl
  175.     ld    hl,v1y1st
  176.     ld    (comp1y),hl
  177.     ld    hl,v2x1st
  178.     ld    (comp2x),hl
  179.     ld    hl,v2y1st
  180.     ld    (comp2y),hl
  181.     ld    ix,ltable
  182. qxloop:    ld    a,-1            ; draw the quix
  183.     ld    (set),a
  184.     push    ix
  185.     pop    de
  186.     ld    hl,from_x
  187.     ld    bc,8
  188.     ldir
  189.     call    line
  190.     ld    de,8
  191.     add    ix,de
  192.     ld    l,(ix)
  193.     ld    h,(ix+1)
  194.     inc    hl
  195.     ld    a,h
  196.     or    l
  197.     jp    z,qxinit
  198.     xor    a
  199.     ld    (set),a
  200.     push    ix
  201.     pop    hl
  202.     ld    de,from_x
  203.     ld    bc,8
  204.     ldir
  205.     call    line
  206. qxinit:    ld    l,(ix-8)
  207.     ld    h,(ix-7)
  208.     ld    de,(comp1x)
  209.     add    hl,de
  210.     ld    (from_x),hl
  211.     call    fix_x
  212.     jp    m,x1_ok
  213.     ld    (comp1x),hl
  214.     ld    (from_x),bc
  215.     call    beep
  216. x1_ok:    ld    l,(ix-6)
  217.     ld    h,(ix-5)
  218.     ld    de,(comp1y)
  219.     add    hl,de
  220.     ld    (from_y),hl
  221.     call    fix_y
  222.     jp    m,y1_ok
  223.     ld    (comp1y),hl
  224.     ld    (from_y),bc
  225.     call    beep
  226. y1_ok:    ld    l,(ix-4)
  227.     ld    h,(ix-3)
  228.     ld    de,(comp2x)
  229.     add    hl,de
  230.     ld    (to_x),hl
  231.     call    fix_x
  232.     jp    m,x2_ok
  233.     ld    (comp2x),hl
  234.     ld    (to_x),bc
  235.     call    beep
  236. x2_ok:    ld    l,(ix-2)
  237.     ld    h,(ix-1)
  238.     ld    de,(comp2y)
  239.     add    hl,de
  240.     ld    (to_y),hl
  241.     call    fix_y
  242.     jp    m,y2_ok
  243.     ld    (comp2y),hl
  244.     ld    (to_y),bc
  245.     call    beep
  246. y2_ok:    push    ix
  247.     pop    hl
  248.     ld    de,ltable+no_line*8
  249.     or    a
  250.     sbc    hl,de
  251.     jp    c,qxloop
  252.     ld    ix,ltable
  253.     ld    hl,from_x
  254.     ld    de,ltable+no_line*8
  255.     ld    bc,8
  256.     ldir
  257.     jp    qxloop
  258.  
  259. fix_x:    ld    bc,1
  260.     or    a
  261.     sbc    hl,bc
  262.     jp    p,xbounc
  263.     call    neg16
  264.     xor    a
  265.     ret
  266.  
  267. xbounc:    ld    bc,510
  268.     or    a
  269.     sbc    hl,bc
  270.     ret    m
  271.     call    neg16
  272.     xor    a
  273.     ret
  274.  
  275. fix_y:    ld    bc,1
  276.     or    a
  277.     sbc    hl,bc
  278.     jp    p,ybounc
  279.     call    neg16
  280.     xor    a
  281.     ret
  282.  
  283. ybounc:    ld    bc,238
  284.     or    a
  285.     sbc    hl,bc
  286.     ret    m
  287.     call    neg16
  288.     xor    a
  289.     ret
  290.  
  291. neg16:    ld    hl,0        ; Negate de and place result in hl
  292.     or    a
  293.     sbc    hl,de
  294.     ret
  295.  
  296. line:
  297. ; This routine draws a straight line from (from_x, from_y) to (to_x, to_y)
  298.     call    calcxy
  299.     ex    af,af'
  300.     ld    a,(set)
  301.     ex    af,af'
  302.     ld    hl,(from_x)
  303.     ld    de,(to_x)
  304.     call    subabs
  305.     ld    b,h
  306.     ld    c,l
  307.     ld    hl,pix_lt
  308.     jp    nc,cupok
  309.     ld    hl,pix_rt
  310. cupok:    ld    (vect_1),hl
  311.     ld    hl,(from_y)
  312.     ld    de,(to_y)
  313.     call    subabs
  314.     ld    d,h
  315.     ld    e,l
  316.     ld    hl,pix_up
  317.     jp    nc,crtok
  318.     ld    hl,pix_dn
  319. crtok:    ld    (vect_2),hl
  320.     ld    h,b
  321.     ld    l,c
  322.     or    a
  323.     sbc    hl,de
  324.     jp    nc,swaphd
  325.     ld    hl,(vect_1)
  326.     ld    iy,(vect_2)
  327.     ld    (vect_2),hl
  328.     ld    (vect_1),iy
  329.     ld    h,b
  330.     ld    l,c
  331.     ex    de,hl
  332.     ld    b,h
  333.     ld    c,l
  334. swaphd:    push    bc
  335.     push    bc
  336.     ld    hl,0
  337.     srl    b
  338.     rr    c
  339.     or    a
  340.     sbc    hl,bc
  341.     push    hl
  342.     pop    iy
  343.     dec    iy
  344.     pop    bc
  345.     ld    hl,0
  346.     or    a
  347.     sbc    hl,bc
  348.     ld    b,h
  349.     ld    c,l
  350.     pop    hl
  351.     ld    a,h
  352.     or    l
  353.     jr    z,conend
  354. smline:    exx
  355.     call    c_plot
  356. smmove:    call    pix_rt
  357.     exx
  358.     add    iy,de
  359.     jp    nc,endmov
  360.     add    iy,bc
  361.     exx
  362. bgmove:    call    pix_dn
  363.     exx
  364. endmov:    dec    hl
  365.     ld    a,h
  366.     or    l
  367.     jp    nz,smline
  368. conend:    exx
  369.     call    c_plot
  370.     exx
  371.     ret
  372.  
  373. vect_1    equ    smmove+1
  374. vect_2    equ    bgmove+1
  375.  
  376. calcxy:    exx
  377.     ld    hl,(from_x)    ; calculate initial data for line drawing
  378.     ld    a,7
  379.     and    l
  380.     ld    b,a
  381.     ld    a,80h
  382.     jr    z,noshft
  383. shftpx:    srl    a
  384.     djnz    shftpx
  385. noshft:    ld    c,a
  386.     ld    a,0f8h
  387.     and    l
  388.     ld    l,a
  389.     add    hl,hl
  390.     ex    de,hl
  391.     ld    hl,(from_y)
  392.     ld    a,15
  393.     and    l
  394.     ld    b,a
  395.     ld    a,0e0h
  396.     and    l
  397.     rlca
  398.     rlca
  399.     rlca
  400.     ld    (bank),a
  401.     or    80h
  402.     out    (vmlatch),a
  403.     bit    4,l
  404.     ld    l,b
  405.     ld    h,0
  406.     jr    z,hlfblk
  407.     ld    h,4
  408. hlfblk:    add    hl,de
  409.     ld    de,grafix
  410.     add    hl,de
  411.     exx
  412.     ret
  413.  
  414. ; The next two routines set and reset the pixel at the current location
  415.  
  416. c_plot:    ex    af,af'
  417.     or    a
  418.     jp    z,creset
  419.     ex    af,af'
  420.     ld    a,c
  421.     or    (hl)
  422.     ld    (hl),a
  423.     ret
  424.  
  425. creset:    ex    af,af'
  426.     ld    a,c
  427.     or    (hl)
  428.     xor    c
  429.     ld    (hl),a
  430.     ret
  431.  
  432. ; The following routines, pix_lt, pix_rt, pix_up, pix_dn, move the current
  433. ; pixel location left, right, up and down respectively
  434.  
  435. pix_lt:    sla    c
  436.     ret    nc
  437.     ld    c,1
  438.     ld    de,-char
  439.     add    hl,de
  440.     ret
  441.  
  442. pix_rt:    srl    c
  443.     ret    nc
  444.     ld    c,80h
  445.     ld    de,char
  446.     add    hl,de
  447.     ret
  448.  
  449. pix_up:    ld    a,b
  450.     or    a
  451.     jr    z,chr_up
  452.     dec    b
  453.     dec    hl
  454.     ret
  455.  
  456. chr_up:    ld    de,char-1
  457.     ld    b,e
  458.     add    hl,de
  459.     ld    a,4
  460.     xor    h
  461.     ld    h,a
  462.     bit    2,h
  463.     ret    z
  464.     ld    a,(bank)
  465.     dec    a
  466.     ld    (bank),a
  467.     or    80h
  468.     out    (vmlatch),a
  469.     ret
  470.  
  471. pix_dn:    ld    a,b
  472.     inc    a
  473.     cp    char
  474.     jr    nc,chr_dn
  475.     ld    b,a
  476.     inc    hl
  477.     ret
  478.  
  479. chr_dn:    xor    a
  480.     ld    b,a
  481.     ld    de,-char+1
  482.     add    hl,de
  483.     ld    a,4
  484.     xor    h
  485.     ld    h,a
  486.     bit    2,h
  487.     ret    nz
  488.     ld    a,(bank)
  489.     inc    a
  490.     ld    (bank),a
  491.     or    80h
  492.     out    (vmlatch),a
  493.     ret
  494.  
  495. subabs:    ld    a,h        ;perform absolute of hl - de
  496.     cp    d
  497.     jp    c,abshls
  498.     jp    nz,absdes
  499.     ld    a,l
  500.     cp    e
  501.     jp    c,abshls
  502. absdes:    or    a
  503.     sbc    hl,de
  504.     ret
  505. abshls:    ex    de,hl
  506.     or    a
  507.     sbc    hl,de
  508.     scf
  509.     ret
  510.  
  511. beep:    ld    hl,begin    ; make a clicking noise
  512.     ld    c,speakr
  513.     ld    b,0
  514.     otir
  515.     xor    a
  516.     out    (speakr),a
  517.     ld    a,r        ; get pseudo-random number
  518.     and    7        ;  and decide whether to change colour
  519.     ret    nz
  520.     ld    a,r
  521.     and    38h
  522.     srl    a
  523.     srl    a
  524.     srl    a
  525.     ld    hl,q_col
  526.     add    a,(hl)
  527.     and    7
  528.     ld    (hl),a
  529.     add    a,8
  530.     ld    b,a
  531.     ld    a,c_swtch
  532.     out    (c_port),a
  533.     ld    hl,grafix
  534.     ld    (hl),b
  535.     ld    de,grafix+1
  536.     ld    bc,15*row-1
  537.     ldir
  538.     xor    a
  539.     out    (c_port),a
  540.     ret
  541.     
  542. reform:    ld    hl,v_64+15        ;routine to set up 64*16
  543. refrm2:    push    bc
  544.     push    hl
  545.     ld    b,10h
  546. format:    ld    a,b
  547.     dec    a
  548.     out    (0ch),a
  549.     ld    a,(hl)
  550.     out    (0dh),a
  551.     dec    hl
  552.     djnz    format
  553.     ld    b,4bh
  554.     call    leee3
  555.     pop    hl
  556.     pop    bc
  557.     ret
  558.  
  559. leee3:    push    hl            ;routine for 64*16
  560. leee4:    ld    hl,007ah
  561. leee7:    dec    hl
  562.     ld    a,h
  563.     or    l
  564.     jr    nz,leee7
  565.     djnz    leee4
  566.     pop    hl
  567.     ret
  568.  
  569. v_64:    db    6bh,64,51h,37h,12h,9,16,12h,48h,0fh,2fh,0fh,0,0,0,0
  570. m_prem:    db    'QUIX works only on Premium and later model Microbees.'
  571.     db    0dh,0ah,'$'
  572. m_quix:    db    'QUIX demo, by Vaughan Clarkson 1988'
  573. from_x:    dw    0
  574. from_y:    dw    0
  575. to_x:    dw    0
  576. to_y:    dw    0
  577. bank:    db    0
  578. set:    db    0
  579. q_col:    db    0
  580. comp1x:    dw    0
  581. comp1y:    dw    0
  582. comp2x:    dw    0
  583. comp2y:    dw    0
  584. ltable:    ds    (no_line+1)*8,0
  585.  
  586.     end    begin
  587.