home *** CD-ROM | disk | FTP | other *** search
/ Millennium Time Capsule / AC2000.BIN / disks / ac9_disk / g172src / gemmaos.s < prev   
Encoding:
Text File  |  1997-11-15  |  33.2 KB  |  1,607 lines

  1. *
  2. * The STOS loader program, commented and labeled
  3. * by Anthony Jacques (jacquesa@cs.man.ac.uk)
  4. * and Paul Jones (paulat.jones@zetnet.co.uk).
  5. *
  6. * Original code by Francois Lionet, and others at
  7. * Jawx / Mandarin Software.
  8. *
  9. * Modifications made by Anthony Jacques:
  10. *   - Extra OS version support
  11. *   - Support for Falcon screen modes 
  12. *   - This is now determined by _MCH cookie, so no confusion with Magic 4/5
  13. *   - OS version detection routine cleaned up
  14. *   - TOS version number now displays correct number.
  15. * Additional by Paul Jones:
  16. *   - When exiting on Falcon resolutions does not crash.
  17. *   - STOS doesn't assume it has all available memory. Mfree all memory 
  18. *     apart from 100000 bytes, then allocate memory for STOS with malloc.
  19. *     STOS 'free' command returns 600000 on my machine, malloc -1 (largest 
  20. *     block of memory is over a meg _without_ the GEMMA acc!!!
  21. *   - STOS now works in MultiTOS, and with GEMMA!...
  22. *
  23. * Known bugs:
  24. *   - When quit, system colours appear darker on Falcons when in a ST
  25. *     compatable mode (!)
  26. *
  27. * Recent changes:
  28. *   - Added tables for TOS 3.01 and 3.06 (from STOSfix1.1)
  29. *   - Added code for correcting table on unrecognised TOS version.
  30.  
  31.   output c:\basic208.prg
  32.  
  33. aes    macro    aes_number
  34.     move    #\1,d0
  35.     lea.l    control(pc),a1
  36.     move.w    d0,(a1)+            store the op code
  37.     sub.w    #10,d0
  38.     mulu    #3,d0            size is the priority, not speed
  39.     lea.l    gem_ctrl_list(pc),a0
  40.     add.w    d0,a0            points to the entry
  41.     moveq    #0,d0
  42.     move.b    (a0)+,d0
  43.     move.w    d0,(a1)+        do control1
  44.     move.b    (a0)+,d0
  45.     move.w    d0,(a1)+        and control2
  46.     move.b    (a0)+,d0
  47.     move.w    d0,(a1)+        and control3
  48.     clr.w    (a1)            assumes control4=0 (all except RSRC_GADDR)
  49.     lea.l    aes_params(pc),a2
  50. * aes_params    dc.l    control,global,int_in,int_out,addr_in,addr_out
  51.  
  52.     lea.l    control(pc),a4
  53.     move.l    a4,(a2)
  54.     lea.l    global(pc),a4
  55.     move.l    a4,4(a2)
  56.     lea.l    int_in(pc),a4
  57.     move.l    a4,8(a2)
  58.     lea.l    int_out(pc),a4
  59.     move.l    a4,12(a2)
  60.     lea.l    addr_in(pc),a4
  61.     move.l    a4,16(a2)
  62.     lea.l    addr_out(pc),a4
  63.     move.l    a4,20(a2)
  64.  
  65.     move.l    a2,d1
  66.     move.w    #200,d0            function number
  67.     trap    #2
  68. *    moveq.l    #0,d2
  69. *    move.l    d0,d3
  70. *    lea    int_out-DATA(a3),a0
  71. *    move.l    (a0),-(a6)        usually a returned value
  72.     endm
  73.  
  74.   bra    start 
  75.  
  76. * Here are all the TOS tables for TOS's
  77. * 1.00, 1.01, 1.02, 1.04, 1.06, 1.62, 2.05, 2.06
  78. * 3.01, 3.06, 4.01, 4.02, 4.04, 4.96. 
  79. * 1.0 is the default.
  80. * 3.05 included, but invalid. (copied from 3.06)
  81.  
  82. aes_params    ds.l    6
  83. control        ds.w    5
  84. global        ds.w    14
  85. int_in        ds.w    16
  86. int_out        ds.w    7
  87. addr_in        ds.l    3
  88. addr_out    ds.l    1
  89. gemma        dc.b    0,4,"1.65"
  90. mystore        ds.l    1
  91. x_out        ds.l    1
  92. y_out        ds.l    1
  93. w_out        ds.l    1
  94. h_out        ds.l    1
  95. button        ds.l    1
  96. kstate        ds.l    1
  97. key_pressed    ds.l    1
  98. gotclicks    ds.l    1
  99. addr        ds.l    1
  100. oldsp        ds.l    1
  101. newsp        ds.l    1
  102.  
  103. mupb        ds.l    1
  104.  
  105. dump1        ds.w    1
  106. dump2        ds.l    1
  107. dump3        ds.l    1
  108. dump4        ds.l    1
  109.  
  110. param        ds.l    4
  111.  
  112. * the number of tables - 1
  113. NUM_OSVERS    equ    14
  114.  
  115. * selected if users OS is not this one.
  116. defaultTOS:
  117.   dc.b      $01,$00       OS version number
  118. *                         This I believe the values are. (from BASICMJH)
  119. TOStables:
  120.   dc.l      $000026E0     GCURX (current mouse X)           - Line A
  121. * 8
  122.   dc.l      $00000E09     kbdvbase() + $3D  (wrong)
  123. * 16  
  124.   dc.l      $000DB000     IORec()
  125. * 24
  126.   dc.l      $00268600     DEV_TAB (45 words of v_opnwk)     - Line A
  127. * 32
  128.   dc.l      $00274800     SIZE_TAB (15 words of dev coords) - Line A
  129. * 40  
  130.   dc.l      $000DDC00     kbdvbase() + $10  (wrong)
  131. * 44
  132.   dc.l      $00000E44     kbdvbase() + $78  (wrong)
  133.  
  134.   dc.b      $01,$01
  135.   dc.l      $000026E0
  136.   dc.l      $00000E09
  137.   dc.l      $00000DB0
  138.   dc.l      $00002686
  139.   dc.l      $00002746
  140.   dc.l      $00000DDC
  141.   dc.l      $00000E44 
  142.  
  143.   dc.b      $01,$02
  144.   dc.l      $00002740
  145.   dc.l      $00000E4F
  146.   dc.l      $00000C76
  147.   dc.l      $000026E6
  148.   dc.l      $000027A8
  149.   dc.l      $00000E22
  150.   dc.l      $00000E8A
  151.  
  152.   dc.b      $01,$04
  153.   dc.l      $00002882
  154.   dc.l      $00000E6B
  155.   dc.l      $00000C92
  156.   dc.l      $00002828
  157.   dc.l      $000028EA
  158.   dc.l      $00000E3E
  159.   dc.l      $00000EA6
  160.  
  161.   dc.b      $01,$06
  162.   dc.l      $000028C2
  163.   dc.l      $00000EAB
  164.   dc.l      $00000CD2
  165.   dc.l      $00002868
  166.   dc.l      $0000292A
  167.   dc.l      $00000E7E
  168.   dc.l      $00000EE6
  169.  
  170.   dc.b      $01,$62
  171.   dc.l      $000028C2
  172.   dc.l      $00000EAB
  173.   dc.l      $00000CD2
  174.   dc.l      $00002868
  175.   dc.l      $0000292A
  176.   dc.l      $00000E7E
  177.   dc.l      $00000EE6
  178.  
  179.   dc.b      $02,$05
  180.   dc.l      $00002476
  181.   dc.l      $00000EAB
  182.   dc.l      $00000CCE
  183.   dc.l      $0000241C
  184.   dc.l      $000024DE
  185.   dc.l      $00000E7E
  186.   dc.l      $00000EE6
  187.  
  188.   dc.b      $02,$06
  189.   dc.l      $000026AA
  190.   dc.l      $000010B7
  191.   dc.l      $00000ED8
  192.   dc.l      $00002650
  193.   dc.l      $00002712
  194.   dc.l      $00001088
  195.   dc.l      $000010F2
  196.  
  197.   dc.b      $03,$01       NOT confirmed correct.
  198.   dc.l      $00003596
  199.   dc.l      $00000F0F
  200.   dc.l      $00000D32
  201.   dc.l      $0000353C
  202.   dc.l      $000035FE
  203.   dc.l      $00000EE2
  204.   dc.l      $00000F4A 
  205.  
  206.   dc.b      $03,$05       NOT correct (probably).
  207.   dc.l      $000037C0
  208.   dc.l      $000010A7
  209.   dc.l      $00000ECA
  210.   dc.l      $00003766
  211.   dc.l      $00003828
  212.   dc.l      $0000107A
  213.   dc.l      $000010E2 
  214.  
  215.   dc.b      $03,$06       NOT confirmed correct.
  216.   dc.l      $000037C0
  217.   dc.l      $000010A7
  218.   dc.l      $00000ECA
  219.   dc.l      $00003766
  220.   dc.l      $00003828
  221.   dc.l      $0000107A
  222.   dc.l      $000010E2     + 2? (MJH says yes, but writes no)
  223.  
  224.   dc.b      $04,$01
  225.   dc.l      $00003C2C
  226.   dc.l      $00001175
  227.   dc.l      $00000F96
  228.   dc.l      $00003BD2
  229.   dc.l      $00003C94
  230.   dc.l      $00001146
  231.   dc.l      $000011BC
  232.  
  233.   dc.b      $04,$02
  234.   dc.l      $00003C2C
  235.   dc.l      $00001175
  236.   dc.l      $00000F96
  237.   dc.l      $00003BD2
  238.   dc.l      $00003C94
  239.   dc.l      $00001146
  240.   dc.l      $000011BC
  241.  
  242.   dc.b      $04,$04
  243.   dc.l      $00003C2C
  244.   dc.l      $00001175
  245.   dc.l      $00000F96
  246.   dc.l      $00003BD2
  247.   dc.l      $00003C94
  248.   dc.l      $00001146
  249.   dc.l      $000011BC
  250.  
  251.   dc.b      $04,$92
  252.   dc.l      $000040E0
  253.   dc.l      $00001175
  254.   dc.l      $00000F96
  255.   dc.l      $00004086
  256.   dc.l      $00004148
  257.   dc.l      $00001146
  258.   dc.l      $000011BC
  259.  
  260. L0002:        * lookup table (includes extension COLDSTART addresses)
  261.   ds.w      104   * 104
  262.  
  263. * GEMDOS _DTA structure (written to by fsfirst etc)
  264. FILEINFO:   ds.w      13  
  265. filelength  ds.l      1   
  266. filename:   ds.b      20  
  267.  
  268. freemem:    ds.l      1   
  269. oldlogic:   ds.l      1   
  270. oldphysic:  ds.l      1        * added by PJ
  271. supdump:    ds.l      1        * added by PJ
  272. shifter:    ds.l      1        * added by PJ
  273. bootrez:    dc.w      0 
  274. oldfalcmode dc.w      0
  275. filehandle  dc.w      0 
  276. osver       ds.w      1        * added by Anthony
  277. mchcook     dc.l      0
  278. L000A:      ds.l      1   
  279. paletteST:  ds.w      16
  280.  
  281. L000C:      ds.w      60  
  282. cls:        dc.b      27,'f',$00 
  283. STOSpath:   dc.b      '\STOS',$00    (appended onto current path)
  284. path:       ds.b      64
  285. newpath:    ds.b      64
  286.  
  287. * Some filenames
  288. Lowpic:     dc.b      'PIC.PI1',$00 
  289. Hipic:      dc.b      'PIC.PI3',$00 
  290. spritelib:  dc.b      'SPRIT???.BIN',$00 
  291. windowlib:  dc.b      'WINDO???.BIN',$00
  292. *windowlib:  dc.b      'TRAPS.PRG',$00
  293. floatlib:   dc.b      'FLOAT???.BIN',$00 
  294. musiclib:   dc.b      'MUSIC???.BIN',$00
  295. basiclib:   dc.b      'BASIC???.BIN',$00 
  296. extnfilter: dc.b      '*.EX'
  297. extnletter: dc.b      $00,$00 
  298.  
  299. * prompts at startup (Esc+Ynn sets position)
  300. * version number set to correct number on startup. (new: 3/1/97 AJ)
  301. lowprompt:  dc.b      27,'Y70','Tos '
  302. lowtosver:  dc.b      '1.62',$00
  303. hiprompt:   dc.b      27,'Y7D','Tos '
  304. hitosver:   dc.b      '1.62',$00 
  305.  
  306.  
  307. *****************************
  308.  
  309.     even
  310.  
  311. start:
  312.  
  313.     move.l    4(a7),a3    * find basepage
  314. *    lea.l    baspage(pc),a2
  315. *    move.l    a3,(a2)
  316. *    move.l    a3,300008
  317.     move.l    #100000,-(sp)    * how much to keep 
  318.     move.l    a3,-(sp)    * start of address to keep
  319.     move.w    #0,-(sp)
  320.     move.w    #$4A,-(sp)    * mskrink
  321.     trap    #1
  322.     add.l    #12,sp
  323.  
  324. *    cmp.w    #0,d0
  325. *    bne    quitprog
  326.  
  327. * Get everything for gemsys NOW!
  328. * superexec the code!
  329.  
  330.   clr.l     L000A 
  331.   movea.l   4(sp),a0
  332.   lea       128(a0),a0
  333.   tst.b     (a0)
  334.   beq.s     L001D 
  335.   addq.l    #1,a0 
  336.   move.l    a0,L000A
  337.  
  338. * the above checks for a command line (.BAS files are loaded).
  339.  
  340. L001D:
  341.   move.w    #3,-(sp)     ;LOGBASE
  342.   trap      #$E 
  343.   addq.l    #2,sp 
  344.   move.l    d0,oldlogic
  345.  
  346.   move.w    #2,-(sp)    ; PHYSBASE (added by Paul)
  347.   trap      #$E
  348.   addq.l    #2,sp
  349.   move.l    d0,oldphysic
  350.  
  351. *    movem.l    d0-d7/a0-a5,-(sp)
  352.  
  353.     pea    startit(pc)
  354.     move.w    #$26,-(sp)
  355.     trap    #14
  356.     add.l    #6,sp
  357.  
  358. *    bsr    startit
  359.  
  360.  
  361.   pea       inittabs(pc) ; this runs some code below (in supervisor mode)
  362.   move.w    #$26,-(sp)     ; sets up the first TOStable to be one to use
  363.   trap      #$E     ; also init's trap 6 with some odd code. (what is it?)
  364.   addq.l    #6,sp 
  365.  
  366. *    pea    gemosalert2(pc)
  367. *    move.w    #$13C,-(sp)
  368. *    trap    #1
  369. *    addq.l    #6,sp
  370.  
  371.  
  372.  
  373. *    jmp    inittabs(pc)
  374.  
  375.   move.l    mchcook(pc),d0
  376.   cmpi.l    #$30000,d0       $30000=Falcon, $20000=TT, $10000=STe, $10010=Mste $10008=STBook, 0=STfm
  377.   blt.s     notfalcinit
  378.  
  379.   move.w    #-1,-(sp)            * get current screen res
  380.   move.w    #88,-(sp)
  381.   trap      #14
  382.   addq.l    #4,sp
  383.   lea       oldfalcmode(pc),a0
  384.   move.w    d0,(a0)
  385.  
  386. *    pea    gemosalert2(pc)
  387. *    move.w    #$13C,-(sp)
  388. *    trap    #1
  389. *    addq.l    #6,sp
  390.  
  391.  
  392.   move.w    bootrez(pc),-(sp)        * go into STOS's bootres
  393.   move.l    #-1,-(sp)
  394.   move.l    #-1,-(sp)
  395.   move.w    #5,-(sp)
  396.   trap      #14
  397.   lea       12(sp),sp
  398.  
  399. *    pea    gemosalert2(pc)
  400. *    move.w    #$13C,-(sp)
  401. *    trap    #1
  402. *    addq.l    #6,sp
  403.  
  404.     move.l    #200,-(sp)
  405.     move.w    #$48,-(sp)
  406.     trap    #1
  407.     addq.l    #6,sp
  408.     move.l    d0,a6
  409.     lea    gembuffer(pc),a0
  410.     move.l    a6,(a0)
  411.  
  412.  
  413. notfalcinit:
  414.   lea       TOStables(pc),a5
  415.   movea.l   12(a5),a0 
  416.   moveq     #44,d0 
  417.  
  418. *    pea    gemosalert2(pc)
  419. *    move.w    #$13C,-(sp)
  420. *    trap    #1
  421. *    addq.l    #6,sp
  422.  
  423. ** somewhere
  424. ** this is trying to copy the tables to address 0
  425. ** which give a bus error (stack pointer, program counter etc)
  426. ** overwritten! a6=0
  427.  
  428. *    move.l    #1474160,a6
  429. *    lea.l    baspage(pc),a6
  430. *    move.l    (a6),a5
  431. *    add.l    #1112,a5
  432. *    move.l    a5,a6
  433.  
  434. *    move.l    mintcook(pc),a0
  435. *    move.l    a0,d0
  436.  
  437. *    move.l    a6,d0
  438. *    tst.l    d0
  439. *    beq    my2
  440.  
  441. *    cmp.l    #0,a6
  442. *    beq    my4
  443.  
  444. *    lea    freemem(pc),a2
  445. *    move.l    (a2),a6
  446.  
  447. L001E:
  448.   move.w    (a0)+,(a6)+ 
  449.   dbf       d0,L001E
  450.  
  451. * copies 44 bytes from tostables+12 to a6 (which is??)
  452.  
  453. * here
  454.  
  455. *    pea    gemosalert2(pc)
  456. *    move.w    #$13C,-(sp)
  457. *    trap    #1
  458. *    addq.l    #6,sp
  459.  
  460.   movea.l   16(a5),a0 
  461.   moveq     #11,d0
  462. L001F:
  463.   move.w    (a0)+,(a6)+ 
  464.   dbf       d0,L001F
  465.  
  466. * copies 11 bytes from tostables+16 (a0) to a6
  467.  
  468. *    pea    gemosalert2(pc)
  469. *    move.w    #$13C,-(sp)
  470. *    trap    #1
  471. *    addq.l    #6,sp
  472.  
  473.   movea.l   0(a5),a0
  474.   move.l    (a0),(a6)+
  475. *  move.l    #THEEND,freemem
  476.  
  477. * copies the TOS version (?), tostable to a6
  478.  
  479. * Create new freemem address
  480.  
  481.     move.l    #240000,-(sp)
  482.     move.w    #$48,-(sp)
  483.     trap    #1
  484.     addq.l    #6,sp
  485.     lea.l    freemem(pc),a5
  486.     move.l    d0,(a5)
  487.     lea.l    freemem2(pc),a5
  488.     move.l    d0,(a5)
  489.  
  490.  
  491. *    pea    gemosalert2(pc)
  492. *    move.w    #$13C,-(sp)
  493. *    trap    #1
  494. *    addq.l    #6,sp
  495.  
  496. my2
  497.  
  498.     lea    gembuffer(pc),a0
  499.     move.l    a6,100(a0)
  500.  
  501.  
  502. *    pea    gemosalert2(pc)
  503. *    move.w    #$13C,-(sp)
  504. *    trap    #1
  505. *    addq.l    #6,sp
  506.  
  507.   bsr       setfileinfo 
  508.   clr.w     -(sp)
  509.   pea       path(pc) 
  510.   move.w    #$47,-(sp)     ;DGETPATH 
  511.   trap      #1
  512.   addq.l    #8,sp 
  513.   tst.w     d0
  514.   bne       quitcleanly 
  515.  
  516. **** 9
  517. *    pea    gemosalert2(pc)
  518. *    move.w    #$13C,-(sp)
  519. *    trap    #1
  520. *    addq.l    #6,sp
  521.  
  522.  
  523.   lea       path(pc),a0
  524.   lea       newpath(pc),a1
  525. L0020:
  526.   move.b    (a0)+,(a1)+ 
  527.   bne.s     L0020 
  528.  
  529.   lea       path(pc),a0
  530.   tst.b     (a0)
  531.   bne.s     endslash 
  532.   move.b    #'\',(a0)+
  533.   clr.b     (a0)
  534. endslash:
  535.   subq.l    #1,a1 
  536.   lea       STOSpath(pc),a0
  537. copypath:
  538.   move.b    (a0)+,(a1)+ 
  539.   bne.s     copypath 
  540.   lea       newpath(pc),a0
  541.   bsr       setpath 
  542.   bne       closeandquit 
  543.   clr.w     -(sp)     * flags there is no pic (changed if found)
  544.   cmpi.w    #2,bootrez
  545.   beq.s     usehipic 
  546.   lea       Lowpic(pc),a0
  547.   bra.s     uselowpic 
  548. usehipic:
  549.   lea       Hipic(pc),a0
  550. uselowpic:
  551.  
  552. *** 10
  553. *    pea    gemosalert2(pc)
  554. *    move.w    #$13C,-(sp)
  555. *    trap    #1
  556. *    addq.l    #6,sp
  557.  
  558.  
  559.   bsr       fileexists 
  560.  
  561. ** 11
  562. *    pea    gemosalert2(pc)
  563. *    move.w    #$13C,-(sp)
  564. *    trap    #1
  565. *    addq.l    #6,sp
  566.  
  567.     cmp.l    #0,a6
  568.     beq    my3
  569.     
  570.     move.l    #-1,-(sp)
  571.     move.w    #$48,-(sp)
  572.     trap    #1
  573.     addq.l    #6,sp
  574.  
  575. my3
  576.  
  577.   bne       nopic         * if doesn't exist, clear screen
  578.  
  579. ** 12 (yeah!)
  580. *    pea    gemosalert2(pc)
  581. *    move.w    #$13C,-(sp)
  582. *    trap    #1
  583. *    addq.l    #6,sp
  584.  
  585. *  bsr       openfile         * load file to logic - $8000
  586. *  movea.l   oldlogic(pc),a0
  587. *  suba.l    #$8000,a0 
  588. *  move.l    #32034,d0 
  589. *  bsr       readbytes 
  590. *  bsr       closefile 
  591. *  move.w    #-1,(sp)        * flags there is a picture
  592. *  move.w    #-1,(sp)
  593.  
  594. *  dc.b      $a0,$0A     * line A (dunno what though?) look up.
  595.  
  596. * Hides mouse!!! See SALAD document
  597.  
  598. *    pea    gemosalert2(pc)
  599. *    move.w    #$13C,-(sp)
  600. *    trap    #1
  601. *    addq.l    #6,sp
  602.  
  603. *  lea       bootrez(pc),a0
  604. *  tst.w     (a0)
  605. *  beq       in_stlow 
  606. *  cmpi.w    #2,bootrez
  607. *  beq       in_stlow 
  608. *  clr.w     -(sp)    switch to ST Low
  609. *  move.l    #-1,-(sp) 
  610. *  move.l    #-1,-(sp) 
  611. *  move.w    #5,-(sp)     ;SETSCREEN
  612. *  trap      #$E 
  613. *  lea       12(sp),sp
  614. in_stlow:
  615.  
  616.   lea       cls(pc),a0
  617.   bsr       print 
  618.  
  619. *  move.l    oldlogic(pc),-(sp) 
  620. *  subi.l    #$7FFE,(sp) 
  621. *  move.w    #6,-(sp)     ;SETPALLETE 
  622. *  trap      #$E 
  623. *  addq.l    #6,sp 
  624. *  moveq     #1,d6 
  625.  
  626. *    pea    gemosalert2(pc)
  627. *    move.w    #$13C,-(sp)
  628. *    trap    #1
  629. *    addq.l    #6,sp
  630.  
  631. * screen stretch routine. (you know the one...)
  632. *L0026:
  633. *  movea.l   oldlogic(pc),a2
  634. *  movea.l   a2,a3 
  635. *  adda.l    #$3DE0,a2 
  636. *  adda.l    #$3E80,a3 
  637. *  movea.l   a2,a0 
  638. *  movea.l   a3,a1 
  639. *  suba.l    #$7FDE,a0 
  640. *  suba.l    #$7FDE,a1 
  641. *  moveq     #$63,d7 
  642. *  addq.w    #1,d6 
  643. *  cmp.w     #$64,d6 
  644. *  bhi       loadtraps         * jump out if done it more than $64 times
  645. *  moveq     #$32,d5 
  646. *L0027:
  647. *  ADD.w     d6,d5 
  648. *  cmp.w     #$64,d5 
  649. *  bcs.s     L0029 
  650. *  subi.w    #$64,d5 
  651. *  movem.l   a0-a3,-(sp) 
  652. *
  653. *  moveq     #9,d0 
  654. *L0028:
  655. *  move.l    (a0)+,(a2)+ 
  656. *  move.l    (a0)+,(a2)+ 
  657. *  move.l    (a0)+,(a2)+ 
  658. *  move.l    (a0)+,(a2)+ 
  659. *  move.l    (a1)+,(a3)+ 
  660. *  move.l    (a1)+,(a3)+ 
  661. *  move.l    (a1)+,(a3)+ 
  662. *  move.l    (a1)+,(a3)+     * inner copy loop (1 line?)
  663. *  dbf       d0,L0028
  664. *
  665. *  movem.l   (sp)+,a0-a3 
  666. *  suba.l    #$a0,a2 
  667. *  adda.l    #$a0,a3 
  668. *L0029:
  669. *  suba.l    #$a0,a0 
  670. *  adda.l    #$a0,a1 
  671. *  dbf       d7,L0027        * outer loop (1 screen?)
  672. *  bra       L0026
  673.  
  674. nopic:
  675.   dc.b      $a0,$0A 
  676.   lea       cls(pc),a0
  677.   bsr       print 
  678. my4
  679. * run all the .BIN files (which install themselves in the traps)
  680. loadtraps:
  681.   lea       spritelib(pc),a0
  682.   bsr       loadfile 
  683.   lea       TOStables(pc),a3
  684.   jsr       (a0)
  685.   move.l    a0,freemem
  686.  
  687.   lea       windowlib(pc),a0
  688.   bsr       loadfile 
  689.   lea       TOStables(pc),a3
  690.   jsr       (a0)
  691.   move.l    a0,freemem
  692.  
  693.   lea       floatlib(pc),a0
  694.   bsr       loadfileignore
  695.   bne.s     loadmusic 
  696.   lea       TOStables(pc),a3
  697.   jsr       (a0)
  698. *    move.l    a0,freemem
  699.  
  700. loadmusic:
  701.   lea       musiclib(pc),a0
  702.   bsr       loadfile 
  703.   lea       TOStables(pc),a3
  704.   jsr       (a0)
  705.   move.l    a0,freemem
  706.  
  707.  
  708. * loop round, loading any .EX[A-Z] files 
  709.   clr.w     d7
  710.   lea       L0002(pc),a6
  711. loadextns:
  712.   move.b    d7,extnletter
  713.   addi.b    #'A',extnletter
  714.   lea       extnfilter(pc),a0
  715.   bsr       fileexists 
  716.   bne.s     nextextn 
  717.  
  718.   lea       extnfilter(pc),a0
  719.   bsr       loadfile 
  720.  
  721.   movem.l   a6/d6-d7,-(sp)
  722.  
  723.       lea.l    gembuffer(pc),a6
  724.   lea       TOStables(pc),a3
  725.   jsr       (a0)        * call extension INIT routine
  726.   move.l    a0,freemem
  727.  
  728.   movem.l   (sp)+,a6/d6-d7
  729.   move.w    d7,d6 
  730.   lsl.w     #2,d6         * multiply [0-25] by 4 (offset into table)
  731.   move.l    a1,0(a6,d6.w)     * store extension COLDBOOT routines in table
  732. nextextn:
  733.   addq.w    #1,d7 
  734.   cmp.w     #26,d7 
  735.   bcs.s     loadextns 
  736.  
  737.   tst.w     (sp)+         * flag set above (pic file exists)
  738.   beq.s     nopicfile 
  739.  
  740.   move.w    osver(pc),d0
  741.   moveq.w   #0,d1         * set the prompt to show your TOS version
  742.   move.w    d0,d1         * Added by Anthony Jacques
  743.   lsr.w     #8,d1
  744.   addi.b    #'0',d1
  745.   lea       lowtosver(pc),a0
  746.   move.b    d1,(a0)
  747.   lea       hitosver(pc),a0
  748.   move.b    d1,(a0)
  749.   move.b    d0,d1
  750.   and.b     #$F0,d1
  751.   lsr.b     #4,d1
  752.   addi.b    #'0',d1
  753.   lea       lowtosver(pc),a0
  754.   move.b    d1,2(a0)
  755.   lea       hitosver(pc),a0
  756.   move.b    d1,2(a0)
  757.   move.b    d0,d1
  758.   and.b     #$F,d1
  759.   addi.b    #'0',d1
  760.   lea       lowtosver(pc),a0
  761.   move.b    d1,3(a0) 
  762.   lea       hitosver(pc),a0
  763.   move.b    d1,3(a0)
  764.  
  765.   lea       lowprompt(pc),a0
  766.   cmpi.w    #2,bootrez
  767.   bne.s     lowtostext 
  768.   lea       hiprompt(pc),a0
  769. lowtostext:
  770.  
  771.   bsr       print 
  772. nopicfile:
  773.  
  774. * load the editor
  775.   lea       basiclib(pc),a0
  776.   bsr       loadfile 
  777.   move.l    a0,-(sp)
  778.  
  779. * set path to initial path (ie. not in STOS\)
  780.   lea       path(pc),a0
  781.   bsr       setpath 
  782.   movea.l   (sp)+,a6
  783.  
  784. * wait for a Vsync before going
  785.   move.w    #$25,-(sp)     ;VSYNC
  786.   trap      #$E 
  787.   addq.l    #2,sp 
  788.  
  789. * clear the screen (fill with colour 0)
  790.   movea.l   oldlogic(pc),a0
  791.   move.w    #7999,d0     (8000*4=32000)
  792. clslp:
  793.   clr.l     (a0)+ 
  794.   dbf       d0,clslp
  795.  
  796.   lea       bootrez(pc),a0
  797.   cmpi.w    #2,(a0)
  798.   beq.s     hieditor 
  799.  
  800. * jump to medium
  801.   move.w    #1,-(sp)
  802.   move.l    #-1,-(sp) 
  803.   move.l    #-1,-(sp) 
  804.   move.w    #5,-(sp)     ;SETSCREEN
  805.   trap      #$E 
  806.   lea       12(sp),sp
  807.  
  808. * run the editor itself
  809. hieditor:
  810.   lea       L0002(pc),a0
  811.   lea       TOStables(pc),a3
  812.   movea.l   L000A(pc),a4
  813.   clr.l     d0
  814.  
  815.   jsr       (a6)
  816.  
  817. * interpeter finished - lets quit.
  818.   bra       quitcleanly 
  819.  
  820. closeandquit:
  821.   bsr       closefile 
  822.   lea       path(pc),a0
  823.   bsr       setpath 
  824.  
  825. quitcleanly:
  826. * restore screen, and screen-mode
  827. * Supermode, oldphysic, sshiftmd and usermode by Paul Jones
  828.  
  829.   move.l    mchcook(pc),d0
  830.   cmp.l     #$30000,d0
  831.   blt.s     notfalcquit
  832.  
  833.   clr.l     -(sp)
  834.   move.w    #$20,-(sp)
  835.   trap      #1            * supervisor mode (for setting res and setting sshiftmd)
  836.   addq.l    #6,sp
  837.   lea.l     mystack(pc),a0
  838.   move.l    d0,(a0)
  839.  
  840.   move.w    oldfalcmode(pc),-(sp) 
  841.   move.w    #3,-(sp)            3=extended mode
  842.   move.l    oldphysic(pc),-(sp)
  843.   move.l    oldlogic(pc),-(sp)
  844.   move.w    #5,-(sp)    VSETSCREEN
  845.   trap      #14
  846.   adda.l    #14,sp
  847.  
  848.   lea.l     shifter(pc),a0
  849.   move.w    (a0),$44c            * reset old shifter status
  850.  
  851.   lea.l     mystack(pc),a0
  852.   move.l    (a0),-(sp)
  853.  
  854.   move.w    #$20,-(sp)
  855.   trap      #1            * back to user mode
  856.   addq.l    #6,sp
  857.  
  858.   bra.s     inoldmode
  859.  
  860. notfalcquit:
  861.  
  862.   clr.l     -(sp)
  863.   move.w    #$20,-(sp)
  864.   trap      #1            * supervisor mode (for setting res and setting sshiftmd)
  865.   addq.l    #6,sp
  866.   lea.l     mystack(pc),a0
  867.   move.l    d0,(a0)
  868.  
  869.   move.w    bootrez(pc),-(sp) 
  870.   move.l    oldlogic(pc),-(sp) 
  871.   move.l    oldlogic(pc),-(sp) 
  872.   move.w    #5,-(sp)     ;SETSCREEN
  873.   trap      #14 
  874.   lea       12(sp),sp
  875.  
  876.   lea.l     shifter(pc),a0
  877.   move.w    (a0),$44c    * reset old shifter status
  878.  
  879.   lea.l     mystack(pc),a0
  880.   move.l    (a0),-(sp)
  881. *  clr.l     -(sp)
  882.   move.w    #$20,-(sp)
  883.   trap      #1            * back to user mode
  884.   addq.l    #6,sp
  885.  
  886.  
  887.  
  888. inoldmode:
  889. * do something to TOStables (copy from backup?)
  890.   lea       L000C(pc),a6
  891.   lea       TOStables(pc),a5
  892.   movea.l   12(a5),a0 
  893.   moveq     #$2C,d0 
  894. L0035:
  895.   move.w    (a6)+,(a0)+ 
  896.   dbf       d0,L0035
  897.   movea.l   16(a5),a0 
  898.   moveq     #$B,d0
  899. L0036:
  900.   move.w    (a6)+,(a0)+ 
  901.   dbf       d0,L0036
  902.   movea.l   0(a5),a0
  903.   move.l    (a6)+,(a5)
  904.  
  905. * restore ST palette
  906.   pea.l     paletteST(pc) 
  907.   move.w    #6,-(sp)     ;SETPALLETE 
  908.   trap      #14 
  909.   addq.l    #6,sp 
  910.  
  911. * restore TT palette
  912.  
  913. *    lea    $FF8400.l,a0    * TT palette
  914. *    lea    paletteTT(pc),a1
  915. *    move.w    #254,d0
  916. *copyttpalb:
  917. *    move.w    (a1)+,(a0)+        * r
  918. *    move.w    (a1)+,(a0)+        * g
  919. *    move.w    (a1)+,(a0)+        * b
  920. *    dbf    d0,copyttpalb
  921.  
  922. *    lea    $FF9800.l,a0    * Falcon030 "VIDEL" palette
  923. *    lea    paletteFlc(pc),a1
  924. *    move.w    #254,d0
  925. *copyfalcpalb:
  926. *    move.w    (a1)+,(a0)+        * r
  927. *    move.w    (a1)+,(a0)+        * g
  928. *    move.w    (a1)+,(a0)+        * b
  929. *    dbf    d0,copyfalcpalb
  930.  
  931.  
  932. *    lea    palette(pc),a0
  933. *    move    #255,d0
  934. *    move    #0,d1
  935. *copymypal:
  936.  
  937. *    move.w    #14,contrl
  938. *    move.w  #0,contrl1
  939. *    move.w    #0,contrl2
  940. *    move.w    #4,contrl3
  941. *    move.w    #0,contrl4
  942. *    move.w  #0,contrl5
  943. *    move.w    #1,contrl6
  944.  
  945. *    move.w    d1,intin
  946. *    move.w    (a0)+,intin+2
  947. *    move.w    (a0)+,intin+4
  948. *    move.w    (a0)+,intin+6
  949.  
  950. *    bsr    call_vdi
  951.  
  952.  *    add    #1,d1
  953. *    cmp    d0,d1
  954. *    bne    copymypal
  955.  
  956. * Copied system colours
  957.  
  958.   move.w    #$25,-(sp)     ;VSYNC
  959.   trap      #14 
  960.   addq.l    #2,sp 
  961.  
  962. * de-alocate work space
  963.  
  964.     lea.l    freemem2(pc),a0
  965.     move.l    (a0),-(sp)
  966.     move.w    #$49,-(sp)
  967.     trap    #1
  968.     addq.l    #6,sp
  969.  
  970. * and quit...
  971.  
  972. *  clr.w     -(sp)     ;PTERM0
  973. quitprog
  974.     move.w    #0,-(sp)
  975.     move.w    #$4c,-(sp)    * PTERM (quit)
  976.     trap    #1
  977.  
  978. ****** 
  979. * (ran in supervisor mode)
  980.  
  981. inittabs:
  982.  
  983.     lea.l    shifter(pc),a0
  984.     move.w    $44c,(a0)
  985.  
  986.     lea    $FF8240.l,a0    * ST palette
  987.     lea    paletteST(pc),a1
  988.     moveq    #$F,d0
  989. copypal:
  990.     move.w    (a0)+,(a1)+
  991.     dbf    d0,copypal
  992.  
  993. *    move.l    $ff8400,a0
  994. *    lea.l    paletteTT(pc),a1
  995. *    move.w    #254,d0
  996. *copyttpal:
  997. *    move.w    (a0)+,(a1)+    * r
  998. *    move.w    (a0)+,(a1)+    * g
  999. *    move.w    (a0)+,(a1)+    * b
  1000. *    dbf    d0,copyttpal
  1001.  
  1002. *    move.l    $FF9800,a0    * Falcon030 "VIDEL" palette
  1003. *    lea.l    paletteFlc(pc),a1
  1004. *    move.w    #254,d0
  1005. *copyfalcpal:
  1006. *    move.w    (a0)+,(a1)+    * r
  1007. *    move.w    (a0)+,(a1)+    * g
  1008. *    move.w    (a0)+,(a1)+    * b
  1009. *    dbf    d0,copyfalcpal
  1010.  
  1011. *     movem.l    (sp)+,d0-d7/a0-a5
  1012.  
  1013. ****
  1014. * get _MCH cookie
  1015.   move.l    $5a0,d0
  1016.   tst.l     d0
  1017.   beq.s     .nocook       No cookie jar = plain ST.
  1018.   move.l    d0,a0
  1019.   move.l    #'_MCH',d0
  1020.  
  1021. .nextcook
  1022.   tst       (a0)
  1023.   beq.s     .nocook       No _MCH cookie = plain ST.
  1024.   move.l    (a0)+,d1
  1025.   cmp.l     d0,d1
  1026.   beq.s     .fndcook
  1027.   addq.l    #4,a0
  1028.   bra.s     .nextcook
  1029.  
  1030. .fndcook
  1031.   lea       mchcook(pc),a6
  1032.   move.l    (a0),d0
  1033.   move.l    d0,(a6)
  1034. .nocook
  1035.  
  1036. ********** Get OS version VERY dirty method ************
  1037. * install own bus error handler.
  1038. * read from 192k ROM space. If causes a bus error, read from 512k ROM space.
  1039. * re-install old bus-error handler
  1040. *
  1041. * code replaced with a clean version.
  1042. * (get ROM space address from _sysbase and look 2 above)
  1043.  
  1044.   move.l    $4f2,a0
  1045.   move.w    2(a0),d0
  1046.   lea       osver(pc),a0
  1047.   move.w    d0,(a0)
  1048.  
  1049. ****
  1050. *
  1051. * Now set up look-up-tables. Look up in known TOS versions.
  1052. * If not found, use default.
  1053. * whatever, patch some of the addresses to known values.
  1054. * (will eventually replace tables completely when all addresses known)
  1055.  
  1056.   lea       defaultTOS(pc),a0
  1057.   move      #NUM_OSVERS,d1
  1058. findtablp:
  1059.   cmp.w     (a0)+,d0        * search for OS ver, else skip 28 more bytes
  1060.   beq.s     foundtab 
  1061.   adda.w    #28,a0 
  1062.   dbf       d1,findtablp
  1063.   lea       TOStables(pc),a0    * if failed, restore default table
  1064.  
  1065. foundtab:
  1066.  
  1067. * set TOS table to correct values.
  1068.  
  1069.   movea.l   a0,a6
  1070.   dc.b      $a0,$00        * line-a init
  1071.  
  1072.   move.l    a0,d0          GCURX
  1073.   subi.l    #$25a,d0
  1074.   move.l    d0,(a6)
  1075.  
  1076.   move.l    a0,d0        DEV_TAB
  1077.   subi.l    #$2b4,d0
  1078.   move.l    d0,12(a6) 
  1079.  
  1080.   move.l    a0,d0         SIZ_TAB
  1081.   subi.l    #$1f2,d0
  1082.   move.l    d0,16(a6) 
  1083.  
  1084.   move.w    #1,-(sp)
  1085.   move.w    #14,-(sp)     ;IOREC 
  1086.   trap      #14
  1087.   addq.l    #4,sp
  1088.   move.l    d0,8(a6)
  1089.   movea.l   a6,a0
  1090.  
  1091.   lea       TOStables(pc),a2
  1092.   moveq     #6,d0 
  1093. copytab:
  1094.   move.l    (a0)+,(a2)+     * copy 24 bytes to first table
  1095.   dbf       d0,copytab
  1096.  
  1097.   move.l    #trap6hand,d0     * install trap 6 handler
  1098.   move.l    d0,$98.l
  1099.   rts 
  1100.  
  1101. * trap 6 handler
  1102. trap6hand:
  1103.   cmp.b     #$C,d0
  1104.   beq.s     L003F 
  1105.   moveq     #0,d0 
  1106.   moveq     #0,d1 
  1107.   rte 
  1108.  
  1109. * trap 6, when d0 = $c
  1110. L003F:
  1111.   move.b    #$30,(a0) 
  1112.   move.b    #$2E,1(a0)
  1113.   move.b    #$30,2(a0)
  1114.   clr.b     3(a0) 
  1115.   rte 
  1116.  
  1117. * sets the OS _DTA structure to space alocated above
  1118. setfileinfo:
  1119.   move.l    a0,-(sp)
  1120.   pea       FILEINFO(pc) 
  1121.   move.w    #$1A,-(sp)     ;DSETDTA
  1122.   trap      #1
  1123.   addq.l    #6,sp 
  1124.   movea.l   (sp)+,a0
  1125.   rts 
  1126.  
  1127. * sets the path to that given in a0
  1128. setpath:
  1129.   move.l    a0,-(sp)
  1130.   move.w    #$3B,-(sp)     ;DSETPATH 
  1131.   trap      #1
  1132.   addq.l    #6,sp 
  1133.   tst.w     d0
  1134.   rts 
  1135.  
  1136. * sets the condition codes depending on whether the given file exists
  1137. fileexists:
  1138.   clr.w     -(sp) 
  1139.   move.l    a0,-(sp)
  1140.   move.w    #$4E,-(sp)     ;FSFIRST
  1141.   trap      #1
  1142.   addq.l    #8,sp 
  1143.   lea       filename(pc),a0
  1144.   tst.w     d0
  1145.   rts 
  1146.  
  1147. * opens a file, putting the handle in 'filehandle'
  1148. openfile:
  1149.   clr.w     -(sp) 
  1150.   move.l    a0,-(sp)
  1151.   move.w    #$3D,-(sp)     ;FOPEN
  1152.   trap      #1
  1153.   addq.l    #8,sp 
  1154.   tst.w     d0
  1155.   bmi       closeandquit 
  1156.   move.w    d0,filehandle
  1157.   rts 
  1158.  
  1159. * reads the complete contents of the open file (assumes it was the last file searched for)
  1160. readfile:
  1161.   move.l    filelength,d0
  1162.  
  1163. * reads d0 bytes from the current file
  1164. readbytes:
  1165.   move.l    a0,-(sp)
  1166.   move.l    d0,-(sp)
  1167.   move.w    filehandle(pc),-(sp) 
  1168.   move.w    #$3F,-(sp)     ;FREAD
  1169.   trap      #1
  1170.   lea       12(sp),sp
  1171.   tst.l     d0
  1172.   bmi       closeandquit 
  1173.   rts 
  1174.  
  1175. * closes the currently open file
  1176. closefile:
  1177.   move.w    filehandle(pc),-(sp) 
  1178.   move.w    #$3E,-(sp)     ;FCLOSE 
  1179.   trap      #1
  1180.   addq.l    #4,sp 
  1181.   rts 
  1182.  
  1183. * prints some text to the screen
  1184. print:
  1185.   move.l    a0,-(sp)
  1186.   move.w    #9,-(sp)     ;CCONWS 
  1187.   trap      #1
  1188.   addq.l    #6,sp 
  1189.   rts 
  1190.  
  1191. * load file (returning mem addr in a0)
  1192. loadfile:
  1193.   bsr       loadfileignore 
  1194.   bne       closeandquit 
  1195.   rts 
  1196.  
  1197. * loads file ignoring error (returns -ive error but doesn't quit)
  1198. loadfileignore:
  1199.   movem.l   a1-a3/d1-d3,-(sp) 
  1200.   bsr       setfileinfo 
  1201.   bsr       fileexists 
  1202.   bne       returnerror 
  1203.   move.l    freemem(pc),d3
  1204.   add.l     filelength(pc),d3
  1205.   addi.l    #60000,d3 
  1206.   cmp.l     oldlogic(pc),d3
  1207.   bcc       closeandquit 
  1208.   bsr       openfile 
  1209.   movea.l   freemem(pc),a0
  1210.   bsr       readfile 
  1211.   bsr       closefile 
  1212.   movea.l   freemem(pc),a1
  1213.   move.l    2(a1),d0
  1214.   add.l     6(a1),d0
  1215.   andi.l    #$FFFFFF,d0 
  1216.   adda.w    #$1C,a1 
  1217.   movea.l   a1,a2 
  1218.   move.l    a2,d2 
  1219.   adda.l    d0,a1 
  1220.   clr.l     d0
  1221.   tst.l     (a1)
  1222.   beq.s     L004D 
  1223.   adda.l    (a1)+,a2
  1224.   bra.s     L004B 
  1225. L004A:
  1226.   move.b    (a1)+,d0
  1227.   beq.s     L004D 
  1228.   cmp.b     #1,d0 
  1229.   beq.s     L004C 
  1230.   adda.w    d0,a2 
  1231. L004B:
  1232.   add.l     d2,(a2) 
  1233.   bra.s     L004A 
  1234. L004C:
  1235.   adda.w    #$FE,a2 
  1236.   bra.s     L004A 
  1237. L004D:
  1238.   movea.l   freemem(pc),a0
  1239.   move.l    a0,d0 
  1240.   add.l     filelength(pc),d0
  1241.   btst      #0,d0 
  1242.   beq.s     L004E 
  1243.   addq.l    #1,d0 
  1244. L004E:
  1245.   move.l    d0,freemem
  1246.   movem.l   (sp)+,a1-a3/d1-d3 
  1247.   moveq     #0,d0 
  1248.   rts 
  1249. returnerror:
  1250.   movem.l   (sp)+,a1-a3/d1-d3 
  1251.   moveq     #1,d0 
  1252.   rts 
  1253.  
  1254. startit:
  1255.  
  1256.     movem.l    a0-a6/d0-d6,-(sp)    * save registers
  1257.  
  1258.     lea.l    gembuffer(pc),a0
  1259.  
  1260.     move.l    a0,-(sp)
  1261.  
  1262. ****
  1263. * get _VDO cookie
  1264.     move.l    $5a0,d0
  1265.     tst.l     d0
  1266.     beq.s     .nocook       No cookie jar = plain ST.
  1267.     move.l    d0,a0
  1268.     move.l    #'_VDO',d0
  1269.  
  1270. .nextcook
  1271.     tst       (a0)
  1272.     beq.s     .nocook       No _VDO cookie = plain ST.
  1273.     move.l    (a0)+,d1
  1274.     cmp.l     d0,d1
  1275.     beq.s     .fndcook
  1276.     addq.l    #4,a0
  1277.     bra.s     .nextcook
  1278.  
  1279. .fndcook
  1280.     lea       vdocook(pc),a6
  1281.     move.l    (a0),d0
  1282.     move.l    d0,(a6)
  1283. .nocook
  1284.  
  1285.     move.l    (sp)+,a0
  1286.  
  1287.     move.l    vdocook(pc),d0        * VDO type
  1288.     move.l    d0,56(a0)
  1289.  
  1290. *    move.l    #0,-(sp)
  1291. *    move.w    #$20,-(sp)
  1292. *    trap    #1
  1293. *    add.l    #6,sp
  1294.  
  1295.     lea.l    gemmaosver(pc),a1
  1296.     move.l    a1,(a0)            * OS version
  1297.     lea.l    gemmaosby(pc),a1
  1298.     move.l    a1,4(a0)        * by
  1299.  
  1300.     move.l    a0,-(sp)
  1301.     move.w    #$22,-(sp)
  1302.     trap    #14
  1303.     add.l    #2,sp
  1304.     move.l    (sp)+,a0
  1305.  
  1306.     move.l    d0,72(a0)
  1307.     add.l    #16,d0            * kbdvbase+16
  1308.     move.l    d0,a1
  1309.     move.l    (a1),8(a0)
  1310.  
  1311.     move.l    $456,a1
  1312.  
  1313.     move.l    (a1)+,12(a0)        * VBL1
  1314.     move.l    (a1)+,16(a0)        *    2
  1315.     move.l    (a1)+,20(a0)        *    3
  1316.     move.l    (a1)+,24(a0)        *    4
  1317.     move.l    (a1)+,28(a0)        *    5
  1318.     move.l    (a1)+,32(a0)        *    6
  1319.     move.l    (a1)+,36(a0)        *    7
  1320.  
  1321.     lea.l    vdocook(pc),a1
  1322.     move.l    (a1),d0
  1323.     cmp.l    #$30000,d0
  1324.     bne    next1
  1325.  
  1326.     move.l    a0,-(sp)
  1327.     move.w    #-1,-(sp)        * vsetmode -1
  1328.     move.w    #$58,-(sp)
  1329.     trap    #14
  1330.     add.l    #4,sp
  1331.     move.l    (sp)+,a0
  1332.  
  1333.     move.l    d0,40(a0)
  1334.  
  1335. next1    move.l    a0,-(sp)        * logbase
  1336.     move.w    #3,-(sp)
  1337.     trap    #14
  1338.     add.l    #2,sp
  1339.     move.l    (sp)+,a0
  1340.  
  1341.     move.l    d0,44(a0)
  1342.  
  1343.     move.l    a0,-(sp)
  1344.     move.w    #2,-(sp)        * physbase
  1345.     trap    #14
  1346.     add.l    #2,sp
  1347.     move.l    (sp)+,a0
  1348.  
  1349.     move.l    d0,48(a0)
  1350.  
  1351. *    move.l    #0,-(sp)
  1352. *    move.w    #$20,-(sp)
  1353. *    trap    #1
  1354. *    add.l    #6,sp
  1355.  
  1356.     move.w    ($44c),54(a0)        * (SHIFTMD)+2
  1357.  
  1358.     move.l    a0,-(sp)
  1359.  
  1360. ****
  1361. * get MiNT cookie (not part of the start up... but hey!) :-)
  1362.     move.l    $5a0,d0
  1363.     tst.l     d0
  1364.     beq.s     .nomintcook       No cookie jar = plain ST.
  1365.     move.l    d0,a0
  1366.     move.l    #'MiNT',d0
  1367.  
  1368. .nextmintcook
  1369.     tst       (a0)
  1370.     beq.s     .nomintcook       No _VDO cookie = plain ST.
  1371.     move.l    (a0)+,d1
  1372.     cmp.l     d0,d1
  1373.     beq.s     .fndmintcook
  1374.     addq.l    #4,a0
  1375.     bra.s     .nextmintcook
  1376.  
  1377. .fndmintcook
  1378.     lea       mintcook(pc),a6
  1379.     move.l    (a0),d0
  1380.     move.l    d0,(a6)
  1381. .nomintcook
  1382.  
  1383.     move.l    (sp)+,a0
  1384.  
  1385.     clr.l    d0
  1386.     move.l    a0,-(sp)
  1387.     move.w    #4,-(sp)
  1388.     trap    #14
  1389.     add.l    #2,sp
  1390.     move.l    (sp)+,a0
  1391.  
  1392.     move.l    d0,60(a0)        * GETREZ
  1393.  
  1394.     move.l    ($ff8260),64(a0)    * ST SHIFT
  1395.  
  1396.     lea    vdocook(pc),a1
  1397.     move.l    (a1),d0
  1398.     cmp.l    #$30000,d0
  1399.     bne    next2
  1400.  
  1401.     move.l    ($ff8266),68(a0)    * Falcon SPSHIFT
  1402.  
  1403. * store colours
  1404. next2
  1405.  
  1406.     move.l    ($ff8260),72(a0)
  1407.  
  1408.     lea.l    int_in(pc),a1
  1409.     move.w    #0,(a1)        * handle
  1410.     move.w    #4,2(a1)    * sort=workxywh
  1411. *    aes    104        * wind_get
  1412.     lea.l    int_out(pc),a1
  1413. *    move.l    (sp)+,a0
  1414. *    move.w    2(a1),82(a0)    * (xout)+2
  1415. *    move.w    4(a1),86(a0)    * (yout)+2
  1416. *    move.w    6(a1),90(a0)    * (wout)+2
  1417. *    move.w    8(a1),94(a0)    * (hout)+2
  1418.  
  1419. * Copy few exception vectors, STOS overwrites some of them.
  1420.  
  1421.     move.l    #$8,a2
  1422.     move.l    #100,d1
  1423.     move.l    a0,a3
  1424.     add.l    d1,a3
  1425.  
  1426. bit    move.l    (a2)+,a1
  1427.     move.l    a1,(a3)+
  1428.     cmp    #$28,a2
  1429.     bne    bit
  1430.  
  1431.     move.l    $400,(a3)+    * etv_timer
  1432.     move.l    $404,(a3)+    * etv_critic
  1433.     move.l    $40C,(a3)+    * etv_term
  1434.  
  1435.  
  1436.  
  1437.     movem.l    (sp)+,a0-a6/d0-d6    * restore registers
  1438.  
  1439. *    pea    gemosalert1(pc)
  1440. *    move.w    #$13C,-(sp)
  1441. *    trap    #1
  1442. *    addq.l    #6,sp
  1443.  
  1444.     rts
  1445.  
  1446. mystack        ds.l    1
  1447. freemem2    ds.l    1
  1448. vdocook        ds.l    1
  1449. gembuffer    ds.l    1000
  1450. gemmaosver    dc.b    "1.72",0
  1451. gemmaosby    dc.b    "Paul Jones and Anthony Jacques 1997",13,10,"(paulat.jones@zetnet.co.uk), (jacquesa@zetnet.co.uk)",0
  1452. gemosalert1    dc.b    "[1][ Set bits ][ OK ]",0
  1453. gemosalert2    dc.b    "[1][ Screen ][ OK ]",0
  1454. baspage        ds.l    1
  1455. colstore    ds.w    256
  1456. current_handle    ds.w    1
  1457. mintcook    ds.l    1
  1458.  
  1459. contrl        ds.w    1
  1460. contrl1        ds.w    1
  1461. contrl2        ds.w    1
  1462. contrl3        ds.w    1
  1463. contrl4        ds.w    1
  1464. contrl5        ds.w    1
  1465. contrl6        ds.w    1
  1466. contrl7        ds.w    1
  1467. contrl8        ds.w    1
  1468. contrl9        ds.w    1
  1469. contrl10    ds.w    1
  1470. contrl11    ds.w    1
  1471.  
  1472. intin        ds.w    128
  1473. intout        ds.w    128
  1474. ptsin        ds.w    128
  1475. ptsout        ds.w    128
  1476.  
  1477. global2        ds.w    14
  1478.  
  1479. vdi_params    dc.l    contrl,intin,ptsin,intout,ptsout
  1480.  
  1481. gem_ctrl_list
  1482.     dc.b    0,1,0    10    appl_init
  1483.     dc.b    2,1,1    11    appl_read
  1484.     dc.b    2,1,1    12    appl_write
  1485.     dc.b    0,1,1    13    appl_find
  1486.     dc.b    2,1,1    14    appl_tplay
  1487.     dc.b    1,1,1    15    appl_record
  1488.     dc.b    0,0,0    16*
  1489.     dc.b    0,0,0    17*
  1490.     dc.b    1,3,1    18    appl_search (4.0)
  1491.     dc.b    0,1,0    19    appl_exit
  1492.     dc.b    0,1,0    20    evnt_keybd
  1493.     dc.b    3,5,0    21    evnt_button
  1494.     dc.b    5,5,0    22    evnt_mouse
  1495.     dc.b    0,1,1    23    evnt_mesag
  1496.     dc.b    2,1,0    24    evnt_timer
  1497.     dc.b    16,7,1    25    evnt_multi
  1498.     dc.b    2,1,0    26    evnt_dclick
  1499.     dc.b    0,0,0    27*
  1500.     dc.b    0,0,0    28*
  1501.     dc.b    0,0,0    29*
  1502.     dc.b    1,1,1    30    menu_bar
  1503.     dc.b    2,1,1    31    menu_icheck
  1504.     dc.b    2,1,1    32    menu_ienable
  1505.     dc.b    2,1,1    33    menu_tnormal
  1506.     dc.b    1,1,2    34    menu_text
  1507.     dc.b    1,1,1    35    menu_register
  1508.     dc.b    2,1,2    36    menu_popup (3.3)
  1509.     dc.b    2,1,2    37    menu_attach (3.3)
  1510.     dc.b    3,1,1    38    menu_istart (3.3)
  1511.     dc.b    1,1,1    39    menu_settings (3.3)
  1512.     dc.b    2,1,1    40    objc_add
  1513.     dc.b    1,1,1    41    objc_delete
  1514.     dc.b    6,1,1    42    objc_draw
  1515.     dc.b    4,1,1    43    objc_find
  1516.     dc.b    1,3,1    44    objc_offset
  1517.     dc.b    2,1,1    45    objc_order
  1518.     dc.b    4,2,1    46    objc_edit
  1519.     dc.b    8,1,1    47    objc_change
  1520.     dc.b    4,3,0    48    objc_sysvar
  1521.     dc.b    0,0,0    49*
  1522.     dc.b    1,1,1    50    form_do
  1523.     dc.b    9,1,0    51    form_dial
  1524.     dc.b    1,1,1    52    form_alert
  1525.     dc.b    1,1,0    53    form_error
  1526.     dc.b    0,5,1    54    form_center
  1527.     dc.b    3,3,1    55    form_keybd
  1528.     dc.b    2,2,1    56    form_button
  1529.     dc.b    0,0,0    57*
  1530.     dc.b    0,0,0    58*
  1531.     dc.b    0,0,0    59*
  1532.     dc.b    0,0,0    60*
  1533.     dc.b    0,0,0    61*
  1534.     dc.b    0,0,0    62*
  1535.     dc.b    0,0,0    63*
  1536.     dc.b    0,0,0    64*
  1537.     dc.b    0,0,0    65*
  1538.     dc.b    0,0,0    66*
  1539.     dc.b    0,0,0    67*
  1540.     dc.b    0,0,0    68*
  1541.     dc.b    0,0,0    69*
  1542.     dc.b    4,3,0    70    graf_rubberbox
  1543.     dc.b    8,3,0    71    graf_dragbox
  1544.     dc.b    6,1,0    72    graf_movebox
  1545.     dc.b    8,1,0    73    graf_growbox
  1546.     dc.b    8,1,0    74    graf_shrinkbox
  1547.     dc.b    4,1,1    75    graf_watchbox
  1548.     dc.b    3,1,1    76    graf_slidebox
  1549.     dc.b    0,5,0    77    graf_handle
  1550.     dc.b    1,1,1    78    graf_mouse
  1551.     dc.b    0,5,0    79    graf_mkstate
  1552.     dc.b    0,1,1    80    scrp_read
  1553.     dc.b    0,1,1    81    scrp_write
  1554.     dc.b    0,0,0    82*
  1555.     dc.b    0,0,0    83*
  1556.     dc.b    0,0,0    84*
  1557.     dc.b    0,0,0    85*
  1558.     dc.b    0,0,0    86*
  1559.     dc.b    0,0,0    87*
  1560.     dc.b    0,0,0    88*
  1561.     dc.b    0,0,0    89*
  1562.     dc.b    0,2,2    90    fsel_input
  1563.     dc.b    0,2,3    91    fsel_exinput
  1564.     dc.b    0,0,0    92*
  1565.     dc.b    0,0,0    93*
  1566.     dc.b    0,0,0    94*
  1567.     dc.b    0,0,0    95*
  1568.     dc.b    0,0,0    96*
  1569.     dc.b    0,0,0    97*
  1570.     dc.b    0,0,0    98*
  1571.     dc.b    0,0,0    99*
  1572.     dc.b    5,1,0    100    wind_create
  1573.     dc.b    5,1,0    101    wind_open
  1574.     dc.b    1,1,0    102    wind_close
  1575.     dc.b    1,1,0    103    wind_delete
  1576.     dc.b    2,5,0    104    wind_get
  1577.     dc.b    6,1,0    105    wind_set
  1578.     dc.b    2,1,0    106    wind_find
  1579.     dc.b    1,1,0    107    wind_update
  1580.     dc.b    6,5,0    108    wind_calc
  1581.     dc.b    0,0,0    109    wind_new
  1582.     dc.b    0,1,1    110    rsrc_load
  1583.     dc.b    0,1,0    111    rsrc_free
  1584.     dc.b    2,1,0    112 ** Control(4)=1 ** rsrc_gaddr
  1585.     dc.b    2,1,1    113    rsrc_saddr
  1586.     dc.b    1,1,1    114    rsrc_obfix
  1587.     dc.b    0,0,0    115    rsrc_rcfix (4.0)
  1588.     dc.b    0,0,0    116*
  1589.     dc.b    0,0,0    117*
  1590.     dc.b    0,0,0    118*
  1591.     dc.b    0,0,0    119*
  1592.     dc.b    0,1,2    120    shel_read
  1593.     dc.b    3,1,2    121    shel_write
  1594.     dc.b    1,1,1    122    shel_get
  1595.     dc.b    1,1,1    123    shel_put
  1596.     dc.b    0,1,1    124    shel_find
  1597.     dc.b    0,1,3    125    shel_envrn
  1598.     dc.b    0,0,0    126*
  1599.     dc.b    0,0,0    127*
  1600.     dc.b    0,0,0    128*
  1601.     dc.b    0,0,0    129*
  1602.     dc.b    1,5,0    130*    appl_getinfo (4.0)
  1603.  
  1604.  
  1605.  
  1606. THEEND
  1607.     END