home *** CD-ROM | disk | FTP | other *** search
/ Falcon 030 Power 2 / F030_POWER2.iso / ST_STE / MAGS / ICTARI03.ARJ / ictari.03 / ASSEMBLY / BPB37 / BPB37.S < prev   
Text File  |  1992-02-25  |  7KB  |  436 lines

  1. program
  2.  bsr setscreen
  3.  bsr getdrive
  4.  bsr readboot
  5.  bsr interpret
  6.  bsr extrainfo
  7.  bsr pressanykeytoexit
  8.  bsr resetscreen
  9.  clr.w -(sp)
  10.  trap #1
  11.  
  12.  
  13. setscreen
  14.  move.w #4,-(sp)
  15.  trap #14        * get screen mode in d0
  16.  addq.l #2,sp
  17.  cmp.w #1,d0
  18.  bne dontchgmode
  19.  move.w d0,screenmode    * if med-res save 1 in screenmode
  20.  move.w #0,-(sp)
  21.  move.l #-1,-(sp)
  22.  move.l #-1,-(sp)
  23.  move.w #5,-(sp)
  24.  trap #14        * change to mode 0
  25.  add.l #12,sp
  26.  move.l #colregs,-(sp)
  27.  move.w #6,-(sp)
  28.  trap #14
  29.  addq.l #6,sp
  30. dontchgmode
  31.  bsr print
  32.  dc.b 27,"E","BPB-37 by Domenico De Vitto",0
  33.  rts
  34.  
  35. getdrive 
  36.  move.w #10,-(sp)
  37.  trap #13
  38.  addq.l #2,sp
  39.  move.l d0,drivemap
  40.  bsr showdrives
  41.  bsr getdrv
  42.  rts
  43. showdrives
  44.  bsr print
  45.  dc.b 10,13,"Drives Available :",0
  46.  even
  47.  moveq #0,d7
  48. drvloop
  49.  bsr checkdrive
  50.  tst d0
  51.  bne nextdrv
  52.  moveq #65,d0
  53.  add.b d7,d0
  54.  bsr printchr
  55. nextdrv
  56.  addq #1,d7
  57.  btst #5,d7
  58.  beq drvloop
  59.  rts
  60.  
  61. getdrv
  62.  bsr print
  63.  dc.b 10,13,"Enter Drive Letter :",0
  64.  even
  65. gdrvloop
  66.  bsr getkey
  67.  bsr convertlu
  68.  sub.b #65,d0
  69.  bmi gdrvloop
  70.  cmp #31,d0
  71.  bpl gdrvloop
  72.  exg d0,d7
  73.  bsr checkdrive
  74.  bne gdrvloop
  75.  move.w d7,driveselect
  76.  exg d0,d7
  77.  add.b #65,d0
  78.  bsr printchr
  79.  rts
  80.  
  81. readboot
  82.  move.w driveselect,-(sp)
  83.  move.w #0,-(sp)
  84.  move.w #1,-(sp)
  85.  move.l #buffer,-(sp)
  86.  move.w #2,-(sp) * must be read 2 in order to catch disk changes.
  87.  move.w #4,-(sp)
  88.  trap #13
  89.  add.l #14,sp
  90.  rts
  91.  
  92. interpret
  93.  tst d0
  94.  beq okdrive
  95.  bsr print
  96.  dc.b 10,13,"Error Reading Drive",0
  97.  even
  98.  rts
  99. okdrive
  100.  bsr print
  101.  dc.b 10,13,27,"p","         From the Boot sector :         ",27,"q"
  102.  dc.b 10,13,"Branch to boot code :$",0
  103.  even
  104.  move.w buffer(pc),d0
  105.  bsr hexword86
  106.  bsr print
  107.  dc.b 10,13,"Volume Serial # :$",0
  108.  even
  109.  move.w buffer+8(pc),d0
  110.  bsr hexword86
  111.  move.b buffer+10(pc),d0
  112.  bsr hexprint
  113.  bsr print
  114.  dc.b 10,13,"Bytes per sector :$",0
  115.  even
  116.  move.l buffer+10(pc),d0
  117.  ror.l #8,d0
  118.  bsr hexword86
  119.  bsr print
  120.  dc.b 10,13,"Sectors per Cluster :$",0
  121.  even
  122.  move.w buffer+12(pc),d0
  123.  ror.w #8,d0
  124.  bsr hexprint
  125.  bsr print
  126.  dc.b 10,13,"Reserved Sectors (inc. boot) :$",0
  127.  even
  128.  move.w buffer+14(pc),d0
  129.  bsr hexword86
  130.  bsr print
  131.  dc.b 10,13,"File Allocation Tables (FATs):$",0
  132.  even
  133.  move.b buffer+16(pc),d0
  134.  bsr hexprint
  135.  bsr print
  136.  dc.b 10,13,"Max Root Directory entries :$",0
  137.  even
  138.  move.l buffer+16(pc),d0
  139.  ror.l #8,d0
  140.  bsr hexword86
  141.  bsr print
  142.  dc.b 10,13,"Sectors (inc reserved) :$",0
  143.  even
  144.  move.l buffer+18(pc),d0
  145.  ror.l #8,d0
  146.  bsr hexword86
  147.  bsr print
  148.  dc.b 10,13,"Media Descripter (not used by TOS) :$",0
  149.  even
  150.  move.b buffer+21(pc),d0
  151.  bsr hexprint
  152.  bsr print
  153.  dc.b 10,13,"Sectors per FAT :$",0
  154.  even
  155.  move.w buffer+22(pc),d0
  156.  bsr hexword86
  157.  bsr print
  158.  dc.b 10,13,"Sectors per Track :$",0
  159.  even
  160.  move.w buffer+24(pc),d0
  161.  bsr hexword86
  162.  bsr print
  163.  dc.b 10,13,"Sides on media :$",0
  164.  even
  165.  move.w buffer+26(pc),d0
  166.  bsr hexword86
  167.  bsr print
  168.  dc.b 10,13,"Hidden Sectors :$",0
  169.  even
  170.  move.w buffer+28(pc),d0
  171.  bsr hexword86
  172.  bsr print
  173.  dc.b 10,13,"Calculated dir sector :$",0
  174.  even
  175.  
  176.  
  177.  moveq #0,d0
  178.  move.b buffer+16(pc),d0
  179.  move.w buffer+22(pc),d1
  180.  ror.w #8,d1
  181.  mulu d1,d0 
  182.  move.w buffer+14(pc),d1
  183.  ror.w #8,d1
  184.  add.l d1,d0
  185.  rol.l #8,d0
  186.  bsr hexprint
  187.  rol.l #8,d0
  188.  bsr hexprint        * print longword of start sect of dir
  189.  rol.l #8,d0
  190.  bsr hexprint
  191.  rol.l #8,d0
  192.  bsr hexprint
  193.  rts
  194.  
  195. extrainfo
  196.  move.w driveselect(pc),d0
  197.  addq.w #1,d0
  198.  move.w d0,-(sp)
  199.  pea driveextra(pc)
  200.  move.w #54,-(sp)
  201.  trap #1
  202.  addq.l #8,sp
  203.  bsr print
  204.  dc.b 10,13,27,"p","   From the Operating System (TOS) :    ",27,"q"
  205.  dc.b 10,13,"Total Clusters :$",0
  206.  move.l driveextra+4(pc),d0
  207.  bsr hexlongst
  208.  bsr print
  209.  dc.b 10,13,"Free Clusters :$",0
  210.  move.l driveextra(pc),d0
  211.  bsr hexlongst
  212.  bsr print
  213.  dc.b 10,13,"Sectors per Cluster :$",0
  214.  move.l driveextra+12(pc),d0
  215.  bsr hexlongst
  216.  bsr print
  217.  dc.b 10,13,"Bytes per Sector :$",0
  218.  move.l driveextra+8(pc),d0
  219.  bsr hexlongst
  220.  bsr freespace
  221.  rts
  222.  
  223. freespace
  224.  jsr print
  225.  dc.b 10,13,"Therefore Free space = ",0
  226.  even
  227.  
  228.  move.l driveextra(pc),d0     * no free clusters
  229.  move.l driveextra+12(pc),d6    * sects per cluster
  230.  mulu driveextra+10(pc),d6
  231.  mulu d6,d0
  232.  divu #$400,d0        * mulu and print free space
  233.  move.w d0,digibyte
  234.  jsr digits
  235.  jsr print
  236.  dc.b "K of ",0
  237.  
  238.  move.l driveextra+4(pc),d0     * total no of clusters
  239.  move.l driveextra+12(pc),d6    * sects per cluster
  240.  mulu driveextra+10(pc),d6
  241.  mulu d6,d0
  242.  divu #$400,d0
  243.  move.w d0,digibyte
  244.  jsr digits
  245.  jsr print
  246.  dc.b " total",0
  247.  rts
  248.  
  249. pressanykeytoexit
  250.  bsr print
  251.  dc.b 10,13,27,"p","         Press any key to exit          ",27,"q",0
  252.  even
  253.  bsr getkey
  254.  rts
  255.  
  256. resetscreen
  257.  tst screenmode
  258.  beq resetscreenexit
  259.  move.w #1,-(sp)
  260.  move.l #-1,-(sp)
  261.  move.l #-1,-(sp)
  262.  move.w #5,-(sp)
  263.  trap #14
  264.  add.l #12,sp
  265.  move.l #colregs,-(sp)
  266.  move.w #6,-(sp)
  267.  trap #14
  268.  addq.l #6,sp
  269. resetscreenexit
  270.  rts
  271.  
  272.  
  273. ***************************************
  274.  
  275. *** digital word print ,word in digibyte bsr digits
  276. digits
  277.  moveq.l #0,d7
  278.  move.w digibyte,d7
  279.  divu #10000,d7
  280.  bsr digiprint 
  281.  moveq.l #0,d7
  282.  move.w digibyte,d7
  283.  divu #1000,d7
  284.  bsr digiprint 
  285.  moveq.l #0,d7
  286.  move.w digibyte,d7
  287.  divu #100,d7
  288.  bsr digiprint 
  289.  moveq.l #0,d7
  290.  move.w digibyte,d7
  291.  divu #10,d7
  292.  bsr digiprint 
  293.  move.w #$ffff,digiflag
  294.  move.w digibyte,d7
  295.  swap d7
  296.  bsr digiprint
  297.  clr.w digiflag
  298.  rts
  299. digiprint
  300.  swap d7
  301.  move.w d7,digibyte
  302.  swap d7
  303.  tst.b d7
  304.  beq digizero
  305.  move.w #$ffff,digiflag
  306. digiret1
  307.  add.w #"0",d7
  308. digiret2
  309.  move.w d7,-(sp)
  310.  move.w #2,-(sp)
  311.  trap #1
  312.  addq.l #4,sp
  313.  rts
  314. digizero
  315.  tst digiflag
  316.  bne digiret1
  317.  rts             * The end of VERY long digital print routine !
  318. digiflag
  319.  dc.w 0 
  320. digibyte
  321.  dc.w 0
  322. getkey
  323.  move.l #$20002,-(SP)
  324.  trap   #13
  325.  add.l #4,SP
  326.  rts
  327.  
  328. hexlongst
  329.  move.l d0,-(sp)
  330.  rol.l #8,d0
  331.  bsr hexprint
  332.  rol.l #8,d0
  333.  bsr hexprint
  334.  rol.l #8,d0
  335.  bsr hexprint
  336.  rol.l #8,d0
  337.  bsr hexprint
  338.  move.l (sp)+,d0
  339.  rts
  340.  
  341.  
  342. hexprint
  343.  move.l d0,-(sp)
  344.  asr.l #4,d0
  345.  bsr hpnext
  346.  move.l (sp),d0
  347.  bsr hpnext
  348.  move.l (sp)+,d0
  349.  rts
  350. hpnext
  351.  andi.l #$f,d0
  352.  cmpi.b #10,d0
  353.  bmi hpnext2
  354.  addq.b #7,d0
  355. hpnext2
  356.  addi.b #48,d0
  357.  move.w d0,-(sp)
  358.  move.w #2,-(sp)
  359.  trap #1
  360.  addq.l #4,sp
  361.  rts
  362.  
  363. hexword86
  364.  move.l d0,-(sp)
  365.  bsr hexprint
  366.  ror.l #8,d0
  367.  bsr hexprint
  368.  move.l (sp)+,d0
  369.  rts
  370.  
  371.  
  372. print
  373.  move.l (sp),-(sp)
  374.  move.w #9,-(sp)
  375.  trap #1
  376.  addq.l #6,sp
  377.  move.l (sp)+,a0
  378. ploop
  379.  move.w (a0),d0
  380.  tst.b d0
  381.  beq pend
  382.  asr.w #8,d0
  383.  tst.b d0
  384.  beq pend
  385.   adda #2,a0
  386.  bra ploop
  387. pend
  388.  adda #2,a0
  389.  move.l a0,-(sp)
  390.  rts
  391.  
  392. printchr
  393.  move.l d0,-(sp)
  394.  and.l #$ff,d0
  395.  move.w d0,-(sp)
  396.  move.w #2,-(sp)
  397.  move.w #3,-(sp)
  398.  trap #13
  399.  add.l #6,sp
  400.  move.l (sp)+,d0
  401.  rts
  402.  
  403. checkdrive
  404.  move.l drivemap,d6
  405.  btst d7,d6        * drv to check = d7
  406.  beq checkdrivexit
  407.  moveq #0,d0        * ret code in d0
  408.  rts            * -1 = not there, 0=ok
  409. checkdrivexit
  410.  moveq #-1,d0
  411.  rts
  412.  
  413. convertlu
  414.  cmp.b #"a",d0        * if d0>=asc "a" subtract 32 from it
  415.  bmi convertexit    * eg a => A , z => Z 
  416.  sub.b #32,d0
  417. convertexit
  418.  rts
  419.  
  420. driveextra
  421.  ds.l 4
  422.  
  423. drivemap
  424.  dc.l 0
  425. driveselect
  426.  dc.w 0
  427. colour0
  428.  dc.w 16
  429. screenmode
  430.  dc.w 0
  431. colregs
  432.  dc.l $ffff3f00
  433.  dc.l $f8f80000
  434.  ds.l 6
  435.  
  436. buffer