home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 594a.lha / IOPack_v1.04 / iopack.s < prev    next >
Text File  |  1991-06-13  |  28KB  |  1,186 lines

  1.     opt    a+,c+,o+
  2.     ;opt    d+,x+        ;comment line for stripped,
  3.                 ;uncomment for unstripped
  4.  
  5.     incdir    "ainclude:"        ;your asm include dir
  6.  
  7.     include    "exec/exec_lib.i"
  8.     include    "intuition/screens.i"
  9.     include    "intuition/intuition.i"
  10.     include    "intuition/intuition_lib.i"
  11.     include    "devices/console.i"
  12.     include    "devices/console_lib.i"
  13.     include    "libraries/amiga.lib.i"    ;my asm versions of
  14.                     ;amiga.lib routines
  15.                     
  16. INTUITION_REV    equ    31        ;v1.1
  17.  
  18. ;Exports
  19.     XDEF    MakeWindow
  20.     XDEF    ClearWindow
  21.     XDEF    GetWindowSize
  22.     XDEF    WindowTitle
  23.     XDEF    SetFont
  24.     XDEF    GetC
  25.     XDEF    CharOut
  26.     XDEF    BackSpace
  27.     XDEF    CStrin
  28.     XDEF    CStrout
  29.     XDEF    Strin
  30.     XDEF    Strout
  31.     XDEF    NewLine
  32.     XDEF    Spaces
  33.     XDEF    DecIn
  34.     XDEF    DecIn_Long
  35.     XDEF    DecOut
  36.     XDEF    DecOut_Long
  37.     XDEF    HexIn
  38.     XDEF    HexIn_Long
  39.     XDEF    HexOut
  40.     XDEF    HexOut_Long
  41.     XDEF    DivuLW
  42.     XDEF    Rand
  43.     XDEF    ResetRand
  44.     XDEF    Seed
  45.     XDEF    IOExit
  46.     XDEF    WaitForEvent
  47.     XDEF    AskYesNo
  48.     XDEF    WrtIOInfo
  49.     XDEF    _SysBase
  50.     XDEF    RangeSeed
  51.     XDEF    startup
  52.  
  53. ;Imports
  54.     XREF    _IntuitionBase
  55.     XREF    IOPackWindow
  56.  
  57. startup    clr.l    _IntuitionBase
  58.     clr.l    IOPackWindow        
  59.     clr.l    write_req        ;initialize
  60.     clr.l    write_port
  61.     clr.l    read_req
  62.     clr.l    read_port
  63.     clr.b    _ConBlock
  64.  
  65.     moveq    #INTUITION_REV,d0        ;open intuition library
  66.     lea    int_name,a1        ;the only given library
  67.     CALLEXEC    OpenLibrary        ;any others must be opened
  68.     move.l    d0,_IntuitionBase        ;by the user
  69. exit_startup    rts
  70.  
  71.  
  72. *******************************************************************************
  73. *
  74. *  MakeWindow.......Make the window.
  75. *
  76. *  input:
  77. *    A0: ptr to title string
  78. *
  79. *  output:
  80. *    D0: 0L if error, non-zero if no error
  81. *
  82. *  NOTE: This routine will open a window the full size of the screen minus
  83. *        the screens top border (so that you can drag).  The window can be
  84. *        resized, depth arranged, and dragged.  There is no close button
  85. *        since there is no way of handling it in the IOPack way of doing
  86. *        things.
  87. *
  88. *******************************************************************************
  89.  
  90. MakeWindow    movem.l    d1-d7/a0-a6,-(sp)        ;a0 = ptr to window title
  91.     move.l    a0,-(sp)
  92.                     ;***USE MY ROUTINES***
  93.     moveq    #0,d0            ;clr.l    -(sp);setup write port
  94.     lea    iopack_write_port,a0    ;pea    iopack_write_port
  95.     jsr    CreatePort        ;jsr    _CreatePort
  96.                     ;addq.w    #8,sp
  97.     move.l    d0,write_port
  98.     beq    exit_window_CS
  99.  
  100.     move.l    d0,a0            ;pea    (IOSTD_SIZE).W;setup write IO request
  101.     moveq    #IOSTD_SIZE,d0        ;move.l    d0,-(sp);block (d0 = write_port)
  102.     jsr    CreateExtIO        ;jsr    _CreateExtIO
  103.                     ;addq.w    #8,sp
  104.     move.l    d0,write_req
  105.     beq    exit_window_CS
  106.  
  107.     moveq    #0,d0            ;clr.l    -(sp);setup read port
  108.     lea    iopack_read_port,a0        ;pea    iopack_read_port
  109.     jsr    CreatePort        ;jsr    _CreatePort
  110.                     ;addq.w    #8,sp
  111.     move.l    d0,read_port
  112.     beq    exit_window_CS
  113.  
  114.     move.l    d0,a0            ,pea    (IOSTD_SIZE).W;setup read IO request
  115.     moveq    #IOSTD_SIZE,d0        ;move.l    d0,-(sp);block (d0 = read_port)
  116.     jsr    CreateExtIO        ;jsr    _CreateExtIO
  117.                     ;addq.w    #8,sp
  118.     move.l    d0,read_req
  119.     beq    exit_window_CS
  120.  
  121.     ;lea    SomeScreenDat,a0        ;get wbenchscreen data
  122.     movea.l    #SomeScreenDat,a0        ;get wbenchscreen data
  123.     moveq    #sc_WBorTop,d0
  124.     moveq    #WBENCHSCREEN,d1
  125.     CALLINT    GetScreenData
  126.     beq    exit_window_CS
  127.  
  128.     ;lea    MyNewWindow,a0        ;fill in window info
  129.     move.l    #MyNewWindow,a0        ;fill in window info
  130.     ;lea    SomeScreenDat,a1
  131.     move.l    #SomeScreenDat,a1
  132.     move.w    #0,nw_LeftEdge(a0)
  133.     move.w    sc_Width(a1),nw_Width(a0)
  134.     moveq    #0,d1
  135.     move.w    sc_Height(a1),d0
  136.     move.b    sc_BarHeight(a1),d1
  137.     addq.w    #1,d1
  138.     sub.w    d1,d0
  139.     move.w    d1,nw_TopEdge(a0)
  140.     move.w    d0,nw_Height(a0)
  141.     move.b    #0,nw_DetailPen(a0)
  142.     move.b    #1,nw_BlockPen(a0)
  143.     move.l    (sp)+,nw_Title(a0)
  144. _temp    set    SMART_REFRESH|ACTIVATE|WINDOWSIZING
  145.     move.l    #_temp|WINDOWDRAG|WINDOWDEPTH,nw_Flags(a0)
  146.     move.l    #0,nw_IDCMPFlags(a0)
  147.     move.w    #WBENCHSCREEN,nw_Type(a0)
  148.     clr.l    nw_FirstGadget(a0)
  149.     clr.l    nw_CheckMark(a0)
  150. *    move.l    #0,nw_Screen(a0)
  151.     clr.l    nw_BitMap(a0)
  152.     move.w    #100,nw_MinWidth(a0)
  153.     move.w    #25,nw_MinHeight(a0)
  154.     move.w    #640,nw_MaxWidth(a0)
  155.     move.w    #200,nw_MaxHeight(a0)
  156.  
  157.     ;CALLINT    OpenWindow        ;open window
  158.     jsr    _LVOOpenWindow(a6)
  159.     move.l    d0,IOPackWindow
  160.     beq.s    exit_window
  161.  
  162.     opt    a-
  163.     move.l    write_req,a1        ;attach console
  164.     opt    a+
  165.     move.l    IOPackWindow,IO_DATA(a1)
  166.     move.l    #wd_Size,IO_LENGTH(a1)
  167.     lea    console_name,a0
  168.     moveq    #0,d0
  169.     move.l    d0,d1
  170.     CALLEXEC    OpenDevice
  171.     tst.l    d0
  172.     seq    d0
  173.     move.b    d0,_ConBlock
  174.     beq.s    exit_window
  175.     opt    a-
  176.     move.l    write_req,a0
  177.     move.l    read_req,a1
  178.     opt    a+
  179.     move.l    IO_DEVICE(a0),IO_DEVICE(a1)
  180.     move.l    IO_UNIT(a0),IO_UNIT(a1)
  181.  
  182.     ;lea    char_buf,a2
  183.     move.l    #char_buf,a2
  184.     jsr    QueueRead
  185.  
  186.     moveq    #-1,d0
  187.     bra.s    exit_window
  188.  
  189. exit_window_CS    addq.l    #4,sp
  190.  
  191. exit_window    movem.l    (sp)+,d1-d7/a0-a6
  192.     rts
  193.  
  194. *******************************************************************************
  195. *
  196. *  ClearWindow......Home cursor and clear window.
  197. *
  198. *******************************************************************************
  199.  
  200. ClearWindow    movem.l    d0/a0,-(sp)
  201.     jsr    IsWindow
  202.     tst.l    d0
  203.     beq.s    end_clw
  204.     lea    clear_buf,a0        ;send codes for home and
  205.     jsr    CStrout            ;clear to end
  206. end_clw    movem.l    (sp)+,d0/a0
  207.     rts
  208.  
  209. *******************************************************************************
  210. *
  211. *  GetWindowSize....Return the size of the window.
  212. *
  213. *  output:
  214. *    D0.L: upper word - width of the window
  215. *          lower word - height of the window
  216. *
  217. *******************************************************************************
  218.  
  219. GetWindowSize    move.l    a0,-(sp)
  220.     jsr    IsWindow
  221.     tst.l    d0
  222.     beq.s    end_gws
  223.     move.l    IOPackWindow,a0        ;reach into that window
  224.     move.w    wd_Width(a0),d0        ;struct and get out
  225.     swap    d0            ;height and width
  226.     move.w    wd_Height(a0),d0
  227. end_gws    move.l    (sp)+,a0
  228.     rts
  229.  
  230. *******************************************************************************
  231. *
  232. *  WindowTitle......Change the title of the window.
  233. *
  234. *  input:
  235. *    A0: ptr to new title string
  236. *
  237. *******************************************************************************
  238.  
  239. WindowTitle    movem.l    d0/d1/a0/a1/a2/a6,-(sp)
  240.     jsr    IsWindow
  241.     tst.l    d0
  242.     beq.s    end_wtt
  243.     move.l    a0,a1            ;SetWindowTitles(a0,a1,-1L)
  244.     move.l    IOPackWindow,a0
  245.     move.l    #-1,a2
  246.     CALLINT    SetWindowTitles
  247. end_wtt    movem.l    (sp)+,d0/d1/a0/a1/a2/a6
  248.     rts
  249.  
  250. *******************************************************************************
  251. *
  252. *  SetFont..........Change the style of the font.
  253. *
  254. *  input:
  255. *    D2.W: font style (-1-Plain, 0-Bold, 1-Italic, 2-Underline)
  256. *
  257. *  NOTE: Mac version allows for Font and Size change.  For compatibility
  258. *        reasons, the Amiga version does not do this.  In other words, the
  259. *        Amiga does not have Chicago, Geneva, or Monaco for standard fonts.
  260. *        Likewise, Mac styles 3-6 (Outline, Shadow, Condense, and Extend)
  261. *        do nothing and are not implemented.  This routine will just ignore
  262. *        what it cannot do.
  263. *
  264. *******************************************************************************
  265.  
  266. SetFont    movem.l    d0/a0,-(sp)
  267.     jsr    IsWindow
  268.     tst.l    d0
  269.     beq.s    End_SetFont
  270.     tst.w    d2            ;send control codes for
  271.     bne.s    italic            ;respective actions
  272. bold    lea    bold_buf,a0
  273.     bra.s    End_SetFont
  274. italic    cmpi.w    #1,d2
  275.     bne.s    underline
  276.     lea    italic_buf,a0
  277.     bra.s    End_SetFont
  278. underline    cmpi.w    #2,d2
  279.     bne.s    plain
  280.     lea    underline_buf,a0
  281.     bra.s    End_SetFont
  282. plain    cmpi.w    #-1,d2
  283.     bne.s    End_SetFont
  284.     lea    plain_buf,a0
  285. End_SetFont    jsr    CStrout
  286.     movem.l    (sp)+,d0/a0
  287.     rts
  288.  
  289. *******************************************************************************
  290. *
  291. *  GetC.............Get a character from the keyboard.
  292. *
  293. *  output:
  294. *    D0.B: character read in
  295. *
  296. *******************************************************************************
  297.  
  298. GetC    movem.l    d1/a0/a1/a2/a3/a6,-(sp)
  299.     jsr    IsWindow
  300.     tst.l    d0
  301.     beq.s    end_GC
  302.     move.l    d0,-(sp)
  303.     ;lea    char_buf,a2
  304.     move.l    #char_buf,a2
  305.     opt    a-
  306.     movea.l    read_port,a3
  307.     opt    a+
  308.     movea.l    a3,a0
  309.     CALLEXEC    WaitPort            ;wait for a character
  310.     movea.l    a3,a0
  311.     jsr    _LVOGetMsg(a6)        ;get the message with the char
  312.     move.b    (a2),d1
  313.     move.l    d0,a1
  314.     jsr    QueueRead            ;queue up next read
  315.     move.l    (sp)+,d0
  316.     move.b    d1,d0
  317. end_GC    movem.l    (sp)+,d1/a0/a1/a2/a3/a6
  318.     rts
  319.  
  320. *******************************************************************************
  321. *
  322. *  QueueRead........Queue up a character from the keyboard.
  323. *
  324. *******************************************************************************
  325.  
  326. QueueRead    movem.l    d0/d1/a0/a1/a6,-(sp)
  327.     move.w    #CMD_READ,IO_COMMAND(a1)    ;a1 = read_req
  328.     move.l    a2,IO_DATA(a1)        ;a2 = char_buf
  329.     moveq    #1,d0
  330.     move.l    d0,IO_LENGTH(a1)
  331.     CALLEXEC    SendIO
  332.     movem.l    (sp)+,d0/d1/a0/a1/a6
  333.     rts
  334.  
  335. *******************************************************************************
  336. *
  337. *  CharOut..........Output a character to the window.
  338. *
  339. *  input:
  340. *    D0.B: character to output
  341. *
  342. *******************************************************************************
  343.  
  344. CharOut    movem.l    d0/d1/a0/a1/a6,-(sp)
  345.     movem.l    d0,-(sp)
  346.     jsr    IsWindow
  347.     tst.l    d0
  348.     movem.l    (sp)+,d0
  349.     beq.s    end_CHRO
  350.     opt    a-
  351.     movea.l    write_req,a1
  352.     opt    a+
  353.     move.w    #CMD_WRITE,IO_COMMAND(a1)    ;set command write
  354.     move.b    d0,char_buf        ;put chat in buf
  355.     ;lea    char_buf,a0
  356.     move.l    #char_buf,a0
  357.     move.l    a0,IO_DATA(a1)        ;set attributes
  358.     moveq    #1,d0
  359.     move.l    d0,IO_LENGTH(a1)
  360.     CALLEXEC    DoIO            ;send request
  361. end_CHRO    movem.l    (sp)+,d0/d1/a0/a1/a6
  362.     rts
  363.  
  364. *******************************************************************************
  365. *
  366. *  BackSpace........Delete the character to the left of the cursor.
  367. *
  368. *******************************************************************************
  369.  
  370. BackSpace    movem.l    d0/a0,-(sp)
  371.     jsr    IsWindow
  372.     tst.l    d0
  373.     beq.s    end_BSP
  374.     lea    delete_buf,a0
  375.     jsr    CStrout            ;send control codes to
  376. end_BSP    movem.l    (sp)+,d0/a0            ;delete character
  377.     rts
  378.  
  379. *******************************************************************************
  380. *
  381. *  CStrin...........Input a CR delimited string.
  382. *
  383. *  input:
  384. *    A0.L: address of buffer to store string
  385. *    D0.W: size of the buffer
  386. *
  387. *  output:
  388. *    A0.L: address of string (same as input)
  389. *    D0.W: Number of characters actually read in, 0 <= D0.W.out <= D0.W.in-1
  390. *
  391. *  NOTE: The string will be null terminated and will not have a CR in it.
  392. *        The Mac version uses strings where string[0] = len(string).
  393. *
  394. *******************************************************************************
  395.  
  396. CStrin    movem.l    d1/d2/a0,-(sp)
  397.     movem.l    d0,-(sp)
  398.     jsr    IsWindow
  399.     tst.l    d0
  400.     movem.l    (sp)+,d0
  401.     beq.s    EndCStrin
  402.     move.w    d0,d1
  403.     beq.s    EndCStrin
  404.     subq.w    #2,d1            ;get 1 less than buf size
  405.     moveq    #0,d2
  406. Cloop    jsr    GetC            ;get a char
  407.     cmp.b    #$08,d0            ;is delete?
  408.     bne.s    notdelete
  409.     tst.l    d2
  410.     beq.s    Cloop
  411. del    subq.l    #1,a0            ;if so, fix vars
  412.     subq.l    #1,d2
  413.     addq.w    #1,d1
  414.     jsr    BackSpace
  415.     bra.s    Cloop            ;go get another
  416. notdelete    cmp.b    #$0d,d0            ;is CR?
  417.     beq.s    quickend            ;if so, end
  418.     jsr    CharOut            ;else output that char
  419.     addq.w    #1,d2
  420.     move.b    d0,(a0)+
  421.     dbra    d1,Cloop            ;is buffer-1 full?
  422. notquick    jsr    GetC            ;yes, then get last char
  423.     cmp.b    #$08,d0
  424.     beq.s    del
  425.     cmp.b    #$0d,d0
  426.     bne.s    notquick
  427. quickend    move.b    #0,(a0)
  428.     move.w    d2,d0
  429. EndCStrin    movem.l    (sp)+,d1/d2/a0
  430.     rts
  431.  
  432. *******************************************************************************
  433. *
  434. *  CStrout..........Output a C string.
  435. *
  436. *  input:
  437. *    A0: address of string to output, must be null terminated
  438. *
  439. *  NOTE: Mac strings in IOPack have string[0] = len(string).  Amiga
  440. *        strings are C or Unix style null terminated strings.
  441. *
  442. *******************************************************************************
  443.  
  444. CStrout    movem.l    d0/d1/a0/a1/a6,-(sp)
  445.     jsr    IsWindow
  446.     tst.l    d0
  447.     beq.s    end_CSTRO
  448.     opt    a-
  449.     movea.l    write_req,a1
  450.     opt    a+
  451.     move.w    #CMD_WRITE,IO_COMMAND(a1)    ;send packet with length
  452.     move.l    a0,IO_DATA(a1)        ;-1 for null strings
  453.     move.l    #-1,IO_LENGTH(a1)
  454.     CALLEXEC    DoIO
  455. end_CSTRO    movem.l    (sp)+,d0/d1/a0/a1/a6
  456.     rts
  457.  
  458. *******************************************************************************
  459. *
  460. *  Strin............Input a counted string
  461. *
  462. *  input:
  463. *    A0.L: address of buffer to store string
  464. *    D0.W: Maximum number of characters to read in
  465. *
  466. *  output:
  467. *    A0.L: address of string buffer (same as input)
  468. *    D0.W: number of characters actually read in
  469. *
  470. *******************************************************************************
  471.  
  472. Strin    movem.l    d1/d2/a0,-(sp)        ;see CStrin, same but no
  473.     movem.l    d0,-(sp)
  474.     jsr    IsWindow            ;null termination
  475.     tst.l    d0
  476.     movem.l    (sp)+,d0
  477.     beq.s    EndStrin
  478.     move.w    d0,d1
  479.     beq.s    EndStrin
  480.     subq.w    #1,d1
  481.     moveq    #0,d2
  482. Sloop    jsr    GetC
  483.     cmp.b    #$08,d0
  484.     bne.s    notdelete2
  485.     tst.l    d2
  486.     beq.s    Sloop
  487. del2    subq.l    #1,a0
  488.     subq.l    #1,d2
  489.     addq.w    #1,d1
  490.     jsr    BackSpace
  491.     bra.s    Sloop
  492. notdelete2    jsr    CharOut
  493.     addq.w    #1,d2
  494.     move.b    d0,(a0)+
  495.     cmp.b    #$0d,d0
  496.     dbeq    d1,Sloop
  497.     cmp.b    #$0d,d0
  498.     bne.s    notquick2
  499.     subq.w    #1,d2
  500.     bra.s    quickend2
  501. notquick2    jsr    GetC
  502.     cmp.b    #$08,d0
  503.     beq.s    del2
  504.     cmp.b    #$0d,d0
  505.     bne.s    notquick2
  506. quickend2    move.w    d2,d0
  507. EndStrin    movem.l    (sp)+,d1/d2/a0
  508.     rts
  509.  
  510. *******************************************************************************
  511. *
  512. *  Strout...........Output a counted string.
  513. *
  514. *  input:
  515. *    A0.L: address of string to output
  516. *    D0.W: length of the string
  517. *
  518. *******************************************************************************
  519.  
  520. Strout    movem.l    d0/d1/a0/a1/a6,-(sp)
  521.     movem.l    d0,-(sp)
  522.     jsr    IsWindow
  523.     tst.l    d0
  524.     movem.l    (sp)+,d0
  525.     beq.s    end_STRO
  526.     opt    a-
  527.     movea.l    write_req,a1
  528.     opt    a+
  529.     move.w    #CMD_WRITE,IO_COMMAND(a1)    ;send a packet of passed
  530.     move.l    a0,IO_DATA(a1)        ;length size
  531.     moveq    #0,d1
  532.     move.w    d0,d1
  533.     move.l    d1,IO_LENGTH(a1)
  534.     CALLEXEC    DoIO
  535. end_STRO    movem.l    (sp)+,d0/d1/a0/a1/a6
  536.     rts
  537.  
  538. *******************************************************************************
  539. *
  540. *  NewLine..........Move cursor to beginning of next line.
  541. *
  542. *******************************************************************************
  543.  
  544. NewLine    movem.l    d0/a0,-(sp)
  545.     jsr    IsWindow
  546.     tst.l    d0
  547.     beq.s    end_NL
  548.     lea    newline_buf,a0        ;send newline codes
  549.     jsr    CStrout
  550. end_NL    movem.l    (sp)+,d0/a0
  551.     rts
  552.  
  553. *******************************************************************************
  554. *
  555. *  Spaces...........Output given number of spaces
  556. *
  557. *  input:
  558. *    D0.W: number of spaces
  559. *
  560. *******************************************************************************
  561.  
  562. Spaces    movem.l    d0/d1/a0,-(sp)
  563.     movem.l    d0,-(sp)
  564.     jsr    IsWindow
  565.     tst.l    d0
  566.     movem.l    (sp)+,d0
  567.     beq.s    end_spac
  568.     move.w    d0,d1
  569.     beq.s    end_spac            ;if 0 then end
  570.     subq.w    #1,d1            ;else loop-print spaces
  571.     moveq    #' ',d0
  572. sploop    jsr    CharOut
  573.     dbra    d1,sploop
  574. end_spac    movem.l    (sp)+,d0/d1/a0
  575.     rts
  576.  
  577. *******************************************************************************
  578. *
  579. *  DecIn............Input a decimal number (word size).
  580. *
  581. *  output:
  582. *    D0.W: binary equivalent of decimal number
  583. *
  584. *******************************************************************************
  585.  
  586. DecIn    movem.l    d1/d2/d3/d4/d5/d6/a0,-(sp)
  587.     move.l    d0,d6            ;setup for ReadNum
  588.     moveq    #6,d0            ;number of ascii chars in word
  589.     moveq    #0,d4            ;d4=0 means word size
  590.     bra.s    ReadNum
  591.  
  592. *******************************************************************************
  593. *
  594. *  DecIn_Long.......Input a decimal number (long size)
  595. *
  596. *  output:
  597. *    D0.L: binary equivalent of decimal number
  598. *
  599. *******************************************************************************
  600.  
  601. DecIn_Long    movem.l    d1/d2/d3/d4/d5/d6/a0,-(sp)
  602.     move.l    d0,d6            ;setup for ReadNum
  603.     moveq    #11,d0            ;number of ascii chars in long
  604.     moveq    #1,d4            ;d4=1 means long size
  605.  
  606. ReadNum    jsr    IsWindow
  607.     tst.l    d0
  608.     beq.s    EndDecIn
  609.     moveq    #0,d1
  610.     move.l    d1,d2
  611.     move.l    d1,d3
  612.     ;lea    DecInBuf,a0
  613.     move.l    #DecInBuf,a0
  614.     jsr    Strin        ;this thing works by getting a char,
  615.     bne.s    conv_num        ;if there's another char then multiply
  616.     moveq    #0,d3        ;by ten and add.  loop until no more
  617.     bra.s    clean_readnum    ;chars
  618. conv_num    subq.w    #1,d0
  619.     cmpi.b    #'-',(a0)
  620.     bne.s    NumCheck
  621.     moveq    #1,d1
  622.     addq.l    #1,a0
  623.     subq.w    #1,d0
  624.     bra.s    DoNum
  625. NumCheck    cmp.b    #$30,(a0)
  626.     bcc.s    DoNum
  627.     addq.l    #1,a0
  628.     subq.w    #1,d0
  629. DoNum    move.l    d3,d5
  630.     lsl.l    #1,d3            ;multiply
  631.     lsl.l    #3,d5            ;by
  632.     add.l    d5,d3            ;10 in a weird way
  633.     move.b    (a0)+,d2
  634.     andi.b    #$0f,d2
  635.     add.l    d2,d3
  636.     dbra    d0,DoNum
  637. clean_readnum    tst.b    d4
  638.     bne.s    Long
  639. Short    move.l    d6,d0
  640.     move.w    d3,d0
  641.     tst.b    d1
  642.     beq.s    EndDecIn
  643. SNeg    neg.w    d0
  644.     bra.s    EndDecIn
  645. Long    move.l    d3,d0
  646.     tst.b    d1
  647.     beq.s    EndDecIn
  648. LNeg    neg.l    d0
  649. EndDecIn    movem.l    (sp)+,d1/d2/d3/d4/d5/d6/a0
  650.     rts
  651.  
  652. *******************************************************************************
  653. *
  654. *  DecOut...........Output a decimal number (word size).
  655. *
  656. *  input:
  657. *    D0.W: binary equivalent of decimal number
  658. *
  659. *******************************************************************************
  660.  
  661. STKPTR    equr    a0
  662. DIVBASE    equr    d4
  663. BASETEN    set    10            ;output base
  664. STK_SIZE    set    5            ;max number of ascii chars
  665.                     ;in word size decimal number
  666.  
  667. DecOut    movem.l    d0-d4/a0,-(sp)
  668.     movem.l    d0,-(sp)
  669.     jsr    IsWindow
  670.     tst.l    d0
  671.     movem.l    (sp)+,d0
  672.     beq.s    end_deco
  673.     ;lea    StackEnd,STKPTR
  674.     move.l    #StackEnd,STKPTR
  675.     move.l    STKPTR,d2
  676.     moveq    #0,d1
  677.     move.b    d1,StackEnd
  678.     move.w    d0,d1
  679.     bpl.s    CONVPOS
  680. CONVNEG    neg.w    d1
  681.     moveq    #'-',d0
  682.     jsr    CharOut
  683. CONVPOS    move.l    d1,d0
  684.     moveq    #BASETEN,DIVBASE
  685.     moveq    #$30,d3
  686. DIVIT    divu    DIVBASE,d0        ;loop dividing by 10 each
  687.     swap    d0            ;time
  688.     or.b    d3,d0
  689.     move.b    d0,-(STKPTR)
  690.     clr.w    d0
  691.     swap    d0
  692.     bne.s    DIVIT
  693. ENDDIV    jsr    CStrout
  694. end_deco    movem.l    (sp)+,d0-d4/a0
  695.     rts
  696.  
  697. *******************************************************************************
  698. *
  699. *  DecOut_Long......Output a decimal number (long size).
  700. *
  701. *  input:
  702. *    D0.L: binary equivalent of decimal number
  703. *
  704. *******************************************************************************
  705.  
  706. BASETEN    set    10
  707.  
  708. DecOut_Long    movem.l    d0-d4/a0,-(sp)    ;same as DecOut, but
  709.     movem.l    d0,-(sp)
  710.     jsr    IsWindow
  711.     tst.l    d0
  712.     movem.l    (sp)+,d0
  713.     beq.s    end_decol
  714.     ;lea    StackEnd2,STKPTR
  715.     move.l    #StackEnd2,STKPTR
  716.     move.l    STKPTR,d2
  717.     moveq    #0,d1
  718.     move.b    d1,StackEnd2
  719.     move.l    d0,d1
  720.     bpl.s    CONVPOSL
  721. CONVNEGL    neg.l    d1
  722.     moveq    #'-',d0
  723.     jsr    CharOut
  724. CONVPOSL    move.l    d1,d0
  725.     moveq    #$30,d3
  726. DIVITL    moveq    #BASETEN,d1
  727.     jsr    DivuLW
  728.     or.b    d3,d1
  729.     move.b    d1,-(STKPTR)
  730.     tst.l    d0
  731.     bne.s    DIVITL
  732. ENDDIVL    jsr    CStrout
  733. end_decol    movem.l    (sp)+,d0-d4/a0
  734.     rts
  735.  
  736. *******************************************************************************
  737. *
  738. *  HexIn............Input a hex number (word size).
  739. *
  740. *  output:
  741. *    D0.W: binary equivalent of hex number
  742. *
  743. *******************************************************************************
  744.  
  745. HexIn    movem.l    d1/d2/d4/d6/a0,-(sp)
  746.     move.l    d0,d6        ;setup vars for passing to ReadHex
  747.     moveq    #4,d0        ;size
  748.     moveq    #0,d4        ;d4=0 means word size
  749.     move.w    d4,d2
  750.     bra.s    ReadHex
  751.  
  752. *******************************************************************************
  753. *
  754. *  HexIn_Long.......Input a hex number (long size).
  755. *
  756. *  output:
  757. *    D0.L: binary equivalent of hex number
  758. *
  759. *******************************************************************************
  760.  
  761. HexIn_Long    movem.l    d1/d2/d4/d6/a0,-(sp)
  762.     move.l    d0,d6        ;setup vars for passing to ReadHex
  763.     moveq    #8,d0        ;size
  764.     moveq    #1,d4        ;d4=1 means long size
  765.     moveq    #0,d2
  766.  
  767. ReadHex    jsr    IsWindow
  768.     tst.l    d0
  769.     beq.s    end_ReadHex
  770.     ;lea    DecInBuf,a0
  771.     move.l    #DecInBuf,a0
  772.     jsr    Strin
  773.     bne.s    conv_hex
  774.     moveq    #0,d2
  775.     bra.s    clean_readhex
  776. conv_hex    subq.w    #1,d0
  777.     move.w    d0,d1
  778. readhex_loop    move.b    (a0)+,d0
  779.     jsr    ASCIItoHex    ;loop through converting ascii to
  780.     tst.b    d4        ;to hex and shifting left by 4
  781.     bne.s    long_shift
  782.     lsl.w    #4,d2
  783.     bra.s    past_shift
  784. long_shift    lsl.l    #4,d2
  785. past_shift    or.b    d0,d2
  786.     dbra    d1,readhex_loop
  787. clean_readhex    move.l    d2,d0
  788.     tst.b    d4
  789.     bne.s    end_ReadHex
  790.     move.l    d6,d0
  791.     move.w    d2,d0
  792. end_ReadHex    movem.l    (sp)+,d1/d2/d4/d6/a0
  793.     rts
  794.  
  795. *******************************************************************************
  796. *
  797. *  HexOut...........Output a hex number (word size).
  798. *
  799. *  input:
  800. *    D0.W: binary equivalent of number
  801. *
  802. *******************************************************************************
  803.  
  804. HexOut    movem.l    d0-d2/a0,-(sp)
  805.     movem.l    d0,-(sp)
  806.     jsr    IsWindow
  807.     tst.l    d0
  808.     movem.l    (sp)+,d0
  809.     beq.s    end_hxo
  810.     move.w    d0,d1
  811.     moveq    #3,d2
  812. hxloop    rol.w    #4,d1
  813.     move.b    d1,d0
  814.     jsr    HextoASCII    ;convert to ascii and
  815.     jsr    CharOut        ;print
  816.     dbra    d2,hxloop
  817. end_hxo    movem.l    (sp)+,d0-d2/a0
  818.     rts
  819.  
  820. *******************************************************************************
  821. *
  822. *  HexOut_Long......Output a hex number (long size).
  823. *
  824. *  input:
  825. *    D0.W: binary equivalent of number
  826. *
  827. *******************************************************************************
  828.  
  829. HexOut_Long    movem.l    d0-d2/a0,-(sp)
  830.     movem.l    d0,-(sp)
  831.     jsr    IsWindow
  832.     tst.l    d0
  833.     movem.l    (sp)+,d0
  834.     beq.s    end_hxol
  835.     move.l    d0,d1
  836.     moveq    #7,d2
  837. hxlloop    rol.l    #4,d1
  838.     move.b    d1,d0
  839.     jsr    HextoASCII    ;convert to ascii
  840.     jsr    CharOut        ;and print
  841.     dbra    d2,hxlloop
  842. end_hxol    movem.l    (sp)+,d0-d2/a0
  843.     rts
  844.  
  845. ****************************************************
  846.  
  847. HextoASCII    andi.b    #$0f,d0
  848.     ori.b    #$30,d0
  849.     cmpi.b    #$3a,d0
  850.     bcs.s    end_HextoASCII
  851.     addq.b    #7,d0
  852. end_HextoASCII    rts
  853.  
  854. ****************************************************
  855.  
  856. ASCIItoHex    cmpi.b    #$41,d0
  857.     bcs.s    end_ASCIItoHex
  858.     subq.b    #7,d0
  859. end_ASCIItoHex    andi.b    #$0f,d0
  860.     rts
  861.  
  862. ****************************************************
  863.  
  864. *******************************************************************************
  865. *
  866. *  DivuLW...........Divide unsigned longword by word
  867. *                   and return quotient and remainder.
  868. *
  869. *  input:
  870. *    D0.L: dividend
  871. *    D1.W: divisor
  872. *
  873. *  output:
  874. *    D0.L: quotient
  875. *    D1.W: remainder
  876. *
  877. *  NOTE: Mac version does not return remainder
  878. *
  879. *******************************************************************************
  880.  
  881. DivuLW    move.l    d2,-(sp)        ;in d0.l dividend
  882.     moveq    #0,d2        ;in d1.w divisor
  883.     swap    d0        ;out d0.l quotient
  884.     move.w    d0,d2        ;out d1.w remainder
  885.     divu    d1,d2
  886.     move.w    d2,d0        ;fancy footsteps
  887.     swap    d0
  888.     move.w    d0,d2
  889.     divu    d1,d2
  890.     move.w    d2,d0
  891.     swap    d2
  892.     move.w    d2,d1
  893.     move.l    (sp)+,d2
  894.     rts
  895.  
  896. *******************************************************************************
  897. *
  898. *  Rand.............Make a 16 bit random number.
  899. *
  900. *  output:
  901. *    D0.W: random number
  902. *
  903. *******************************************************************************
  904.  
  905. Rand    move.l    d1,-(sp)
  906.     move.l    d0,-(sp)
  907.     move.l    RangeSeed,d0
  908.     move.w    d0,d1
  909.     addi.l    #5246957,d0    ;just do anything
  910. adum    add.l    d0,d0        ;so that the numbers
  911.     lsr.w    #1,d1        ;aren't sequential
  912.     bne.s    adum
  913.     move.l    d0,RangeSeed    ;make new seed
  914.     clr.w    d0
  915.     swap    d0
  916.     move.l    d0,d1
  917.     move.l    (sp)+,d0
  918.     move.w    d1,d0
  919.     move.l    (sp)+,d1
  920.     rts
  921.  
  922. *******************************************************************************
  923. *
  924. *  ResetRand........Restart the random number generator.
  925. *
  926. *******************************************************************************
  927.  
  928. ResetRand    move.l    dummy2,RangeSeed
  929.     rts
  930.  
  931. *******************************************************************************
  932. *
  933. *  Seed.............Randomize the random number generator.
  934. *
  935. *******************************************************************************
  936.  
  937. Seed    movem.l    d0/d1/a0/a1/a6,-(sp)
  938.     lea    dummy1,a0
  939.     lea    dummy2,a1
  940.     CALLINT    CurrentTime    ;get intuition type time for seed
  941.     move.l    dummy2,RangeSeed
  942.     movem.l    (sp)+,d0/d1/a0/a1/a6
  943.     rts
  944. dummy1    dc.l    0
  945. dummy2    dc.l    0
  946. RangeSeed    dc.l    0
  947.  
  948. *******************************************************************************
  949. *
  950. *  IOExit...........Cleanup and terminate program.
  951. *
  952. *  NOTE: You must JSR to this routine in order to stay compatible with the
  953. *        Mac version.  I think it's unnecessary and is kinda weird looking.
  954. *        It makes you think IOExit comes back!
  955. *
  956. *******************************************************************************
  957.  
  958. IOExit    addq.l    #4,SP            ;fix stack
  959.     tst.b    _ConBlock            ;check console
  960.     beq.s    check_read_req
  961.     opt    a-
  962.     move.l    read_req,a1
  963.     opt    a+
  964.     CALLEXEC    CheckIO            ;standard request aborts
  965.     tst.l    d0
  966.     bne.s    wait_io
  967.     opt    a-
  968.     move.l    read_req,a1
  969.     opt    a+
  970.     jsr    _LVOAbortIO(a6)
  971.     opt    a-
  972. wait_io    move.l    read_req,a1
  973.     opt    a+
  974.     jsr    _LVOWaitIO(a6)
  975.  
  976.     opt    a-
  977.     move.l    write_req,a1
  978.     opt    a+
  979.     jsr    _LVOCloseDevice(a6)
  980.  
  981.     opt    a-
  982. check_read_req    move.l    read_req,d0        ;check read request
  983.     opt    a+
  984.     beq.s    check_read_port
  985.                     ;***USE MY OWN ROUTINES***
  986.     move.l    d0,a0            ;move.l    d0,-(sp)
  987.     jsr    DeleteExtIO        ;jsr    _DeleteExtIO
  988.                     ;addq.l    #4,sp
  989.     opt    a-
  990. check_read_port    move.l    read_port,d0        ;check read port
  991.     opt    a+
  992.     beq.s    check_write_req
  993.     move.l    d0,a0            ;move.l    d0,-(sp)
  994.     jsr    DeletePort        ;jsr    _DeletePort
  995.                     ;addq.l    #4,sp
  996.     opt    a-
  997. check_write_req    move.l    write_req,d0        ;check write request
  998.     opt    a+
  999.     beq.s    check_write_port
  1000.     move.l    d0,a0            ;move.l    d0,-(sp)
  1001.     jsr    DeleteExtIO        ;jsr    _DeleteExtIO
  1002.                     ;addq.l    #4,sp
  1003.     opt    a-
  1004. check_write_port    move.l    write_port,d0        ;check write port
  1005.     opt    a+
  1006.     beq.s    check_window
  1007.     move.l    d0,a0            ;move.l    d0,-(sp)
  1008.     jsr    DeletePort        ;jsr    _DeletePort
  1009.                     ;addq.l    #4,sp
  1010. check_window    move.l    IOPackWindow,d0        ;check window
  1011.     beq.s    check_intuition
  1012.     move.l    d0,a0
  1013.     CALLINT    CloseWindow
  1014.  
  1015. check_intuition    move.l    _IntuitionBase,d0        ;check intuition
  1016.     beq.s    exit_cleanexit
  1017.     move.l    d0,a1
  1018.     CALLEXEC    CloseLibrary
  1019.  
  1020. exit_cleanexit    moveq    #0,d0
  1021.     rts
  1022.  
  1023. *******************************************************************************
  1024. *
  1025. *  WaitForEvent.....Wait for a key press.
  1026. *
  1027. *  NOTE: The Mac version also let you hit the mouse button to continue.
  1028. *        Mine does not.  I will add this later.
  1029. *
  1030. *******************************************************************************
  1031.  
  1032. WaitForEvent    move.l    d0,-(sp)
  1033.     jsr    GetC            ;just a getc and throw away
  1034.     move.l    (sp)+,d0
  1035.     rts
  1036.  
  1037. *******************************************************************************
  1038. *
  1039. *  AskYesNo.........Autorequest a Yes/No question.
  1040. *
  1041. *  input:
  1042. *    A0: ptr to question string
  1043. *
  1044. *  output:
  1045. *    Z bit set if Yes, clear if No
  1046. *
  1047. *  NOTE: I never saw what the Mac version did, but I decided to make mine
  1048. *        an Amiga standard requester.
  1049. *
  1050. *******************************************************************************
  1051.  
  1052. AskYesNo    movem.l    d0/d1/d2/d3/a0/a1/a2/a3/a6,-(sp)
  1053.     jsr    IsWindow
  1054.     tst.l    d0
  1055.     beq.s    end_AskYesNo
  1056.     move.l    a0,Body_String
  1057.     move.l    IOPackWindow,a0        ;setup AutoRequest
  1058.     lea    Body_text,a1        ;stuff
  1059.     lea    Positive_text,a2
  1060.     lea    Negative_text,a3
  1061.     moveq    #0,d0
  1062.     move.l    d0,d1
  1063.     move.w    #640,d2
  1064.     move.w    #50,d3
  1065.     CALLINT    AutoRequest
  1066.     tst.l    d0
  1067.     beq.s    false_resp
  1068. true_resp    moveq    #0,d0            ;set Z flag accordingly
  1069.     bra.s    end_AskYesNo
  1070. false_resp    moveq    #1,d0
  1071. end_AskYesNo    movem.l    (sp)+,d0/d1/d2/d3/a0/a1/a2/a3/a6
  1072.     rts
  1073.  
  1074. *******************************************************************************
  1075. *
  1076. *  WrtIOInfo........Write copyright and ordering info.
  1077. *
  1078. *******************************************************************************
  1079.  
  1080. WrtIOInfo    move.l    a0,-(sp)
  1081.     lea    IOInfo,a0
  1082.     jsr    CStrout
  1083.     jsr    NewLine
  1084.     move.l    (sp)+,a0
  1085.     rts
  1086.  
  1087. *******************************************************************************
  1088. *
  1089. *  IsWindow.........Determine if there is a window to write into.  This
  1090. *                   routine will try to open a window if one is not already
  1091. *                   open.
  1092. *
  1093. *  output:
  1094. *    D0.L: 0L if error, else -1L.
  1095. *
  1096. *******************************************************************************
  1097.  
  1098. IsWindow    tst.l    IOPackWindow
  1099.     bne.s    win_open
  1100.     move.l    a0,-(sp)
  1101.     lea    default_window_nm,a0
  1102.     jsr    MakeWindow
  1103.     move.l    (sp)+,a0
  1104.     rts
  1105. win_open    moveq    #-1,d0
  1106.     rts
  1107.  
  1108. CreatePort    CreatePortMac
  1109.  
  1110. DeletePort    DeletePortMac
  1111.  
  1112. CreateExtIO    CreateExtIOMac
  1113.  
  1114. DeleteExtIO    DeleteExtIOMac
  1115.  
  1116. * DC's
  1117.  
  1118. int_name        INTNAME
  1119. default_window_nm    dc.b    'Default Window',0
  1120. iopack_write_port    dc.b    'IOPack.write.port',0
  1121. iopack_read_port    dc.b    'IOPack.read.port',0
  1122. console_name    dc.b    'console.device',0
  1123. IOInfo    dc.b    'Copyright © 1991 Mark Thomas',13,10
  1124.     dc.b    'Released into the Public Domain',13,10
  1125.     dc.b    'Available at UT Austin (V1.04)',13,10
  1126.     dc.b    'from amigamat@ccwf.cc.utexas.edu',13,10,13,10
  1127.     dc.b    'Thanks to Beta-Testers:',13,10
  1128.     dc.b    'Paul Norrod and Robert Faulkner',0
  1129. clear_buf    dc.b    $1b,'[0;0H',$1b,'[J',0
  1130. delete_buf    dc.b    $08,$1b,'[P',0
  1131. newline_buf    dc.b    $0a,$0d,0
  1132. bold_buf    dc.b    $1b,'[1;30;31m',0
  1133. italic_buf    dc.b    $1b,'[3;30;31m',0
  1134. underline_buf    dc.b    $1b,'[4;30;31m',0
  1135. plain_buf        dc.b    $1b,'[0;30;31m',0
  1136. yes_str    dc.b    'YES',0
  1137. no_str    dc.b    'NO',0
  1138.  
  1139.     EVEN
  1140. Body_text    dc.b    0,1    ;frontpen, backpen
  1141.     dc.w    RP_JAM2    ;drawmode
  1142.     dc.w    10,5    ;left edge, top edge
  1143.     dc.l    0    ;text attr
  1144. Body_String    dc.l    0    ;string
  1145.     dc.l    0    ;next itext
  1146.  
  1147.     EVEN
  1148.  
  1149. Positive_text    dc.b    0,1    ;frontpen, backpen
  1150.     dc.w    RP_JAM2    ;drawmode
  1151.     dc.w    6,3    ;left edge, top edge
  1152.     dc.l    0    ;text attr
  1153.     dc.l    yes_str    ;string
  1154.     dc.l    0    ;next itext
  1155.  
  1156.     EVEN
  1157.  
  1158. Negative_text    dc.b    0,1    ;frontpen, backpen
  1159.     dc.w    RP_JAM2    ;drawmode
  1160.     dc.w    6,3    ;left edge, top edge
  1161.     dc.l    0    ;text attr
  1162.     dc.l    no_str    ;string
  1163.     dc.l    0    ;next itext
  1164.  
  1165. versiontag    dc.b    0,'$VER: IOPack 1.04 (13.6.91)',0
  1166.  
  1167. * DS's
  1168.  
  1169.     SECTION    "iopack.data",BSS
  1170.  
  1171.     EVEN
  1172.  
  1173. write_port    ds.l    1
  1174. read_port    ds.l    1
  1175. write_req    ds.l    1
  1176. read_req    ds.l    1
  1177. MyNewWindow    ds.b    nw_SIZE
  1178. SomeScreenDat    ds.b    sc_WBorTop
  1179. char_buf    ds.b    1
  1180. DecInBuf
  1181. DecInLongBuf
  1182. Stack    ds.b    STK_SIZE
  1183. StackEnd    ds.b    STK_SIZE
  1184. StackEnd2    ds.b    1
  1185. _ConBlock    ds.b    1
  1186.