* the 'Hello World' program in 68000 Assembler * the C version can be found in the Intuition manual * this source code (C) HiSoft 1992 All Rights Reserved * for Devpac Amiga Version 2 the following symbols were changed * to avoid clashes with the new include files: * Screen->MyScreen, NewScreen->MyNewScreen * Window->MyWindow, NewWindow->MyNewWindow opt c+,d+ include workbench:utilities/devpac/system use pre-assembled header include exec/exec_lib.i include intuition/intuition.i include intuition/intuition_lib.i include graphics/graphics_lib.i include graphics/text.i INTUITION_REV equ 31 v1.1 GRAPHICS_REV equ 31 v1.1 * Open the intuition library moveq #100,d4 default error return code moveq #INTUITION_REV,d0 version lea int_name(pc),a1 CALLEXEC OpenLibrary tst.l d0 beq exit_false if failed then quit move.l d0,_IntuitionBase else save the pointer moveq #GRAPHICS_REV,d0 lea graf_name(pc),a1 CALLEXEC OpenLibrary tst.l d0 ; beq exit_closeint if failed then close Int, exit move.l d0,_GfxBase lea MyNewScreen(pc),a0 CALLINT OpenScreen open a screen tst.l d0 ; beq exit_closeall if failed the close both, exit move.l d0,MyScreen move.l MyScreen,a0 lea sc_BitMap(a0),a0 lea bm_Planes(a0),a0 move.l #RAWSCRN,(a0) move.l #RAWSCRN+10240,4(a0) move.l #RAWSCRN+10240*2,8(a0) move.l #RAWSCRN+10240*3,12(a0) move.l #RAWSCRN+10240*4,16(a0) move.l #RAWSCRN+10240*5,20(a0) move.l #RAWSCRN+10240*6,24(a0) move.l #RAWSCRN+10240*7,28(a0) * now initialise a NewWindow structure. This is normally easier to * do with dc.w/dc.l statement etc, but for comparison with the C * version we do it like this lea MyNewWindow(pc),a0 good place to start move.w #20,nw_LeftEdge(a0) move.w #20,nw_TopEdge(a0) move.w #300,nw_Width(a0) move.w #100,nw_Height(a0) move.b #0,nw_DetailPen(a0) move.b #1,nw_BlockPen(a0) move.l #window_title,nw_Title(a0) _temp set WINDOWCLOSE!SMART_REFRESH!ACTIVATE!WINDOWSIZING move.l #_temp!WINDOWDRAG!WINDOWDEPTH,nw_Flags(a0) move.l #CLOSEWINDOW,nw_IDCMPFlags(a0) move.w #CUSTOMSCREEN,nw_Type(a0) clr.l nw_FirstGadget(a0) clr.l nw_CheckMark(a0) move.l MyScreen(pc),nw_Screen(a0) clr.l nw_BitMap(a0) move.w #100,nw_MinWidth(a0) move.w #25,nw_MinHeight(a0) move.w #640,nw_MaxWidth(a0) move.w #200,nw_MaxHeight(a0) * thats it set up, now open the window (a0=NewWindow already) ; CALLINT OpenWindow ; tst.l d0 ; beq exit_closescr if failed ; move.l d0,MyWindow save it ; ; move.l d0,a1 window ; move.l wd_RPort(a1),a1 rastport ; moveq #20,d0 X ; moveq #20,d1 Y ; CALLGRAF Move move the cursor ; ; move.l MyWindow(pc),a0 ; move.l wd_RPort(a0),a1 rastport ; lea hello_message(pc),a0 ; moveq #11,d0 ; CALLGRAF Text print something ; ; move.l MyWindow(pc),a0 ; move.l wd_UserPort(a0),a0 ; move.b MP_SIGBIT(a0),d1 (misprint in manual) ; moveq #0,d0 ; bset d1,d0 do a shift ; CALLEXEC Wait ; moveq #0,d4 return code * various exit routines that do tidying up, given a return code in d4 ; move.l MyWindow(pc),a0 ; CALLINT CloseWindow ;exit_closescr ; move.l MyScreen(pc),a0 ; CALLINT CloseScreen ;exit_closeall ; move.l _GfxBase(pc),a1 ; CALLEXEC CloseLibrary ;exit_closeint ; move.l _IntuitionBase(pc),a1 ; CALLEXEC CloseLibrary ;done: ; bra done move.l #PALETTEBIT,a0 move.l #COPIEDPAL+4,a1 move.w #255,d0 copydown: move.b 1(a0),(a1) move.b 3(a0),4(a1) move.b 5(a0),8(a1) add.w #6,a0 add.w #12,a1 dbra d0,copydown move.w #256,COPIEDPAL move.w #0,COPIEDPAL+2 LOOKFORME: move.l MyScreen,a0 lea sc_ViewPort(a0),a0 move.l #COPIEDPAL,a1 move.l _GfxBase,a6 jsr -$372(a6) loop: sub.w #1,FRAME bge.s .nofr move.w #4,FRAME add.w #50*4,FLIBBLE cmp.w #50*4*3,FLIBBLE blt .nofr move.w #0,FLIBBLE .nofr: move.l MyScreen,a4 move.w sc_MouseX(a4),d0 move.w sc_MouseY(a4),d1 btst #6,$bfe001 beq.s .hitspleen clr.b lastspleen bra.s .nospleen .hitspleen tst.b lastspleen bne.s .nospleen add.w #1,spleen st lastspleen cmp.w #2,spleen ble.s .nospleen move.w #0,spleen .nospleen: sub.w #160,d0 sub.w #128,d1 muls #48*2,d0 muls #48*2,d1 divs #160,d0 divs #128,d1 move.w d0,xmouse move.w d1,ymouse ; move.w spleen,d7 ; addq #1,d7 move.w #4,d7 LOOKHERE: move.l #willy,a0 move.w #-3,d0 move.w #6,d2 makebright move.w #-3,d1 move.w #6,d3 acbr: move.w d0,d5 move.w d1,d4 asl.w #4,d4 asl.w #4,d5 sub.w xmouse,d4 bge.s .okpos1 neg.w d4 .okpos1 sub.w ymouse,d5 bge.s .okpos2 neg.w d5 .okpos2: add.w d4,d5 ; distance ext.l d5 divs d7,d5 cmp.w #31,d5 ble.s .oksmall move.w #31,d5 .oksmall: move.w d5,(a0)+ addq #1,d1 dbra d3,acbr addq #1,d0 dbra d2,makebright move.l #Brights,a0 move.l #willy,a2 move.l #CMP,a1 move.l #PALS,a3 move.w #28,d0 makepals: move.w (a0)+,d1 move.w (a2,d1.w*2),d1 move.l (a1,d1.w*8),(a3)+ move.b #0,-4(a3) move.l 4(a1,d1.w*8),(a3)+ dbra d0,makepals move.l #PALS,a0 move.l #PTR,a1 adda.w FLIBBLE,a1 move.w spleen,d0 muls #50*4*3,d0 add.l d0,a1 move.l #WAD,a2 move.l FASTBUFFER,a4 move.w #127,d0 move.w #49,d1 move.w #320*2,d4 moveq #0,d3 across: move.w d0,d2 move.l a4,a3 move.l a2,a5 add.l (a1)+,a5 down: move.b (a5)+,d3 move.b (a0,d3.w),(a3) .black: add.w d4,a3 dbra d2,down addq #2,a4 dbra d1,across move.l FASTBUFFER,a0 move.l #RAWSCRN,a1 add.l #10+40*64,a1 move.l #(160/8)-1,d0 move.l #127,d1 move.w #(320-160)*2,d2 move.w #40-20,d3 donebigconv jsr CHUNKYTOPLANAR bra loop exit_false moveq #0,d4 move.l d4,d0 return code rts * the definition of the screen - note that in assembler you * MUST get the sizes of these fields correct, by consulting either * the RKM or the header files MyNewScreen dc.w 0,0 left, top dc.w 320,256 width, height dc.w 8 depth dc.b 0,1 pens dc.w 0 viewmodes dc.w CUSTOMSCREEN type dc.l MyFont font dc.l screen_title title dc.l 0 gadgets dc.l 0 bitmap * my font definition MyFont dc.l font_name dc.w TOPAZ_SIXTY dc.b FS_NORMAL dc.b FPF_ROMFONT * the variables _IntuitionBase dc.l 0 Intuition lib pointer _GfxBase dc.l 0 graphics lib pointer MyScreen dc.l 0 MyWindow dc.l 0 MyNewWindow ds.b nw_SIZE a buffer * some strings int_name INTNAME graf_name GRAFNAME hello_message dc.b 'Hello World' * these are C strings, so have to be null terminated screen_title dc.b 'My Own Screen',0 font_name dc.b 'topaz.font',0 window_title dc.b 'A Simple Window',0 even xmouse: dc.w 0 ymouse: dc.w 0 spleen: dc.w 0 lastspleen: dc.w 0 COPIEDPAL: dc.w 256,0 ds.l 3*256 ds.l 10 PALETTEBIT: ; incbin "256palette" ; dc.w $ffff,$fffe incbin "ab3:includes/256pal" CHUNKYTOPLANAR move.w d2,MODUL move.w d0,WTC move.w d1,HTC move.w d3,SCRMOD add.l #10240*7,a1 lea -10240(a1),a2 lea -10240(a2),a3 lea -10240(a3),a4 move.l a4,a5 sub.l #20480,a5 move.l a5,a6 sub.l #20480,a6 outconv: move.w WTC,d7 convlop: swap d7 move.l (a0)+,d0 move.w d0,d1 swap d0 move.l (a0)+,d2 move.w d2,d3 swap d2 move.l (a0)+,d4 move.w d4,d5 swap d4 move.w (a0)+,d6 move.w (a0)+,d7 add.w d0,d0 addx.w d0,d0 addx.w d1,d1 addx.w d0,d0 addx.w d2,d2 addx.w d0,d0 addx.w d3,d3 addx.w d0,d0 addx.w d4,d4 addx.w d0,d0 addx.w d5,d5 addx.w d0,d0 addx.w d6,d6 addx.w d0,d0 addx.w d7,d7 addx.w d0,d0 move.b d0,(a1)+ move.b d1,d0 add.w d1,d1 move.b d0,d1 addx.w d1,d1 addx.w d2,d2 addx.w d1,d1 addx.w d3,d3 addx.w d1,d1 addx.w d4,d4 addx.w d1,d1 addx.w d5,d5 addx.w d1,d1 addx.w d6,d6 addx.w d1,d1 addx.w d7,d7 addx.w d1,d1 move.b d1,(a2)+ move.w d2,d0 add.w d2,d2 move.b d0,d2 addx.w d2,d2 addx.w d3,d3 addx.w d2,d2 addx.w d4,d4 addx.w d2,d2 addx.w d5,d5 addx.w d2,d2 addx.w d6,d6 addx.w d2,d2 addx.w d7,d7 addx.w d2,d2 move.b d2,(a3)+ move.w d3,d0 add.w d3,d3 move.b d0,d3 addx.w d3,d3 addx.w d4,d4 addx.w d3,d3 addx.w d5,d5 addx.w d3,d3 addx.w d6,d6 addx.w d3,d3 addx.w d7,d7 addx.w d3,d3 move.b d3,(a4)+ move.b d4,d0 add.w d4,d4 move.b d0,d4 addx.w d4,d4 addx.w d5,d5 addx.w d4,d4 addx.w d6,d6 addx.w d4,d4 addx.w d7,d7 addx.w d4,d4 move.b d4,10240(a5) move.b d5,d0 add.w d5,d5 move.b d0,d5 addx.w d5,d5 addx.w d6,d6 addx.w d5,d5 addx.w d7,d7 addx.w d5,d5 move.b d5,(a5)+ move.b d6,d0 add.w d6,d6 move.b d0,d6 addx.w d6,d6 addx.w d7,d7 addx.w d6,d6 move.b d6,10240(a6) rol.w #1,d7 move.b d7,(a6)+ swap d7 dbra d7,convlop add.w MODUL,a0 move.w SCRMOD,d0 add.w d0,a1 add.w d0,a2 add.w d0,a3 add.w d0,a4 add.w d0,a5 add.w d0,a6 subq #1,HTC bgt outconv rts MODUL: dc.w 0 HTC: dc.w 0 WTC: dc.w 0 SCRMOD: dc.w 0 willy: ds.w 49 Brights: dc.w 3 dc.w 8,9,10,11,12 dc.w 15,16,17,18,19 dc.w 21,22,23,24,25,26,27 dc.w 29,30,31,32,33 dc.w 36,37,38,39,40 dc.w 45 ; dc.w AA,AA,AA,00,AA,AA,AA 0 ; dc.w AA,01,02,03,04,05,AA 7 ; dc.w AA,06,07,08,09,10,AA 14 ; dc.w 11,12,13,14,15,16,17 21 ; dc.w AA,18,19,20,21,22,AA 28 ; dc.w AA,23,24,25,26,27,AA 35 ; dc.w AA,AA,AA,28,AA,AA,AA 42 PALS: ds.l 2*49 FRAME: dc.w 4 FLIBBLE: dc.w 0 FASTBUFFER: dc.l fasty fasty: ds.w 320*256 WAD: incbin "ab3:hqn/priest.wad" PTR: incbin "ab3:hqn/priest.ptr" CMP: incbin "ab3:hqn/priest.256pal" SECTION BGDROP,code_c RAWSCRN: ds.l 2560*8