home *** CD-ROM | disk | FTP | other *** search
/ Fujiology Archive / fujiology_archive_v1_0.iso / !FALCON / RG / RES_RIPR.ZIP / RES_RIPR / BLACKRIP.S < prev    next >
Encoding:
Text File  |  2005-04-30  |  24.0 KB  |  1,093 lines

  1. *********************************************************************
  2. * Reservoir Ripper II :: Coded by MrPink :: [c] 1998 Reservoir Gods *
  3. *********************************************************************
  4.  
  5. vars_y    equ    90
  6. regs_y    equ    40
  7. vecs_y    equ    6*7
  8.  
  9. start_ripper
  10.     move.l  a7,a5
  11.         move.l  4(a5),a5
  12.     lea    $80(a5),a0
  13.     move.l    a0,cmd_adr
  14.         move.l  12(a5),d0
  15.         add.l   20(a5),d0
  16.         add.l   28(a5),d0
  17.         add.l   #$100,d0
  18.         move.l  d0,-(sp)
  19.         move.l  a5,-(sp)
  20.         move    d0,-(sp)
  21.         move    #$4a,-(sp)
  22.         trap    #1
  23.         add.l   #12,sp
  24.  
  25.     move.w    #$59,-(a7)    ;get monitor
  26.     trap    #14
  27.     addq.l    #2,a7
  28.     cmp.w    #2,d0
  29.     bne.s    not_vga
  30.     st.b    vga_flag
  31. not_vga
  32.     pea    install_it(pc)
  33.     move.w    #$26,-(a7)
  34.     trap    #14
  35.     addq.l    #6,a7
  36.  
  37.     move.w    #0,-(a7)
  38.     move.l    #(end_ripper-start_ripper)+$100,-(a7)
  39.     move.w    #$31,-(a7)
  40.     trap    #1
  41.  
  42.     rts
  43.  
  44. install_it:
  45.     bsr    save_system
  46.     bsr    do_installation
  47.     rts
  48.  
  49. do_installation
  50.     move.w    sr,-(a7)
  51.     ori.w    #$0700,sr
  52.     move.l    #new_vbl,my_vector_table+$70
  53.     lea    my_vector_table,a0
  54.     movec    a0,VBR
  55.     move.w    (a7)+,sr
  56.     rts
  57.  
  58. check_option:
  59.     movem.l    d0-a6,-(a7)
  60.     clr.l    $ffff9800.w
  61. ;    not.w    $ffff9800.w
  62. ;    not.w    $ffff8240.w
  63.     lea    $ffff9200.w,a0    ;extended port address (read only)
  64.     move.w    #$fff7,2(a0)    ;write mask
  65.     move.w    (a0),d0        ;read fire data
  66.     btst    #1,d0        ;check for option
  67.     bne.s    no_option    ;if set, option is not pressed
  68.     bsr    init_ripper
  69. no_option:
  70.     movem.l    (a7)+,d0-a6
  71.     rts
  72.  
  73.  
  74. init_ripper:
  75.     move.l    a7,old_stack+2
  76.     lea    rip_stack,a7
  77.     move.w    sr,-(a7)
  78.     move.w    #$2700,sr
  79.     clr.b    begin_ripping_flag
  80.     clr.b    new_config
  81.     bsr    save_screen_info
  82.     lea    cur_system_vars,a0
  83.     bsr    save_cur_system
  84.     bsr    restore_system
  85.  
  86.     clr.b    $fffffa07.w        ;iera
  87.     clr.b    $fffffa13.w        ;imra
  88.     move.b    #%01000000,$fffffa09.w    ;ierb
  89.     move.b    #%01000000,$fffffa15.w    ;imrb
  90.     move.l    #temp_vbl,$70.w
  91.     move.w    #$2300,sr
  92.     bsr    save_pal
  93.     bsr    wait_vbl
  94.     bsr    init_screen
  95.     bsr    init_ikbd
  96.     bsr    get_pic_info
  97.     bsr    print_ripper_menu_txt    
  98.     move.b    #3,$fffffc00.w
  99.     move.b    #$96,$fffffc00.w
  100. do_ripper_menu:
  101.     tst.b    key_table+$3b
  102.     bne    show_screen
  103.     tst.b    key_table+$3c
  104.     bne    do_save_videl_file
  105.     tst.b    key_table+$3d
  106.     bne    do_save_file
  107.     tst.b    key_table+$3e
  108.     bne    do_save_god_file
  109.     tst.b    key_table+$3f
  110.     bne    do_save_tga_file
  111.     tst.b    key_table+$44
  112.     beq.s    do_ripper_menu
  113.     bsr    restore_ikbd
  114.     bsr    wait_vbl
  115.     bsr    restore_screen_info    
  116.     bsr    restore_pal
  117.     move.w    #$2700,sr
  118.     lea    cur_system_vars,a0
  119.     bsr    restore_cur_system
  120.     tst.b    new_config
  121.     beq.s    .no_new
  122.     clr.b    check_bit
  123.     bsr    do_installation
  124.     move.b    #1,check_bit
  125. .no_new
  126.     move.w    (a7)+,sr
  127. old_stack
  128.     lea    $12345678,a7
  129.     rts
  130.  
  131. new_vbl:    bsr    check_option
  132. old_vbl:    jmp    ([$70.w])
  133.  
  134. temp_vbl:    addq.l    #1,$466.w
  135.         rte
  136.  
  137. print_ripper_menu_txt:
  138.  
  139.     lea    ripper_txt,a0
  140.     move.l    #320-25*3,d0
  141.     moveq    #0,d1
  142.     bsr    print_string
  143.  
  144.     lea    coder_txt,a0
  145.     move.l    #320-22*3,d0
  146.     moveq    #10,d1
  147.     bsr    print_string
  148.  
  149.     lea    rg_txt,a0
  150.     move.l    #320-29*3,d0
  151.     moveq    #20,d1
  152.     bsr    print_string
  153.  
  154.     lea    menu_txt,a0
  155.     moveq    #0,d0
  156.     moveq    #40,d1
  157.     bsr    print_string
  158.  
  159.     lea    variables_txt,a0
  160.     moveq    #0,d0
  161.     move.l    #vars_y,d1
  162.     bsr    print_string
  163.  
  164.     move.w    pic_res,d0
  165.     move.l    (res_txts,d0.w*4),a0
  166.     moveq    #6*6,d0
  167.     move.l    #vars_y,d1
  168.     bsr    print_string
  169.  
  170.  
  171.     lea    st_txt,a0
  172.     tst.w    pic_pal
  173.     beq.s    .stpal
  174.     lea    falcon_txt,a0
  175. .stpal    move.l    #45*6,d0
  176.     move.l    #vars_y,d1
  177.     bsr    print_string
  178.  
  179.     lea    word_txts,a6
  180. .loop1    move.l    (a6)+,a0
  181.     cmpa.l    #0,a0
  182.     beq.    .el1
  183.     moveq    #0,d0
  184.     move.w    (a0),d0
  185.     bsr    conv_long_ascii
  186.     lea    long_string+6,a0
  187.     moveq    #0,d0
  188.     move.w    (a6)+,d0
  189.     move.w    (a6)+,d1
  190.     mulu    #6,d1
  191.     add.l    #vars_y,d1
  192.     pea    (a6)
  193.     bsr    print_string
  194.     move.l    (a7)+,a6
  195.     bra.s    .loop1    
  196.  
  197. .el1    lea    byte_txts,a6
  198. .loop2    move.l    (a6)+,a0
  199.     cmpa.l    #0,a0
  200.     beq.    .el2
  201.     moveq    #0,d0
  202.     move.b    (a0),d0
  203.     bsr    conv_long_ascii
  204.     lea    long_string+6,a0
  205.     moveq    #0,d0
  206.     move.w    (a6)+,d0
  207.     move.w    (a6)+,d1
  208.     mulu    #6,d1
  209.     add.l    #vars_y,d1
  210.     pea    (a6)
  211.     bsr    print_string
  212.     move.l    (a7)+,a6
  213.     bra.s    .loop2
  214.  
  215. .el2    lea    screen_vars+4,a6
  216.     moveq    #7,d7
  217.     moveq    #6*5,d6
  218. .loop3    moveq    #0,d0
  219.     move.w    (a6)+,d0
  220.     bsr    conv_long_ascii
  221.     lea    long_string+6,a0
  222.     move.l    d6,d0
  223.     move.l    #vars_y+6*2,d1
  224.     movem.l    d6-7/a6,-(a7)
  225.     bsr    print_string
  226.     movem.l    (a7)+,d6-7/a6
  227.     add.l    #6*10,d6
  228.     dbra    d7,.loop3
  229.  
  230.     moveq    #5,d7
  231.     moveq    #6*5,d6
  232. .loop4    moveq    #0,d0
  233.     move.w    (a6)+,d0
  234.     bsr    conv_long_ascii
  235.     lea    long_string+6,a0
  236.     move.l    d6,d0
  237.     move.l    #vars_y+6*3,d1
  238.     movem.l    d6-7/a6,-(a7)
  239.     bsr    print_string
  240.     movem.l    (a7)+,d6-7/a6
  241.     add.l    #6*10,d6
  242.     dbra    d7,.loop4
  243.  
  244.     moveq    #0,d0
  245.     move.w    screen_vars+34,d0        
  246.     bsr    conv_long_ascii
  247.     lea    long_string+6,a0
  248.     move.l    d6,d0
  249.     move.l    #vars_y+6*3,d1
  250.     movem.l    d6-7/a6,-(a7)
  251.     bsr    print_string
  252.     movem.l    (a7)+,d6-7/a6
  253.     add.l    #6*10,d6
  254.  
  255.     moveq    #0,d0
  256.     move.w    screen_vars+38,d0        
  257.     bsr    conv_long_ascii
  258.     lea    long_string+6,a0
  259.     move.l    d6,d0
  260.     move.l    #vars_y+6*3,d1
  261.     movem.l    d6-7/a6,-(a7)
  262.     bsr    print_string
  263.     movem.l    (a7)+,d6-7/a6
  264.     add.l    #6*10,d6
  265.  
  266.     rts
  267.  
  268.  
  269. show_screen
  270.     bsr    wait_vbl
  271.     bsr    restore_screen_info    
  272.     bsr    restore_pic_pal
  273. .wt    tst.b    key_table+$3b
  274.     bne.s    .wt
  275. show_loop
  276.     tst.b    key_table+$48
  277.     beq.s    .not_up
  278.  
  279.     lea    screen_vars-1,a0
  280.     move.l    (a0),d0
  281.     move.l    screenline_length,d1
  282.     tst.b    key_table+$1D
  283.     beq.s    .nuc
  284.     move.l    screen_length,d1
  285. .wnot_up
  286.     tst.b    key_table+$48
  287.     bne.s    .wnot_up
  288. .nuc
  289.     sub.l    d1,d0
  290.     bmi.s    .not_up
  291.     move.l    d0,(a0)
  292.     bra    show_screen
  293.  
  294. .not_up
  295.     tst.b    key_table+$50
  296.     beq.s    .not_down
  297.  
  298.     lea    screen_vars-1,a0
  299.     move.l    (a0),d0
  300.     move.l    screenline_length,d1
  301.     tst.b    key_table+$1D
  302.     beq.s    .ndc
  303.     move.l    screen_length,d1
  304. .wnot_down
  305.     tst.b    key_table+$50
  306.     bne.s    .wnot_down
  307.  
  308. .ndc
  309.     add.l    d1,d0
  310.     add.l    screen_length,d0
  311.     cmp.l    mem_top,d0
  312.     bge    .not_up
  313.  
  314.     move.l    (a0),d0
  315.     add.l    d1,d0
  316.     move.l    d0,(a0)
  317.     bra    show_screen
  318.  
  319. .not_down
  320.     tst.b    key_table+$4B
  321.     beq.s    .not_left
  322.  
  323.     tst.b    key_table+$1D
  324.     beq.s    .nlc
  325. .wnot_left
  326.     tst.b    key_table+$4B
  327.     bne.s    .wnot_left
  328. .nlc
  329.  
  330.     lea    screen_vars-1,a0
  331.     move.l    (a0),d0
  332.     moveq    #2,d1
  333.     sub.l    d1,d0
  334.     bmi.s    .not_left
  335.     move.l    d0,(a0)
  336.     bra    show_screen
  337.  
  338. .not_left
  339.     tst.b    key_table+$4D
  340.     beq.s    .not_right
  341.  
  342.  
  343.     tst.b    key_table+$1D
  344.     beq.s    .nrc
  345. .wnot_right
  346.     tst.b    key_table+$4D
  347.     bne.s    .wnot_right
  348. .nrc
  349.  
  350.     lea    screen_vars-1,a0
  351.     move.l    (a0),d0
  352.     moveq    #2,d1
  353.     add.l    d1,d0
  354.     add.l    screen_length,d0
  355.     cmp.l    mem_top,d0
  356.     bge.s    .not_right
  357.     move.l    (a0),d0
  358.     add.l    d1,d0
  359.     move.l    d0,(a0)
  360.     bra    show_screen
  361.  
  362. .not_right
  363.     tst.b    key_table+$3c
  364.     bne.s    start_st_pal
  365.     tst.b    key_table+$3d
  366.     bne.s    start_falc_pal    
  367.     tst.b    key_table+$3b
  368.     beq    show_loop
  369.     
  370.  
  371.     bsr    wait_vbl
  372.     bsr    set_my_screen
  373.     bsr    set_resolution
  374.     bsr    set_my_pal
  375. .wt    tst.b    key_table+$3b
  376.     bne.s    .wt    
  377.     bra    do_ripper_menu
  378.  
  379. start_st_pal:
  380.     clr.w    pic_pal
  381.     bsr    restore_pic_pal
  382.     bsr    unset_falc_pal
  383. .wt    tst.b    key_table+$3c
  384.     beq    show_loop
  385.     bra.s    .wt
  386.  
  387. start_falc_pal:
  388.     move.w    #1,pic_pal
  389.     bsr    restore_pic_pal
  390.     bsr    unset_st_pal
  391. .wt    tst.b    key_table+$3d
  392.     beq    show_loop
  393.     bra.s    .wt
  394.  
  395. do_save_tga_file
  396.     move.b    #3,god_mode
  397.     bra.s    dosavefile
  398. do_save_videl_file
  399.     move.b    #2,god_mode
  400.     bra.s    dosavefile
  401. do_save_god_file
  402.     move.b    #1,god_mode
  403.     bra.s    dosavefile
  404. do_save_file
  405.     clr.b    god_mode
  406. dosavefile
  407.     lea    enter_file_txt,a0
  408.     moveq    #0,d0
  409.     move.l    #160,d1
  410.     bsr    print_string
  411.     
  412. .wt1    tst.b    key_table+$3c
  413.     bne.s    .wt1
  414.  
  415.     bsr    enter_file_name
  416.     bmi    .err
  417.     bsr    restore_system
  418.     bsr    save_file
  419. .err    bsr    clear_my_screen
  420.     bsr    print_ripper_menu_txt
  421.     bsr    init_ikbd
  422.     bra    do_ripper_menu
  423.  
  424.  
  425. get_pic_info:
  426.     move.l    #'GRIP',magic
  427.     lea    screen_vars(pc),a0
  428.     bfextu    (a0){0:24},d0
  429.     move.l    d0,pic_adr
  430.     move.l    d0,cur_pic_adr
  431.  
  432.     moveq    #0,d0
  433.     move.w    40(a0),d0        ;line length (words)
  434.     add.w    d0,d0            ;length in bytes
  435.     move.w    d0,line_length        ;save
  436.  
  437.     bsr    get_pic_res
  438.  
  439.     move.w    28(a0),d0        ;82AA - VDE
  440.     sub.w    26(a0),d0        ;82A8 - VDB
  441.     move.w    38(a0),d1        ;82C0 - VCO
  442.  
  443.     btst    #1,d1            ;interlace mode
  444.     bne.s    .nint            ;yes
  445.     lsr.w    d0
  446. .nint    btst    #0,d1            ;line doubling?
  447.     beq.s    .nol
  448.     lsr.w    d0    
  449. .nol    move.w    d0,pic_y        ;store y size
  450.     mulu    40(a0),d0        ;line_width*y lines
  451.     add.l    d0,d0            ;*2 file length in bytes
  452.     move.l    d0,pic_length
  453.  
  454.     moveq    #0,d0
  455.     move.w    40(a0),d0
  456.     add.w    42(a0),d0
  457.     add.w    d0,d0
  458.     move.l    d0,screenline_length
  459.     mulu    pic_y,d0
  460.     move.l    d0,screen_length
  461.     rts
  462.  
  463. get_pic_res:
  464.     move.b    44(a0),d0            ;8260
  465.     move.w    36(a0),d1            ;8266
  466.     btst    #10,d1
  467.     bne    .two_colour
  468.     btst    #8,d1
  469.     bne    .true_colour
  470.     btst    #4,d1
  471.     bne    .eight_colour
  472.     tst.b    d0
  473.     beq    .sixteen_colour
  474.     cmp.b    #1,d0
  475.     beq    .four_colour
  476. .two_colour    
  477.     clr.w    pic_res
  478.     move.w    40(a0),d0        ;8210 - line width (words)
  479.     lsl.w    #4,d0            ;*16
  480.     move.w    d0,pic_x        ;x pixels
  481.     rts
  482. .four_colour
  483.     moveq    #62,d0
  484.     tst.b    vga_flag
  485.     beq.s    .nvga
  486.     moveq    #23,d0
  487. .nvga    cmp.w    4(a0),d0        ;HHT
  488.     bne    .sixteen_colour
  489.     move.w    #1,pic_res
  490.     move.w    40(a0),d0        ;8210 - line width (words)
  491.     lsl.w    #3,d0            ;*16
  492.     move.w    d0,pic_x        ;x pixels
  493.     rts
  494. .sixteen_colour
  495.     move.w    #2,pic_res
  496.     move.w    40(a0),d0        ;8210 - line width (words)
  497.     lsl.w    #2,d0            ;*4
  498.     move.w    d0,pic_x        ;x pixels
  499.     rts
  500. .eight_colour
  501.     move.w    #3,pic_res
  502.     move.w    40(a0),d0        ;8210 - line width (words)
  503.     add.w    d0,d0            ;*2
  504.     move.w    d0,pic_x        ;x pixels
  505.     rts
  506. .true_colour
  507.     move.w    #4,pic_res
  508.     move.w    40(a0),pic_x
  509. .cont    rts
  510.  
  511.  
  512.  
  513. enter_file_name
  514.     clr.w    text_counter
  515.  
  516. .loop    clr.b    key_pressed
  517. .wk    tst.b    key_pressed
  518.     beq.s    .wk
  519.     move.b    current_key,d1
  520.     cmp.b    #$1c,d1
  521.     beq    .end_entry
  522.     cmp.b    #1,d1
  523.     beq    .quit_entry
  524.     cmp.b    #$e,d1
  525.     bne.s    .nback
  526.  
  527.     subq.w    #1,text_counter
  528.     bpl.s    .pls
  529.     clr.w    text_counter
  530. .pls    lea    single_string,a0
  531.     move.b    #' ',(a0)
  532.     move.w    text_counter,d0
  533.     mulu    #6,d0
  534.     move.l    #170,d1
  535.     bsr    print_string
  536.  
  537.     lea    file_name,a0
  538.     move.w    text_counter,d0
  539.     clr.b    (a0,d0.w)
  540.     bra    .loop
  541.  
  542. .nback    lea    single_string,a0
  543.     move.b    (scan_code_table,d1.w),d1
  544.     move.b    d1,(a0)
  545.     move.w    text_counter,d0
  546.     lea    file_name,a1
  547.     move.b    d1,(a1,d0.w)
  548.     mulu    #6,d0
  549.     move.l    #170,d1
  550.     bsr    print_string
  551.  
  552.     cmp.w    #640/6-1,text_counter
  553.     bge.s    .ge
  554.     addq.w    #1,text_counter
  555. .ge
  556.  
  557.     bra    .loop
  558.  
  559. .quit_entry
  560.     moveq    #-1,d0
  561.     rts
  562.  
  563. .end_entry
  564.     move.w    text_counter,d0
  565.     clr.b    (file_name+1,d0.w)
  566.     moveq    #0,d0
  567.     rts
  568.  
  569.  
  570. wait_vbl:
  571.     move.l    d0,-(a7)
  572.     move.l    $466.w,d0
  573. .wt    cmp.l    $466.w,d0
  574.     beq.s    .wt
  575.     move.l    (a7)+,d0
  576.     rts
  577.  
  578.  
  579. ************************
  580. * VECTOR SAVE ROUTINES *
  581. *************************
  582.  
  583. save_system:
  584.     move.l    $42e.w,mem_top
  585.     lea    old_system_vars(pc),a0    
  586. save_cur_system
  587.     move.w    sr,-(a7)
  588.     move.w    #$2700,sr
  589.     movec    cacr,d0
  590.     move.w    d0,(a0)+
  591.     movec    VBR,d0
  592.     move.l    d0,(a0)+
  593.     move.l    $68.w,(a0)+            ; hbl
  594.     move.l    $70.w,(a0)+            ; vbl
  595.     move.l    $84.w,(a0)+            ; trap #1
  596.     move.l    $b4.w,(a0)+            ; trap #13
  597.     move.l    $b8.w,(a0)+            ; trap #14
  598.     move.l    $110.w,(a0)+            ; Timer D
  599.     move.l    $114.w,(a0)+            ; Timer C
  600.     move.l    $118.w,(a0)+            ; ikbd
  601.     move.l    $120.w,(a0)+            ; Timer B
  602.     move.l    $134.w,(a0)+            ; Timer A
  603.     move.l    $13c.w,(a0)+            ; mono detect
  604.     move.l    $456.w,(a0)+            ; vbl list ptr
  605.     move.l    $466.w,(a0)+            ; current vbl clock
  606.     move.l    $502.w,(a0)+            ; alt-help vector
  607.  
  608.     move.w    $ffff8900.w,(a0)+                ; Interruptions, Son DMA
  609.     move.b    $ffff8903.w,(a0)+                ; Start - High
  610.     move.b    $ffff8905.w,(a0)+                ; Start - Med
  611.     move.b    $ffff8907.w,(a0)+                ; Start - Low
  612.     move.b    $ffff890f.w,(a0)+                ; End - High
  613.     move.b    $ffff8911.w,(a0)+                ; End - Med
  614.     move.b    $ffff8913.w,(a0)+                ; End - Low
  615.     move.w    $ffff8920.w,(a0)+                ; Nb Voies, 8/16, Mono/Stereo
  616.     move.w    $ffff8930.w,(a0)+                ; Matrice : Sources
  617.     move.w    $ffff8932.w,(a0)+                ; Matrice : Destinations
  618.     move.w    $ffff8934.w,(a0)+                ; Prescales d'horloge
  619.     move.w    $ffff8936.w,(a0)+                ; Nb Voies Record,source ADDERIN
  620.     move.w    $ffff8938.w,(a0)+                ; Source ADC + Volumes entrĂ©es
  621.     move.w    $ffff893a.w,(a0)+                ; Volumes de Sortie
  622.  
  623.  
  624.     move.b    $fffffa07.w,(a0)+        ; iera
  625.     move.b    $fffffa09.w,(a0)+        ; ierb
  626.     move.b    $fffffa13.w,(a0)+        ; imra
  627.     move.b    $fffffa15.w,(a0)+        ; imrb
  628.     move.b    $fffffa17.w,(a0)+        ; vectore register
  629.     move.b    $fffffa19.w,(a0)+        ; Timer A control
  630.     move.b    $fffffa1b.w,(a0)+        ; Timer B control
  631.     move.b    $fffffa1d.w,(a0)+        ; Timer C & D control
  632.     move.b    $fffffa1f.w,(a0)+        ; Timer A data
  633.     move.b    $fffffa21.w,(a0)+        ; Timer B data
  634. ;    move.b    $fffffa23.w,(a0)+        ; Timer C data
  635.     move.b    $fffffa25.w,(a0)+        ; Timer D data
  636.     move.b    $ffff8007.w,(a0)+        ; 68030 Configuration 
  637.     move.w    (a7)+,sr
  638.     rts
  639.  
  640.  
  641. save_screen_info
  642.     lea    screen_vars(pc),a0
  643.     clr.w    -2(a0)
  644.  
  645.     move.b    $ffff8201.w,(a0)+    ; 0 Screen Adr (high)
  646.     move.b    $ffff8203.w,(a0)+    ; 1 Screen Adr (medium)
  647.     move.b    $ffff820d.w,(a0)+    ; 2 Screen Adr (low)
  648.     move.b    $ffff8265.w,(a0)+    ; 3 Horizontal Scroll
  649.  
  650.     move.w    $ffff8282.w,(a0)+    ; 4 Horizontal Hold Timer
  651.     move.w    $ffff8284.w,(a0)+    ; 6 Horizontal Border Begin
  652.     move.w    $ffff8286.w,(a0)+    ; 8 Horizontal Border End
  653.     move.w    $ffff8288.w,(a0)+    ;10 Horizontal Display Begin
  654.     move.w    $ffff828a.w,(a0)+    ;12 Horizontal display End 
  655.     move.w    $ffff828c.w,(a0)+    ;14 HSS-Synchro
  656.     move.w    $ffff828e.w,(a0)+    ;16 HFS
  657.     move.w    $ffff8290.w,(a0)+    ;18 HEE
  658.     move.w    $ffff82a2.w,(a0)+    ;20 Vertical Frequency Timer
  659.     move.w    $ffff82a4.w,(a0)+    ;22 Vertical Border Begin
  660.     move.w    $ffff82a6.w,(a0)+    ;24 Vertical Border End
  661.     move.w    $ffff82a8.w,(a0)+    ;26 Vertical Display Begin
  662.     move.w    $ffff82aa.w,(a0)+    ;28 Vertical Display End
  663.     move.w    $ffff82ac.w,(a0)+    ;30 VSS
  664.     move.w    $ffff820a.w,(a0)+    ;32 Video Sync Mode
  665.     move.w    $ffff82c0.w,(a0)+    ;34 Video Clock
  666.     move.w    $ffff8266.w,(a0)+    ;36 SPSHIFT - Falcon res
  667.     move.w    $ffff82c2.w,(a0)+    ;38 Video Control
  668.     move.w    $ffff8210.w,(a0)+    ;40 Falcon Line Width
  669.     move.w    $ffff820e.w,(a0)+    ;42 STe Line Width
  670.     move.b    $ffff8260.w,(a0)+    ;44 ST Resolution
  671.  
  672.     clr.b    (a0)            ;st flag    
  673.     move.l    a0,-(a7)
  674.     bsr    get_pic_info
  675.     move.l    (a7)+,a0
  676.  
  677.     move.w    pic_res,d0
  678.     jmp    ([st_check_rout,d0.w*4])
  679.  
  680. st_check_rout    dc.l    mono_st_check
  681.         dc.l    four_st_check
  682.         dc.l    sixteen_st_check
  683.         dc.l    non_st_check
  684.         dc.l    non_st_check
  685. mono_st_check
  686. non_st_check    
  687.     move.w    #1,pic_pal
  688.     rts
  689.  
  690. four_st_check
  691. ;    cmp.w    #640,pic_x
  692. ;    bne    non_st_check
  693. ;    cmp.w    #200,pic_y
  694. ;    bne    non_st_check
  695.     cmp.b    #1,-1(a0)
  696.     bne    non_st_check
  697.     st.b    (a0)
  698.     clr.w    pic_pal
  699.     rts
  700.  
  701. sixteen_st_check
  702.     cmp.w    #320,pic_x
  703.     bne    non_st_check
  704.     cmp.w    #200,pic_y
  705.     bne    non_st_check
  706.     st.b    (a0)
  707.     clr.w    pic_pal
  708.     rts
  709.  
  710.  
  711.  
  712. save_pal:
  713.     bsr    wait_vbl
  714.     lea    pal_space,a0
  715.     lea    $ffff8240.w,a1
  716.     moveq    #15,d0
  717. .save_st_pal
  718.     move.w    (a1)+,(a0)+
  719.     dbra    d0,.save_st_pal
  720.  
  721.     lea    $ffff9800.w,a1
  722.     move.w    #255,d0
  723. .save_falc_pal
  724.     move.l    (a1)+,(a0)+
  725.     dbra    d0,.save_falc_pal
  726.  
  727.  
  728.     rts
  729.  
  730. ***************************
  731. * SCREEN SETTING ROUTINES *
  732. ***************************
  733.  
  734.     clr.b    $ffff8265.w            ; Horizontal scroll reg=0
  735.     clr.w    $ffff820e.w
  736.  
  737.     lea    videl_640_200_2(pc),a0
  738.  
  739.     move.b    #2,$ffff820a.w            ; Internal sync
  740.     clr.b    $ffff8265.w            ; Horizontal scroll reg=0
  741.     addq.l    #4,a0                ; skip screen_length
  742.     move.w    (a0)+,$ffff820e.w        ; line width
  743.     move.w    (a0)+,$ffff8210.w        ; Falcon line width
  744.     move.w    (a0)+,d0            ; Resolution ST
  745.     move.w    (a0)+,d1            ; Resolution FALCON
  746.  
  747.     move.w    d1,$ffff8266.w            ; Resolution FALCON
  748.     tst.w    (a0)+                ; falcon screen mode?
  749.     beq.s    FalconRez            ; yes
  750.     move.b    d0,$ffff8260.w            ; Resolution ST
  751.     move.w    -8(a0),$ffff8210.w        ; Fa;cpm line width
  752. FalconRez
  753. ;    move.b    $ffff8007.w,d0
  754. ;    and.b    #%11,d0
  755. ;    cmp.b    #%10,d0
  756. ;    bne.s    R_OK                ; not VGA    
  757. ;    btst.b    #7,$ffff8006.w            ; VGA monitor ?
  758. ;    Beq.s    R_Ok                ; no, rgb
  759. ;    tst.b    vga_flag
  760. ;    beq.s    R_Ok
  761.     adda.w    #16*2,a0            ; get to VGA data
  762. R_Ok
  763.     move.w    (a0)+,$ffff8282.w        ; HHT - Hold counter
  764.     move.w    (a0)+,$ffff8284.w        ; HBB - Border Begin
  765.     move.w    (a0)+,$ffff8286.w        ; HBE - Border end
  766.     move.w    (a0)+,$ffff8288.w        ; HDB - Display Begin
  767.     move.w    (a0)+,$ffff828a.w        ; HDE - Display End
  768.     move.w    (a0)+,$ffff828c.w        ; HSS - Synchro
  769.     move.w    (a0)+,$ffff828e.w        ; HFS
  770.     move.w    (a0)+,$ffff8290.w        ; HEE
  771.     move.w    (a0)+,$ffff82a2.w        ; VFT - Synchro
  772.     move.w    (a0)+,$ffff82a4.w        ; VBB - Border Begin
  773.     move.w    (a0)+,$ffff82a6.w        ; VBE - Border End
  774.     move.w    (a0)+,$ffff82a8.w        ; VDB - Display Begin
  775.     move.w    (a0)+,$ffff82aa.w        ; VDE - Display End
  776.     move.w    (a0)+,$ffff82ac.w        ; VSS-Synchro
  777.     move.w    (a0)+,$ffff82c0.w        ; FALCON resoultion indicator
  778.     move.w    (a0),$ffff82c2.w        ; resolution info
  779.  
  780.     rts
  781.  
  782. set_resolution:
  783.     clr.b    $ffff8265.w            ; Horizontal scroll reg=0
  784.     clr.w    $ffff820e.w
  785.  
  786.     tst.b    vga_flag
  787.     beq    set_res_rgb
  788. set_res_vga:
  789.         MOVE.L   #$C6008E,$FFFF8282.W
  790.         MOVE.L   #$160274,$FFFF8286.W
  791.         MOVE.L   #$4D0096,$FFFF828A.W
  792.         MOVE.L   #$41903B9,$FFFF82A2.W
  793.         MOVE.L   #$990099,$FFFF82A6.W
  794.         MOVE.L   #$3B90415,$FFFF82AA.W
  795.         MOVE.W   #$200,$FFFF820A.W
  796.         MOVE.W   #$186,$FFFF82C0.W
  797.         CLR.W    $FFFF8266.W
  798.         MOVE.W   #$400,$FFFF8266.W
  799.         MOVE.W   #$9,$FFFF82C2.W
  800.         MOVE.W   #$28,$FFFF8210.W
  801.     rts
  802.  
  803. set_res_rgb:
  804.         MOVE.L   #$1FE0199,$FFFF8282.W
  805.         MOVE.L   #$5003ED,$FFFF8286.W
  806.         MOVE.L   #$9E01B2,$FFFF828A.W
  807.         MOVE.L   #$2710265,$FFFF82A2.W
  808.         MOVE.L   #$2F007F,$FFFF82A6.W
  809.         MOVE.L   #$20F026B,$FFFF82AA.W
  810.         MOVE.W   #$200,$FFFF820A.W
  811.         MOVE.W   #$182,$FFFF82C0.W
  812.         CLR.W    $FFFF8266.W
  813.         MOVE.W   #$400,$FFFF8266.W
  814.         MOVE.W   #$4,$FFFF82C2.W
  815.         MOVE.W   #$28,$FFFF8210.W
  816.     rts
  817.  
  818.         MOVE.L   #$1FE0128,$FFFF8282.W
  819.         MOVE.L   #$A803F5,$FFFF8286.W
  820.         MOVE.L   #$A601C5,$FFFF828A.W
  821.         MOVE.L   #$24501DF,$FFFF82A2.W
  822.         MOVE.L   #$4F004F,$FFFF82A6.W
  823.         MOVE.L   #$1DF0237,$FFFF82AA.W
  824.         MOVE.W   #$200,$FFFF820A.W
  825.         MOVE.W   #$186,$FFFF82C0.W
  826.         CLR.W    $FFFF8266.W
  827.         MOVE.W   #$400,$FFFF8266.W
  828.         MOVE.W   #$4,$FFFF82C2.W
  829.         MOVE.W   #$28,$FFFF8210.W
  830.     rts
  831.     
  832. init_screen:
  833.     lea    screen_space(pc),a0
  834.     move.l    a0,d0
  835.     clr.b    d0
  836.     lea    physic(pc),a1
  837.     move.l    d0,(a1)
  838.     bsr    wait_vbl
  839.     bsr    set_my_screen
  840.     bsr    set_resolution
  841.     bsr    clear_my_screen
  842.     bsr    set_my_pal
  843.     rts
  844.  
  845. set_my_screen:
  846.     lea    physic(pc),a1
  847.     movea.w    #$8201,a0    ;$fffff8201=screen address
  848.     move.b    1(a1),(a0)
  849.     move.b    2(a1),2(a0)    ;$fffff8203
  850.     move.b    3(a1),$C(a0)    ;$fffff820d
  851.     rts
  852.  
  853.     
  854. clear_my_screen
  855.     move.l    physic(pc),a1
  856.     move.l    #(640*200/8)/4-1,d0
  857. .cl    clr.l    (a1)+
  858.     dbra    d0,.cl
  859.     rts
  860.  
  861. set_my_pal:
  862.     lea    $ffff9800.w,a0
  863.     lea    $ffff8240.w,a1
  864.     moveq    #0,d0
  865.     move.l    d0,(a0)+
  866.     move.w    d0,(a1)+
  867.     moveq    #-1,d0
  868.     move.l    d0,(a0)+
  869.     move.w    d0,(a1)+
  870.     rts
  871.  
  872. ***************************
  873. * VECTOR RESTORE ROUTINES *
  874. ***************************
  875.  
  876. restore_system:
  877.     lea    old_system_vars(pc),a0    
  878. restore_cur_system:
  879.     move.w    sr,-(a7)
  880.     move.w    #$2700,sr
  881.     move.w    (a0)+,d0
  882.     movec    d0,cacr
  883.     move.l    (a0)+,d0
  884.     movec    d0,VBR
  885.     move.l    (a0)+,$68.w            ; hbl
  886.     move.l    (a0)+,$70.w            ; vbl
  887.     move.l    (a0)+,$84.w            ; trap #1
  888.     move.l    (a0)+,$b4.w            ; trap #13
  889.     move.l    (a0)+,$b8.w            ; trap #14
  890.     move.l    (a0)+,$110.w            ; Timer D
  891.     move.l    (a0)+,$114.w            ; Timer C
  892.     move.l    (a0)+,$118.w            ; ikbd
  893.     move.l    (a0)+,$120.w            ; Timer B
  894.     move.l    (a0)+,$134.w            ; Timer A
  895.     move.l    (a0)+,$13c.w            ; mono detect
  896.     move.l    (a0)+,$456.w            ; vbl list ptr
  897.     move.l    (a0)+,$466.w            ; current vbl clock
  898.     move.l    (a0)+,$502.w            ; alt-help vector
  899.  
  900.     move.w    (a0)+,$ffff8900.w                ; Interruptions, Son DMA
  901.     move.b    (a0)+,$ffff8903.w                ; Start - High
  902.     move.b    (a0)+,$ffff8905.w                ; Start - Med
  903.     move.b    (a0)+,$ffff8907.w                ; Start - Low
  904.     move.b    (a0)+,$ffff890f.w                ; End - High
  905.     move.b    (a0)+,$ffff8911.w                ; End - Med
  906.     move.b    (a0)+,$ffff8913.w                ; End - Low
  907.     move.w    (a0)+,$ffff8920.w                ; Nb Voies, 8/16, Mono/Stereo
  908.     move.w    (a0)+,$ffff8930.w                ; Matrice : Sources
  909.     move.w    (a0)+,$ffff8932.w                ; Matrice : Destinations
  910.     move.w    (a0)+,$ffff8934.w                ; Prescales d'horloge
  911.     move.w    (a0)+,$ffff8936.w                ; Nb Voies Record,source ADDERIN
  912.     move.w    (a0)+,$ffff8938.w                ; Source ADC + Volumes entrĂ©es
  913.     move.w    (a0)+,$ffff893a.w                ; Volumes de Sortie
  914.  
  915.  
  916.     move.b    (a0)+,$fffffa07.w        ; iera
  917.     move.b    (a0)+,$fffffa09.w        ; ierb
  918.     move.b    (a0)+,$fffffa13.w        ; imra
  919.     move.b    (a0)+,$fffffa15.w        ; imrb
  920.     move.b    (a0)+,$fffffa17.w        ; vectore register
  921.     move.b    (a0)+,$fffffa19.w        ; Timer A control
  922.     move.b    (a0)+,$fffffa1b.w        ; Timer B control
  923.     move.b    (a0)+,$fffffa1d.w        ; Timer C & D control
  924.     move.b    (a0)+,$fffffa1f.w        ; Timer A data
  925.     move.b    (a0)+,$fffffa21.w        ; Timer B data
  926. ;    move.b    (a0)+,$fffffa23.w        ; Timer C data
  927.     move.b    (a0)+,$fffffa25.w        ; Timer D data
  928.     move.b    (a0)+,$ffff8007.w        ; 68030 Configuration 
  929.     move.w    (a7)+,sr
  930.     rts
  931.  
  932.  
  933. restore_screen_info:
  934.     lea    screen_vars(pc),a0
  935.     move.b    (a0)+,$ffff8201.w    ; 0 Screen Adr (high)
  936.     move.b    (a0)+,$ffff8203.w    ; 1 Screen Adr (medium)
  937.     move.b    (a0)+,$ffff820d.w    ; 2 Screen Adr (low)
  938.     move.b    (a0)+,$ffff8265.w    ; 3 Horizontal Scroll
  939.  
  940.     move.w    (a0)+,$ffff8282.w    ; 4 Horizontal Hold Timer
  941.     move.w    (a0)+,$ffff8284.w    ; 6 Horizontal Border Begin
  942.     move.w    (a0)+,$ffff8286.w    ; 8 Horizontal Border End
  943.     move.w    (a0)+,$ffff8288.w    ;10 Horizontal Display Begin
  944.     move.w    (a0)+,$ffff828a.w    ;12 Horizontal display End 
  945.     move.w    (a0)+,$ffff828c.w    ;14 HSS-Synchro
  946.     move.w    (a0)+,$ffff828e.w    ;16 HFS
  947.     move.w    (a0)+,$ffff8290.w    ;18 HEE
  948.     move.w    (a0)+,$ffff82a2.w    ;20 Vertical Frequency Timer
  949.     move.w    (a0)+,$ffff82a4.w    ;22 Vertical Border Begin
  950.     move.w    (a0)+,$ffff82a6.w    ;24 Vertical Border End
  951.     move.w    (a0)+,$ffff82a8.w    ;26 Vertical Display Begin
  952.     move.w    (a0)+,$ffff82aa.w    ;28 Vertical Display End
  953.     move.w    (a0)+,$ffff82ac.w    ;30 VSS
  954.     move.w    (a0)+,$ffff820a.w    ;32 Video Sync Mode
  955.     move.w    (a0)+,$ffff82c0.w    ;34 Video Clock
  956.     move.w    (a0)+,$ffff8266.w    ;36 SPSHIFT - Falcon res
  957.     tst.b    7(a0)
  958.     beq.s    .no_st
  959.     move.b    6(a0),$ffff8260.w
  960. .no_st
  961.     move.w    (a0)+,$ffff82c2.w    ;38 Video Control
  962.     move.w    (a0)+,$ffff8210.w    ;40 Falcon Line Width
  963.     move.w    (a0)+,$ffff820e.w    ;42 STe Line Width
  964.     rts
  965.  
  966.  
  967. restore_pic_pal
  968.     bsr    wait_vbl
  969.     tst.w    pic_pal
  970.     beq    restore_st_pal
  971.     bra    restore_falc_pal
  972.  
  973. restore_pal
  974.     bsr    wait_vbl
  975.     bsr    restore_st_pal
  976.     bsr    restore_falc_pal
  977.     rts
  978.  
  979. restore_st_pal
  980.     lea    pal_space,a0
  981.     lea    $ffff8240.w,a1
  982.     moveq    #15,d0
  983. .save_st_pal
  984.     move.w    (a0)+,(a1)+
  985.     dbra    d0,.save_st_pal
  986.     rts
  987.  
  988. unset_st_pal
  989.     lea    $ffff8240.w,a0
  990.     moveq    #0,d0
  991.     moveq    #7,d1
  992. .uns    move.l    d0,(a0)+
  993.     dbra    d1,.uns
  994.     rts
  995.  
  996. restore_falc_pal
  997.     lea    pal_space+32,a0
  998.     lea    $ffff9800.w,a1
  999.     move.w    #255,d0
  1000. .save_falc_pal
  1001.     move.l    (a0)+,(a1)+
  1002.     dbra    d0,.save_falc_pal
  1003.     rts
  1004.  
  1005. unset_falc_pal
  1006.     lea    $ffff9800.w,a0
  1007.     moveq    #0,d0
  1008.     move.w    #255,d1
  1009. .uns    move.l    d0,(a0)+
  1010.     dbra    d1,.uns
  1011.     rts
  1012.  
  1013.  *-------------------*
  1014. ** KEYBOARD ROUTINES **
  1015.  *-------------------*
  1016.  
  1017.  
  1018. init_ikbd:    bsr    clear_ikbd
  1019.         moveq    #$11,d0
  1020.         bsr    send_ikbd
  1021.         move.l    $118.w,old118
  1022.         move.l    #my_ikbd,$118.w
  1023.         lea    key_table,a0
  1024.         moveq    #127,d0
  1025. .cl        clr.b    (a0)+
  1026.         dbra    d0,.cl
  1027.         rts
  1028.  
  1029. restore_ikbd:    bsr    clear_ikbd
  1030.         move.l    old118,$118.w
  1031.         rts
  1032.  
  1033. clear_ikbd:     btst    #0,$fffffc00.w        ;is ikbd data reg full?
  1034.                 beq.s   ikbd_ok            ;its empty so end
  1035.                 move.b  $fffffc02.w,D0        ;get ikbd data
  1036.                 bra.s   clear_ikbd        ;loop
  1037. ikbd_ok:        rts                             ;return
  1038.  
  1039. send_ikbd:      lea     $fffffc00.w,a0        ;ikbd control register
  1040. waitkeyready:   btst    #1,(a0)            ;is data reg empty?
  1041.                 beq.s   waitkeyready        ;no, wait for empty
  1042.                 move.b  d0,2(a0)        ;write to ikbd data reg
  1043.                 rts                             ;return
  1044.  
  1045. my_ikbd:    move.w    #$2500,sr        ;set ipl level
  1046.  
  1047.         movem.l    d0/a0-a1,-(a7)        ;save registers
  1048.         movea.w    #$fffffc00,a0        ;ikbd control registers
  1049.  
  1050.         move.b    (a0),d0            ;read control reg
  1051.         btst    #7,d0            ;int request?
  1052.         beq    endmykey        ;no
  1053.  
  1054. keyloop        moveq    #0,d0            ;clear d0
  1055.         move.b    2(a0),d0        ;read ikbd data
  1056.         tst.b    key_cntr        ;is this first byte
  1057.         beq    chk_head        ;yes, so check for header
  1058.         
  1059.         move.l    key_ptr(pc),a1        ;ptr into key storage area
  1060.         move.b    d0,(a1)+        ;store keyboard data
  1061.         move.l    a1,key_ptr        ;update ptr
  1062.         subq.b    #1,key_cntr        ;decrement data to get
  1063.         bne    last_key_check        ;more data to get
  1064.  
  1065. process_packet:
  1066.         lea    key_buffer,a1        ;start of key storage data
  1067.         moveq    #0,d0            ;clear d0
  1068.         move.b    (a1),d0            ;get first byte
  1069.         sub.l    #$f6,d0        ;minus default packet header value
  1070.         and.w    #$f,d0            ;mask off unwanted bits
  1071.         cmp.w    #10,d0            ;is it a valid packet
  1072.         bge.s    .noj            ;no
  1073.         jsr    ([key_handlers,d0.w*4])    ;jump to packet handler routine
  1074. .noj        bra    last_key_check        ;check for more key data
  1075.  
  1076. chk_head    cmp.w    #$f6,d0            ;is it packer header
  1077.         blt.s    store_key        ;no, store as a key
  1078.  
  1079.         move.b    d0,key_buffer        ;store packet header
  1080.         move.l    #key_buffer+1,key_ptr    ;init key pointer
  1081.         lea    packet_table,a1        ;packet table
  1082.         sub.b    #$f6,d0            ;d0 is offset
  1083.         move.b    (a1,d0.w),key_cntr    ;bytes of data to be read
  1084.         bra    last_key_check        ;get data
  1085.  
  1086. store_key
  1087. ;        IFNE    DEBUG
  1088. ;        movem.l    d0-a6,-(a7)
  1089. ;        lea    $f96.w,a0
  1090. ;        jsr    ([$1132.w])
  1091. ;        movem.l    (a7)+,d0-a6
  1092. ;        ENDC
  1093.