home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / falcon / utility / fs2 / fss.s < prev    next >
Text File  |  1993-05-11  |  7KB  |  360 lines

  1. ; FalconScreen
  2. ; ============
  3. ;
  4. ; Copyright 1993 by Markus Gutschke
  5. ;
  6. ; For detailed information read the README file or the header
  7. ; of the C module
  8. ;
  9. ;
  10. ; Export interfaces to system calls
  11.         export    LineA0
  12.         export    Kbshift,Physbase,Setscreen,Vsetmode,Montype
  13.         export    VsetRGB,VgetRGB
  14.         export    Pterm0,Cnecin,Cconws,Cconis,Srealloc,Super,Fopen
  15.         export    Fclose,Fread,Fwrite,Fseek,Malloc,Mfree
  16. ; Import some C-function and global variables
  17.         import    main,init,setscreen,vsetmode,vgetsize
  18.         import    settings
  19.  
  20.         equ        stacksize,$1000    ; the programs initial stack size
  21.         equ        ID,$E4465343    ; XBRA Id (c.f. C module)
  22.  
  23.         offset    0                ; data structure of the patch
  24. magic:    ds.l    1                ; area
  25. size:    ds.w    1
  26. mask:    ds.w    1
  27. value:    ds.w    1
  28. planes:    ds.w    1
  29. n:        ds.w    1
  30. width:    ds.w    1
  31. height:    ds.w    1
  32.         
  33.         text
  34.  
  35.         bra.b    start            ; this instruction has to be 2 bytes long
  36. set:    dc.l    settings        ; pointer to patch area
  37. start:    move.l    set,a0            ; check integrity of the executable
  38.         cmpi.l    #ID,magic(a0)
  39.         beq        valprg
  40. Pterm0:    clr.w    -(sp)            ; terminate
  41.         trap    #1
  42. valprg:    move.l    4(sp),a0        ; get address of basepage
  43.         move.l    #256,d0            ; calculate program size
  44.         add.l    12(a0),d0
  45.         add.l    20(a0),d0
  46.         add.l    28(a0),d0
  47.         move.l    d0,d1
  48.         add.l    #stacksize,d1    ; initialize user stack
  49.         move.l    d1,d2
  50.         add.l    a0,d2
  51.         andi.b    #$FC,d2
  52.         move.l    d2,sp
  53.         clr.w    -(sp)            ; set parameters for Ptermres
  54.         move.l    d0,-(sp)
  55.         move.w    #$31,-(sp)
  56.         move.l    d1,-(sp)        ; Mshrink
  57.         pea        (a0)
  58.         move.l    #$4a0000,-(sp)
  59.         trap    #1
  60.         lea        $c(sp),sp
  61.         bsr        main            ; call C module
  62.         move.w    d0,-(sp)
  63.         pea        vdiinit            ; initialize trap handler
  64.         move.w    #$26,-(sp)
  65.         trap    #$e
  66.         addq.l    #6,sp
  67.         tst.w    (sp)+
  68.         beq        done
  69.         move.l    #$00030088,-(sp); force reinitialization of
  70.         pea        0.w                ; video mode...
  71.         pea        0.w                ; (does not work under MiNT!)
  72.         move.w    #$5,-(sp)
  73.         trap    #$e
  74.         lea        $e(sp),sp
  75.         move.l    #$0003001a,-(sp)
  76.         pea        0.w
  77.         pea        0.w
  78.         move.w    #$5,-(sp)
  79.         trap    #$e
  80.         lea        $e(sp),sp
  81. done:    trap    #1                ; Ptermres
  82.  
  83. vdiinit:move.l    $88.w,vdivec    ; link into trap handler
  84.         move.l    #vdihdl,$88.w
  85.         move.l    $b8.w,xbvec
  86.         move.l    #xbhdl,$b8.w
  87.         rts
  88.  
  89.         dc.l    'XBRA'
  90.         dc.l    ID
  91. vdivec:    ds.l    1
  92. vdihdl:    cmpi.w    #115,d0            ; check for VDI call
  93.         beq        isvdi
  94. doold:    move.l    vdivec,-(sp)
  95.         rts
  96. isvdi:    move.l    d1,a0
  97.         move.l    (a0),a1
  98.         cmpi.w    #1,(a1)            ; check for v_opnwk
  99.         bne        doold
  100.         move.l    4(a0),a1
  101.         cmpi.w    #11,(a1)        ; check device handle
  102.         bhs        doold
  103.         move.l    a0,-(sp)
  104.         tst.w    $59e.w            ; set up fake stack frame
  105.         beq        vshort
  106.         clr.w    -(sp)
  107. vshort:    pea        vcont(pc)
  108.         move.w    sr,-(sp)
  109.         move.l    vdivec,-(sp)
  110.         rts                        ; call v_opnw
  111. vcont:    move.l    #$58ffff,-(sp)    ; check resolution
  112.         trap    #$e
  113.         addq.l    #4,sp
  114.         move.l    set,a0
  115.         and.w    mask(a0),d0
  116.         cmp.w    value(a0),d0
  117.         movem.l    (sp)+,a0
  118.         bne        illres
  119.         move.l    $c(a0),a1        ; patch intout array
  120.         move.l    set,a0
  121.         move.w    width(a0),d0
  122.         subq    #1,d0
  123.         move.w    d0,(a1)
  124.         move.w    height(a0),d0
  125.         subq    #1,d0
  126.         move.w    d0,2(a1)
  127.         moveq    #1,d0
  128.         move.w    planes(a0),d1
  129.         lsl.w    d1,d0
  130.         move.w    d0,26(a1)
  131.         movem.l    d0-d2,-(sp)
  132.         moveq    #0,d0
  133.         bsr        init            ; initialize without realloc!
  134.         movem.l    (sp)+,d0-d2
  135. illres:    rte
  136.  
  137.  
  138.         dc.l    'XBRA'
  139.         dc.l    ID
  140. xbvec:    ds.l    1
  141. xbhdl:    move.l    usp,a0
  142.         btst.b    #5,(sp)
  143.         beq        xbstk
  144.         lea        6(sp),a0
  145.         tst.w    $59e.w
  146.         beq        xbstk
  147.         lea        8(sp),a0
  148. xbstk:    move.w    (a0),d0
  149.         cmpi.w    #5,d0            ; Vsetscreen
  150.         bhi        nosetsc
  151.         blo        oldxb
  152.         lea        xscont(pc),a1
  153. xbfake:    move.l    $c(a0),-(sp)    ; copy parameters
  154.         move.l    $8(a0),-(sp)
  155.         move.l    $4(a0),-(sp)
  156.         move.l    (a0),-(sp)
  157.         tst.w    $59e.w            ; set up fake stack frame
  158.         beq        xbshort
  159.         clr.w    -(sp)
  160. xbshort:pea        (a1)
  161.         move.w    sr,-(sp)
  162. oldxb:    move.l    xbvec,-(sp)        ; call old xbios handler
  163.         rts
  164. nosetsc:cmpi.w    #$58,d0            ; Vsetmode
  165.         blo        oldxb
  166.         bhi        novsmd
  167.         lea        xmcont(pc),a1
  168.         bra        xbfake
  169. novsmd:    cmpi.w    #$5b,d0            ; Vgetsize
  170.         bne        oldxb
  171.         lea        xzcont(pc),a1
  172.         bra        xbfake
  173. xscont:    move.w    $a(sp),d1
  174.         move.w    $c(sp),d2
  175.         move.l    6(sp),a1
  176.         move.l    2(sp),a0
  177.         bsr        setscreen
  178.         lea        $10(sp),sp
  179.         rte
  180. xmcont:    move.w    2(sp),d1
  181.         bsr        vsetmode
  182.         lea        $10(sp),sp
  183.         rte
  184. xzcont:    move.w    2(sp),d1
  185.         bsr        vgetsize
  186.         lea        $10(sp),sp
  187.         rte
  188.  
  189. ;
  190. ; this is a list of binding for OS calls, so we do not need to link
  191. ; any libraries...
  192. ;
  193.  
  194. LineA0:    movem.l    d3-d7/a2-a6,-(sp)
  195.         dc.w    $a000
  196.         move.l    d0,a0
  197.         movem.l    (sp)+,d3-d7/a2-a6
  198.         rts
  199.  
  200. Kbshift:move.l    a2,-(sp)
  201.         move.w    d0,-(sp)
  202.         move.w    #$b,-(sp)
  203.         trap    #$d
  204.         addq.l    #4,sp
  205.         move.l    (sp)+,a2
  206.         rts
  207.  
  208. Physbase:move.l    a2,-(sp)
  209.         move.w    #2,-(sp)
  210.         trap    #$e
  211.         addq.l    #2,sp
  212.         move.l    d0,a0
  213.         move.l    (sp)+,a2
  214.         rts
  215.  
  216. Setscreen:move.l a2,-(sp)
  217.         move.w    d1,-(sp)
  218.         move.w    d0,-(sp)
  219.         pea        (a1)
  220.         pea        (a0)
  221.         move.w    #5,-(sp)
  222.         trap    #$e
  223.         lea        $e(sp),sp
  224.         move.l    (sp)+,a2
  225.         rts
  226.  
  227. Vsetmode:move.l    a2,-(sp)
  228.         move.w    d0,-(sp)
  229.         move.w    #$58,-(sp)
  230.         trap    #$e
  231.         addq.l    #4,sp
  232.         move.l    (sp)+,a2
  233.         rts
  234.  
  235. Montype:move.l    a2,-(sp)
  236.         move.w    #$59,-(sp)
  237.         trap    #$e
  238.         addq.l    #2,sp
  239.         move.l    (sp)+,a2
  240.         rts
  241.  
  242. VgetRGB:move.w    #$5e,d2
  243.         bra        VRGB
  244. VsetRGB:move.w    #$5d,d2
  245. VRGB:    move.l    a2,-(sp)
  246.         move.l    a0,-(sp)
  247.         move.w    d1,-(sp)
  248.         move.w    d0,-(sp)
  249.         move.w    d2,-(sp)
  250.         trap    #$e
  251.         lea        $a(sp),sp
  252.         move.l    (sp)+,a2
  253.         rts
  254.  
  255. Cnecin:    movem.l    d3-d4/a2-a4,-(sp)
  256.         move.w    #8,-(sp)
  257.         trap    #1
  258.         addq.l    #2,sp
  259.         movem.l    (sp)+,d3-d4/a2-a4
  260.         rts
  261.  
  262. Cconws:    movem.l    d3-d4/a2-a4,-(sp)
  263.         pea        (a0)
  264.         move.w    #9,-(sp)
  265.         trap    #1
  266.         addq.l    #6,sp
  267.         movem.l    (sp)+,d3-d4/a2-a4
  268.         rts
  269.  
  270. Cconis:    movem.l    d3-d4/a2-a4,-(sp)
  271.         move.w    #$b,-(sp)
  272.         trap    #1
  273.         addq.l    #2,sp
  274.         movem.l    (sp)+,d3-d4/a2-a4
  275.         rts
  276.  
  277. Srealloc:movem.l d3-d4/a2-a4,-(sp)
  278.         move.l    d0,-(sp)
  279.         move.w    #$15,-(sp)
  280.         trap    #1
  281.         addq.l    #6,sp
  282.         move.l    d0,a0
  283.         movem.l    (sp)+,d3-d4/a2-a4
  284.         rts
  285.  
  286. Super:    movem.l d3-d4/a2-a4,-(sp)
  287.         pea        (a0)
  288.         move.w    #$20,-(sp)
  289.         trap    #1
  290.         addq.l    #6,sp
  291.         move.l    d0,a0
  292.         movem.l    (sp)+,d3-d4/a2-a4
  293.         rts
  294.  
  295. Fopen:    movem.l d3-d4/a2-a4,-(sp)
  296.         move.w    d0,-(sp)
  297.         pea        (a0)
  298.         move.w    #$3d,-(sp)
  299.         trap    #1
  300.         addq.l    #8,sp
  301.         movem.l    (sp)+,d3-d4/a2-a4
  302.         rts
  303.  
  304. Fclose:    movem.l d3-d4/a2-a4,-(sp)
  305.         move.w    d0,-(sp)
  306.         move.w    #$3e,-(sp)
  307.         trap    #1
  308.         addq.l    #4,sp
  309.         movem.l    (sp)+,d3-d4/a2-a4
  310.         rts
  311.  
  312. Fread:    movem.l d3-d4/a2-a4,-(sp)
  313.         pea        (a0)
  314.         move.l    d1,-(sp)
  315.         move.w    d0,-(sp)
  316.         move.w    #$3f,-(sp)
  317.         trap    #1
  318.         lea        $c(sp),sp
  319.         movem.l    (sp)+,d3-d4/a2-a4
  320.         rts
  321.  
  322. Fwrite:    movem.l d3-d4/a2-a4,-(sp)
  323.         pea        (a0)
  324.         move.l    d1,-(sp)
  325.         move.w    d0,-(sp)
  326.         move.w    #$40,-(sp)
  327.         trap    #1
  328.         lea        $c(sp),sp
  329.         movem.l    (sp)+,d3-d4/a2-a4
  330.         rts
  331.  
  332. Fseek:    movem.l d3-d4/a2-a4,-(sp)
  333.         move.w    d2,-(sp)
  334.         move.w    d1,-(sp)
  335.         move.l    d0,-(sp)
  336.         move.w    #$42,-(sp)
  337.         trap    #1
  338.         lea        $a(sp),sp
  339.         movem.l    (sp)+,d3-d4/a2-a4
  340.         rts
  341.  
  342. Malloc:    movem.l    d3-d4/a2-a4,-(sp)
  343.         move.l    d0,-(sp)
  344.         move.w    #$48,-(sp)
  345.         trap    #1
  346.         addq.l    #6,sp
  347.         move.l    d0,a0
  348.         movem.l    (sp)+,d3-d4/a2-a4
  349.         rts
  350.  
  351. Mfree:    movem.l    d3-d4/a2-a4,-(sp)
  352.         move.l    a0,-(sp)
  353.         move.w    #$49,-(sp)
  354.         trap    #1
  355.         addq.l    #6,sp
  356.         movem.l    (sp)+,d3-d4/a2-a4
  357.         rts
  358.  
  359.         end
  360.