Apple2000/src/OpenClose.s

1494 lines
37 KiB
ArmAsm
Raw Blame History

SECTION APPLEII,CODE
EVEN
**************** OPEN EVERYTHING *******************
OpenAll move.l a0,StartA0 ;Command line info...
move.l d0,StartD0
move.l #VarList,a0 ;clear val's for resident run!
move.l #EndVarList,a1
moveq.l #0,d0
.loop move.l d0,(a0)+
cmp.l a1,a0
blo.b .loop
CALLEXEC CacheClearU ;stop crashing after recompile?
lea dosname,a1 ;Open DOS Library!
moveq #0,d0
CALLEXEC OpenLibrary
move.l d0,_DOSBase
beq exit ;cant print, so exit
CALLDOS Output ;and get channel for console
move.l d0,MyChannel
beq exit ;no channel? WB?
move.l 4.w,a6 ;check for at least 68020 status!
move.w AttnFlags(a6),d0
btst.l #1,d0
bne.b .020
jmp Fail020
.020 lea grafname,a1 ;open Graphics Lib!
moveq.l #0,d0
CALLEXEC OpenLibrary
move.l d0,_GfxBase
beq fail
lea intname,a1 ;open Intuition Lib!
moveq #0,d0
CALLEXEC OpenLibrary
move.l d0,_IntuitionBase
beq fail
lea reqname,a1 ;open reqtools lib!
moveq #0,d0
CALLEXEC OpenLibrary
move.l d0,_REQBase
beq fail
lea potgoname,a1 ;open "potgo.resource" lib, no need to close...
CALLEXEC OpenResource
move.l d0,_PotgoBase
beq fail
;Set up for Joystick 2nd button...
move.l #$c000,d0 ;we want bits #14 & bit #15... (DATRY & OUTRY)
CALLPOTGO AllocPotBits
move.l d0,PotBits
move.l #$c000,d0
move.l PotBits,d1 ;mask
CALLPOTGO WritePotgo ;set output lines hi to read joy 2nd btn...
move.l #InstLookUpTableMem,InstTbl_Var ;alloc 256k ram!+4 bytes for inst lookup!!!
move.l #HiResDrawTableMem,HiResDrawTbl ;alloc 64k hires draw tbl lookup!!!
move.l #DiskBufferMem,disk_Buffer ;alloc 215K ram for disk buffer
move.l disk_Buffer,disk_TkStrt
move.l #RT_REQINFO,d0 ;alloc RT_REQINFO structure...
move.l #0,a0
CALLREQ rtAllocRequestA
move.l d0,EasyReq
beq exit ;(failed)
move.l #RT_FILEREQ,d0 ;alloc RT_FILEREQ structure...
move.l #0,a0
CALLREQ rtAllocRequestA
move.l d0,FileReq
beq exit ;(failed)
move.l FileReq,a1
lea .TagLst,a0
CALLREQ rtChangeReqAttrA
lea .StartBody,a1
lea .StartGadg,a2
move.l EasyReq,a3
move.l #0,a4
lea .StartTag,a0
CALLREQ rtEZRequestA
bra .nxt
.Pat dc.b "(#?.disk|#?.prog|#?>)",0
.TagLst dc.l RTFI_MatchPat,.Pat,TAG_DONE
.StartBody dc.b "******* APPLE 2000 v1.3 *******",10,10
IIF DEBUG dc.b "***DEBUGGING***",10
dc.b "The Premier Apple II emulator",10
dc.b "Copyright <EFBFBD> 1994 by Kevin Kralian",10,10
dc.b "(No, this is not part of the Emplant",10
dc.b "package as many have been led to believe.)",0
.StartGadg dc.b "_Ok",0
.StartTag dc.l RT_ReqPos,REQPOS_TOPLEFTSCR,RT_Underscore,'_'
dc.l RTEZ_Flags,EZREQF_NORETURNKEY!EZREQF_LAMIGAQUAL!EZREQF_CENTERTEXT
dc.l TAG_DONE
dc.b "NOTICE: Although this program is distributed as Freeware, "
dc.b "copyright laws & protection still apply. "
dc.b "As such, *any* infringement upon this code, especially as applied "
dc.b "towards other 6502 or Apple II emulations will be rigorously "
dc.b "pursued via legal channels. -Kevin Kralian",0,0,0
EVEN
.nxt move.l #65545,d0 ;alloc 64k ram!+9 bytes (for PCount overflow)
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
CALLEXEC AllocMem
move.l d0,Mem_PtrVar
beq fail
move.l d0,a0
move.l #$c100,d0
.FF move.b #$ff,(a0,d0.l) ;put FF's in slot Rom areas (so look empty)
addq.l #1,d0
cmp.l #$c800,d0
blo.b .FF
move.b #$81,(a0,$c020.l) ;Beyond Wolfenstein hangs w/o it
move.b #$81,(a0,$c060.l) ;Serpentine hangs w/o it
; move.b #$60,(a0,$c100.l) ;an RTS when attempts pr#1
; move.b #$60,(a0,$c300.l) ;an RTS when attempts pr#3
move.l #$7000,d0 ;alloc 28K for Rom & Ram banks
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
CALLEXEC AllocMem
move.l d0,Bank_PtrVar
beq fail
;----- Open & set up Con device... ----
move.l #IOSTD_SIZE,d0 ;alloc mem for IOStdReq...
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
CALLEXEC AllocMem
move.l d0,ConReq
beq fail
lea conname,a0
move.l #-1,d0
move.l ConReq,a1
move.l #0,d1
CALLEXEC OpenDevice
tst.l d0
bne fail ;0 is successful
move.l ConReq,a0
move.l IO_DEVICE(a0),_ConBase ;get vector base... (unlike libraries)
lea InputStrct,a0
move.b #IECLASS_RAWKEY,ie_Class(a0) ;set up static struct...
* Note: Passing args from Devpac supresses last $0A character (NL)... Debugger/Shell don't.
* Normally, a "-2" command is passed as length: 3, data: '-2' + $0a
cmp.l #2,StartD0 ;# of chars after filename... (inc. NL char)
blo.b .noArg
move.l StartA0,a0
cmp.w #'-2',(a0)+ ;is there a -2 option???
bne.b .noArg
cmp.l #2,StartD0
beq.b .SecondDrive ;no more chars... is "-2"
cmp.b #$0a,(a0)
beq.b .SecondDrive ;next char is NL char... is "-2"
cmp.b #' ',(a0)
beq.b .SecondDrive ;next char is Space... is "-2"
bra .noArg ;else NOT "-2"
.SecondDrive
lea .2ndmsg,a0 ;diagnostic "2nd drive" msg
jsr DB_String
move.l #disk_TrackLen*35,d0 ;alloc 215K ram for disk buffer
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
CALLEXEC AllocMem
move.l d0,disk_Buffer2
beq fail
bra .noArg
.2ndmsg dc.b "2nd drive option selected.",10,13,0
;DiskBufferMem ds.b disk_TrackLen*35 ;alloc 215K ram for disk buffer
*-----------------------------------------------------*
.noArg move.l #RomName,d1 ;Load Rom Image
move.l #MODE_OLDFILE,d2
CALLDOS Open
move.l d0,d4 ;temp
beq failrom
move.l d4,d1 ;file handle
move.l InstTbl_Var,d2 ;Load Image temporarily into InstTbl buffer
move.l #$3080,d3 ;read $3080 bytes ($d000-$ffff + $80 prodos hdr)
CALLDOS Read
move.l d4,d1 ;Done loading Rom Image
CALLDOS Close
move.l InstTbl_Var,a0
cmp.w #$0a47,(a0) ;first 2 bytes in ProDos header...
bne .NotProDos
cmp.b #$4c,2(a0) ;Third byte in ProDos header...
bne .NotProDos
.ProDos lea $80(a0),a0 ;Rom image begins $80 bytes later...
bra .DoIt
.NotProDos
cmp.w #$00d0,(a0) ;Dos 3.3 test (check is A$=$d000)
bne .NotDos3 ;if neither, assume raw image...
.Dos33 lea $4(a0),a0 ;Rom image begins after 4 byte header
.NotDos3 ;assume raw image, no header...
;a0 -> Rom Image
.DoIt move.l Mem_PtrVar,a1
lea (a1,$d000.l),a1 ;a1 -> $d000 in apple memory
move.l Bank_PtrVar,a2
lea (a2,$4000.l),a2 ;a2 -> Rom Buffer (backup)
move.l #$3000/4-1,d0
.CpyRom move.l (a0),(a1)+
move.l (a0)+,(a2)+
dbf d0,.CpyRom
*-----------------------------------------------------*
LoadDiskRom:
move.l #DiskRomName,d1 ;Load Disk Rom Image (If available)
move.l #MODE_OLDFILE,d2
CALLDOS Open
move.l d0,d4 ;temp
lea MyDiskRom,a0 ;if no file, copy MyDiskRom image instead...
beq .CopyMem
move.l d4,d1 ;file handle
move.l InstTbl_Var,d2 ;Load Image temporarily into InstTbl buffer
move.l #$0180,d3 ;read $180 bytes ($c600-$c6ff + $80 prodos hdr)
CALLDOS Read
move.l d4,d1 ;Done loading Disk Rom Image
CALLDOS Close
.CheckProDos
move.l InstTbl_Var,a0
cmp.w #$0a47,(a0) ;first 2 bytes in ProDos header...
bne .CheckDos33
cmp.b #$4c,2(a0) ;Third byte in ProDos header...
bne .CheckDos33
.ProDos lea $80(a0),a0 ;Rom image begins $80 bytes later...
bra .CopyMem
.CheckDos33
cmp.w #$00c6,(a0) ;Dos 3.3 test (check if A$=$c600)
bne .NotDos3 ;if neither, assume raw image...
.Dos33 lea $4(a0),a0 ;Rom image begins after 4 byte header
.NotDos3 ;assume raw image, no header...
.CopyMem: ;a0 -> Rom Image
move.l Mem_PtrVar,a1
lea (a1,$c600.l),a1 ;a1 -> $c600 in apple memory
move.l #$100/4-1,d0
.CpyR2 move.l (a0)+,(a1)+
dbf d0,.CpyR2
*-----------------------------------------------------*
lea MyNewScreen,a0 ;Open my screen!
CALLINT OpenScreen
move.l d0,MyScreen
beq fail
; move.l MyScreen,a0 ;Set main screen color table to WB defaults
; move.l sc_ViewPort+vp_ColorMap(a0),a2
; lea MainColorTable,a3
; move.l a2,a0
; moveq.l #0,d0
; CALLGRAF GetRGB4
; move.w d0,(a3)+
; move.l a2,a0
; moveq.l #1,d0
; CALLGRAF GetRGB4
; move.w d0,(a3)+
; move.l a2,a0
; moveq.l #2,d0
; CALLGRAF GetRGB4
; move.w d0,(a3)+
; move.l a2,a0
; moveq.l #3,d0
; CALLGRAF GetRGB4
; move.w d0,(a3)+
move.l MyScreen,a0
moveq.l #0,d0 ;We have to hide screen title bar so we can receive
CALLINT ShowTitle ;all mouse button clicks into our window...
*-----------------------------------------------------*
move.l MyScreen,a0
lea sc_BitMap(a0),a0 ;a1 -> Screen BitMap
move.l bm_Planes(a0),OrigPlane1 ;plug in BitMap Plane Ptrs
move.l bm_Planes+4(a0),OrigPlane2
move.l bm_Planes+8(a0),OrigPlane3
move.l bm_Planes+12(a0),OrigPlane4
move.l bm_Planes+16(a0),OrigPlane5
move.w bm_Rows(a0),OrigRows
move.b bm_Depth(a0),OrigDepth
*-----------------------------------------------------*
; CALLEXEC Forbid
;
; move.l MyScreen,a0 ;Show my new screen
; CALLINT ScreenToFront ;and help ourselves to view fields...
;
;* Compute screen refresh (hz) with following formula:
;*
;* 1 Line 1 Screen 1 CClk 1000000000 uSecs zz Screens
;* -------- * -------- * --------- * ---------------- = ----------
;* xx CClks yy Lines 280 uSecs 1 Second 1 second
;
; moveq.l #0,d4
; move.l _GfxBase,a0
; move.w gb_current_tot_cclks(a0),d4 ;d4 = CurrentTotColorClks (1 clk=280 uSec)
; moveq.l #0,d5
; move.w gb_MaxDisplayRow(a0),d5 ;d5 = Current Tot Rows
;
; mulu.w #280,d5 ;*** Compute FrameRate (Hz) ***
; mulu.l d4,d5 ;Hertz = 1,000,000,000/(CClks*TotRow*280)
; move.l #1000000000,d0
; divu.l d5,d0 ;d0 = hertz
;
; move.l #1026000,d1 ;Apple cycles/frame = 1,024,000 / Hz (+some)
; divu.l d0,d1 ;d1 = Apple CyclesPer Frame!
;
; move.l d1,RealCycPerFrame
; jsr DB_HexL
;
; CALLEXEC Permit
*--------------------------- Open CIA Timer & setup --------------------------*
CIASetUp:
move.l #-1,CIAAllocBit
lea ciaBname,a1 ;Open CIA-B Resource...
CALLEXEC OpenResource
move.l d0,_CIABase
beq fail ;should *never* fail!
; We attempt opening either CIA timer with the VBlankInterrupt server, because
; some int server is needed in case it gets called! VBlank server wont hurt anything.
.tryB move.l #VBlankIntServer,a1 ;Can we allocate timer B?
move.l #CIAICRB_TB,d0
move.l _CIABase,a6
jsr _LVOAddICRVector(a6)
tst.l d0
bne .tryA
move.l #$bfd600,CIATimerLo ;set up all TimerA addresses
move.l #$bfd700,CIATimerHi
move.l #$bfdf00,CIAControlReg
move.l #CIAICRB_TB,CIAAllocBit ;we NEED this to de-alloc later
moveq.b #%00000010,d0 ;to clear timer A intrpt
bra .gotCIA
.tryA move.l #VBlankIntServer,a1 ;Can we allocate timer A?
move.l #CIAICRB_TA,d0
move.l _CIABase,a6
jsr _LVOAddICRVector(a6)
tst.l d0
bne .failCIA
move.l #$bfd400,CIATimerLo ;set up all TimerA addresses
move.l #$bfd500,CIATimerHi
move.l #$bfde00,CIAControlReg
move.l #CIAICRB_TA,CIAAllocBit
moveq.b #%00000001,d0 ;to clear timer A intrpt
bra .gotCIA
.failCIA
move.l MyChannel,d1
move.l #FailCIAMsg,d2
move.l #EndFailCIAMsg-FailCIAMsg,d3
CALLDOS Write
bra exit
.gotCIA
move.l _CIABase,a6 ;and disable ICR interrupts for timer
jsr _LVOAbleICR(a6)
move.b ([CIAControlReg.l]),d0
or.b #%00001000,d0 ;one-shot
and.b #%11011101,d0 ;Cnt 02 pulses, PB6 normal (no extrnl output)
move.b d0,([CIAControlReg.l])
TIME EQU 96 ;microSecs (PAL & NTSC)
move.b #(TIME&$ff),([CIATimerLo.l])
move.b #(TIME>>8),([CIATimerHi.l])
*-----------------------------------------------------*
LINES equ 200
move.w #320,d0 ;Get -4- Gr1 BitPlanes (320*193)
move.w #LINES*4,d1
CALLGRAF AllocRaster
move.l d0,Gr1_Planes
beq fail
move.l Gr1_Planes,a1 ;And Clear them!
move.l #40*LINES*4,d0 ;320/8*193*4
clr.l d1 ; 7720 byte offset to each plane!
CALLGRAF BltClear
move.w #320,d0 ;Get -4- Gr2 BitPlanes (320*193)
move.w #LINES*4,d1
CALLGRAF AllocRaster
move.l d0,Gr2_Planes
beq fail
move.l Gr2_Planes,a1 ;And Clear them!
move.l #40*LINES*4,d0 ;320/8*193*4
clr.l d1
CALLGRAF BltClear
move.w #320,d0 ;Get -3- Hgr1 BitPlanes (320*193)
move.w #LINES*3,d1
CALLGRAF AllocRaster
move.l d0,Hgr1_Planes
beq fail
move.l Hgr1_Planes,a1 ;And Clear them!
move.l #40*LINES*3,d0 ;320/8*193*3
clr.l d1
CALLGRAF BltClear
move.w #320,d0 ;Get -3- Hgr2 BitPlanes (320*193)
move.w #LINES*3,d1
CALLGRAF AllocRaster
move.l d0,Hgr2_Planes
beq fail
move.l Hgr2_Planes,a1 ;And Clear them!
move.l #40*LINES*3,d0 ;320/8*193*3
clr.l d1
CALLGRAF BltClear
move.w #320,d0 ;Get -1- "BackDrop" BitPlane (320*193)
move.w #LINES,d1
CALLGRAF AllocRaster
move.l d0,BackDrop_Plane
beq fail
move.l BackDrop_Plane,a0 ;and completely fill it!
move.l #$ffffffff,d0
move.w #192*40/4-1,d1
.fill move.l d0,(a0)+
dbf d1,.fill
moveq.l #0,d0
move.w #(LINES-192)*40/4-1,d1
.fill2 move.l d0,(a0)+
dbf d1,.fill2
lea MyNewWindow,a0 ;Open my window!
move.l MyScreen,nw_Screen(a0) ;(into my screen)
CALLINT OpenWindow
move.l d0,MyWindow
beq fail
move.l MyWindow,a0
move.l wd_RPort(a0),WinRastPort
move.l WinRastPort,a1
moveq.l #1,d0 ;---------------------
CALLGRAF SetAPen
move.l WinRastPort,a1
moveq.l #1,d0
CALLGRAF SetBPen
move.l WinRastPort,a1 ;BLUE BACKGROUND TO FAKE TITLE BAR...
move.w #0,d0
move.w #0,d1
move.w #320,d2
move.w #10,d3
CALLGRAF RectFill
move.l WinRastPort,a1
moveq.l #2,d0
CALLGRAF SetAPen
bra .skip
.Msg dc.b "APPLE 2000 " ;extra 2 spaces to center it to "APPLE ]["
.MsgLen dc.w .MsgLen-.Msg
.skip move.l WinRastPort,a1
lea .Msg,a0
move.w .MsgLen,d0
CALLGRAF TextLength
move.l WinRastPort,a1
lsr.w d0 ; / 2
neg.w d0 ; -d0
add.w #320/2,d0 ;X pos to center string
move.w #7,d1
CALLGRAF Move
move.l WinRastPort,a1
lea .Msg,a0
move.w .MsgLen,d0
CALLGRAF Text
lea StartMsg,a0
jsr DB_String
.Sprite move.l MyWindow,a0 ;redefine sprite?
lea SpriteImage,a1
move.l #4,d0 ;height
move.l #16,d1 ;width
moveq.l #0,d2
moveq.l #0,d3
CALLINT SetPointer
bra .skip2
even
.skip2
****************** Create HiRes Draw Lookup Table **********************
* Use a 14 bit counter to create a 2 plane response (9 bits each in
* separate words). Table will be indexed via a 14 bit index (scaled by 4),
* and return a LONG with the 1st 9 bits of plane info in the low order
* bits of the low word, and the 2nd 9 bits of plane info in the low order
* bits of the high word (accessibly via a SWAP).
*
* The 14 bits used as an index consist of 11 pixel bits, and 3 "color" bits.
* They are NOT in a very useful or logical order, this routine is made
* so these bit locations are defined.
*
* screen/pixel order: (not actual bit order)
*
* A B C11 - ColorSet Bit
* 12 3456789 01 - Pixel Data
*
* Rules:
* Any pixel 10 (even only) forms a green pixel (plane 1)
* Any pixel 01 (even only) forms a purple pixel (plane 2)
* Green plane saturates single 0 bits between 1 bits (ie: 10101 = 11111)
* Purple plane saturates single 0 bits between 1 bits
* Saturation does NOT apply on color bits at byte edges (pixel 2,3,9,10)
* where A != B or B != C (black or white okay though)
* Any 11 (anywhere) bit pairs form WHITE (both planes on)
* Extreme bits (pixel 1 in byte A & pixel 2 byte C) are discarded...
;as reference... xxxx xxxx xxxx xxxx xxA6 5B65 4321 0C10
; ^ ^ ^ ^
;for equates, p1 -> p11 is pixel bit # (#0 -> #31) (left->Right as apple maps)
; c1, c2, c3 = Color bit for byte 1,2, &3
p1 equ 11
p2 equ 12
p3 equ 3
p4 equ 4
p5 equ 5
p6 equ 6
p7 equ 7
p8 equ 8
p9 equ 9
p10 equ 0
p11 equ 1
c1 equ 13
c2 equ 10
c3 equ 2
;d2 = 14 bit counter, d3 = Plane1 (grn), d4= Plane2 (prp)
; d5 = Pl1 Saturatd, d6= Pl2 Saturatd
;d7 = Pixel data in visual order... (bits 10 -> 0)
;a2 = address to write next entry to...
move.l HiResDrawTbl,a2
moveq.l #0,d2
BuildHiResTbl:
moveq.l #0,d3
moveq.l #0,d4 ;clear planes... set as needed...
* First build normal PIXEL data in visual order... *
* ie: d7 = %0000 0xxx xxxx xxxx
.build moveq.l #0,d7
.p1 btst.l #p1,d2
beq .p2
bset #10,d7
.p2 btst.l #p2,d2
beq .p3
bset #9,d7
.p3 btst.l #p3,d2
beq .p4
bset #8,d7
.p4 btst.l #p4,d2
beq .p5
bset #7,d7
.p5 btst.l #p5,d2
beq .p6
bset #6,d7
.p6 btst.l #p6,d2
beq .p7
bset #5,d7
.p7 btst.l #p7,d2
beq .p8
bset #4,d7
.p8 btst.l #p8,d2
beq .p9
bset #3,d7
.p9 btst.l #p9,d2
beq .p10
bset #2,d7
.p10 btst.l #p10,d2
beq .p11
bset #1,d7
.p11 btst.l #p11,d2
beq .Plane1
bset #0,d7
.Plane1 move.l #%10101010101,d3
and.l d7,d3 ;only green bits in here...
.Plane2 move.l #%01010101010,d4
and.l d7,d4 ;only purple bits here...
.Sat1 move.l d3,d0 ;start = 001010010100
move.l d3,d5
lsl.l #1,d0 ; 010100101000 (left shifted)
lsr.l #1,d5 ; AND 000101001010 (right shifted)
; --------------
and.l d0,d5 ; 000100001000 (Saturation Bits
; to be OR'd later)
.Sat2 move.l d4,d0
move.l d4,d6
lsl.l #1,d0
lsr.l #1,d6
and.l d0,d6 ; (Saturation bits for Pl2 to be OR'd
; later with Unsaturated Plane2 info)
c1_vs_c2:
btst.l #c1,d2 ;Chk c1 HiBit...
beq .c1Lo
.c1Hi btst.l #c2,d2 ;c1 Hi, chk c2 Bit...
bne c2_vs_c3 ;c1 & c2 Hi, no worries here...
bclr.l #8,d5 ;c1 != c2, different color bits so
bclr.l #9,d5 ; don't saturate between bytes!
bclr.l #8,d6
bclr.l #9,d6
bra c2_vs_c3
.c1Lo btst.l #c2,d2 ;c1 Lo, chk c2...
beq c2_vs_c3 ;c1 & c2 Lo, no worries...
bclr.l #8,d5
bclr.l #9,d5
bclr.l #8,d6
bclr.l #9,d6
c2_vs_c3:
btst.l #c2,d2 ;chk c2...
beq .c2Lo
.c2Hi btst.l #c3,d2 ;c2 Hi, chk c3...
bne doneCvs ;c2 & c3 Hi, no worries...
bclr.l #1,d5
bclr.l #2,d5
bclr.l #1,d6
bclr.l #2,d6
bra doneCvs
.c2Lo btst.l #c3,d2 ;c2 Lo, chk c3...
beq doneCvs
bclr.l #1,d5
bclr.l #2,d5
bclr.l #1,d6
bclr.l #2,d6
doneCvs or.l d5,d3 ;take (filtered) saturation bits & insert...
or.l d6,d4 ; ""
* remember, d7 = %0000 0xxx xxxx xxxx
.White moveq.l #0,d1 ;ignore c1->c3, look for "11" bits combos
move.l d7,d0
and.w #%11000000000,d0
cmp.w #%11000000000,d0
bne .wh2
or.w #%11000000000,d1 ;build white bits in D1...
.wh2 move.l d7,d0
and.w #%01100000000,d0
cmp.w #%01100000000,d0
bne .wh3
or.w #%01100000000,d1
.wh3 move.l d7,d0
and.w #%00110000000,d0
cmp.w #%00110000000,d0
bne .wh4
or.w #%00110000000,d1
.wh4 move.l d7,d0
and.w #%00011000000,d0
cmp.w #%00011000000,d0
bne .wh5
or.w #%00011000000,d1
.wh5 move.l d7,d0
and.w #%00001100000,d0
cmp.w #%00001100000,d0
bne .wh6
or.w #%00001100000,d1
.wh6 move.l d7,d0
and.w #%00000110000,d0
cmp.w #%00000110000,d0
bne .wh7
or.w #%00000110000,d1
.wh7 move.l d7,d0
and.w #%00000011000,d0
cmp.w #%00000011000,d0
bne .wh8
or.w #%00000011000,d1
.wh8 move.l d7,d0
and.w #%00000001100,d0
cmp.w #%00000001100,d0
bne .wh9
or.w #%00000001100,d1
.wh9 move.l d7,d0
and.w #%00000000110,d0
cmp.w #%00000000110,d0
bne .wh10
or.w #%00000000110,d1
.wh10 move.l d7,d0
and.w #%00000000011,d0
cmp.w #%00000000011,d0
bne .doneWhite
or.w #%00000000011,d1
.doneWhite:
or.w d1,d3
or.w d1,d4 ;OR white bits to both planes...
lsr.w #1,d3
lsr.w #1,d4 ;eliminate last bit on each...
and.w #%111111111,d3
and.w #%111111111,d4 ;only want these 9 bits!
move.w d3,(a2)+ ;1st word in table...
move.w d4,(a2)+ ;2nd word in table... !
addq.w #1,d2
cmp.w #16384,d2 ;0 -> 16383 (16384 entries for 14 bit indx)
blo BuildHiResTbl
.DoneHGRTable
move.l MyWindow,a0
CALLINT ActivateWindow
**************************** Init INTrpt servers **********************
move.l #INTB_VERTB,d0
lea VBlankIntServer,a1
CALLEXEC AddIntServer
move.w #1,VBlankIntActive
**************************** Init & Start 6502 emulation as subtask! ***************
move.l #-1,d0
CALLEXEC AllocSignal
move.l d0,ParentSigBit
bmi fail ;or for byte?should never fail anyways...
moveq.l #0,d1
bset d0,d1
move.l d1,ParentSigMask
move.l #0,a1 ;Find Parent TaskPtr for signalling later...
CALLEXEC FindTask
move.l d0,ParentTaskPtr
move.l #8192,d0 ;alloc 8k ram for SubTask Stack...
move.l #MEMF_CLEAR,d1
CALLEXEC AllocMem
move.l d0,MySubStack
beq fail
move.l #TC_SIZE,d0 ;alloc task control structure
move.l #MEMF_PUBLIC!MEMF_CLEAR,d1
CALLEXEC AllocMem
move.l d0,MySubTask
beq fail
move.l MySubTask,a0 ;init Task Cntl Struct (priority set -1)
move.b #NT_TASK,LN_TYPE(a0)
move.l #SubTaskName,LN_NAME(a0)
move.b #-1,LN_PRI(a0) ;Must be low Pri since hogs CPU...!
move.l MySubStack,TC_SPLOWER(a0) ;start of stack...
move.l MySubStack,a1
lea 8188(a1),a1 ;4 bytes less than top of stack.. ?
move.l a1,TC_SPUPPER(a0)
move.l a1,TC_SPREG(a0)
move.l a0,a1 ;Task Control struct...
move.l #Start6502,a2 ;PC beginning
move.l #0,a3 ;Finalize code... (shouldn't quit!)
CALLEXEC AddTask ;start the 6502 module!!!
move.l ParentSigMask,d0
CALLEXEC Wait ;Wait until 6502 task is initialized...
jmp Main ;Main program!!!!!
***************** VBlank-INT server **********************
CNOP 0,4
VBlankServerCode:
move.w $dff014.l,PotPosition ;Read Joystick X/Y positions
move.l PotBits,d1 ;mask
btst.l #0,d1 ;is the start bit owned?
beq.b .done
move.l #$1,d0 ;Yes, then restart counters...
CALLPOTGO WritePotgo
.done move.l #$dff000,a0
moveq.l #0,d0
rts
PotPosition dc.w 0
VBlankIntActive dc.w 0 ;boolean- is this intrpt installed?
PotMinX dc.b 0 ;used for dynamic joystick range setting...
PotMaxX dc.b 0
PotMinY dc.b 0
PotMaxY dc.b 0
PdlMode dc.b 0 ;boolean, TRUE if Paddle, FALSE if Analog Joystick
EVEN
;---------- and Static Structure -----------
VBlankIntServer dc.l 0,0 ;STATIC Interrupt-Server Struct
dc.b NT_INTERRUPT
dc.b 15
dc.l .name
dc.l 0 ;IS_Data
dc.l VBlankServerCode
.name dc.b "Apple2000 VBlank Interrupt Server",0
EVEN
*************** Some Copper SetUp Subs ********************
*
* SetCop- Does a CMove & CBump, no need to re-load CopperPtr every time...
* Enter: a3= CopperList, d3 = Register, d4 (word)= Data
SetCop move.l a3,a1 ;cop ptr
move.l d3,d0 ;register
move.w d4,d1 ;data
CALLGRAF CMove
move.l a3,a1 ;cop ptr
CALLGRAF CBump
rts
dc.b "Apple 2000, Copyright 1994 by Kevin Kralian",0
even
*************** Do "turn off screen" Effect! ********************
FadeEffect:
move.l MyScreen,a0 ;*** restore orig screen ptrs ***
lea sc_BitMap(a0),a0 ;a1 -> Screen BitMap
move.l OrigPlane1,bm_Planes(a0) ;plug in BitMap Plane Ptrs
move.l OrigPlane2,bm_Planes+4(a0)
move.l OrigPlane3,bm_Planes+8(a0)
move.l OrigPlane4,bm_Planes+12(a0)
move.l OrigPlane5,bm_Planes+16(a0)
move.w OrigRows,bm_Rows(a0)
move.b OrigDepth,bm_Depth(a0)
.Sprite move.l MyWindow,a0 ;setup an invisible sprite!
lea SpriteImage,a1
move.l #4,d0 ;height
move.l #16,d1 ;width
moveq.l #0,d2
moveq.l #0,d3
CALLINT SetPointer
move.l MyScreen,a0 ;Rebuild local VPort copper list (but not display)
CALLINT MakeScreen
CALLINT RethinkDisplay ;and update screen!
lea .OffClr,a5
move.l a5,a1 ;a1 -> ColorList
move.l MyScreen,a0 ;Set Colors... (IF NEEDED!)
lea sc_ViewPort(a0),a0 ;a0 -> Screen ViewPort
move.w #4,d0 ;d0 = # of colors
CALLGRAF LoadRGB4 ;(takes effect immed, but doesn't ReThink display)
move.l MyWindow,a0
move.l wd_RPort(a0),.Rp
move.l .Rp,a1 ;*** Draw 4 concentric rectangles ***
moveq.l #0,d0
CALLGRAF SetAPen
move.l .Rp,a1
move.w #0,d0
move.w #0,d1
move.w #319,d2
move.w #199,d3
CALLGRAF RectFill
move.l .Rp,a1
moveq.l #1,d0
CALLGRAF SetAPen
move.l .Rp,a1
move.w #50,d0
move.w #35,d1
move.w #319-50,d2
move.w #199-35,d3
CALLGRAF RectFill
move.l .Rp,a1
moveq.l #2,d0
CALLGRAF SetAPen
move.l .Rp,a1
move.w #100,d0
move.w #70,d1
move.w #319-100,d2
move.w #199-70,d3
CALLGRAF RectFill
move.l .Rp,a1
moveq.l #3,d0
CALLGRAF SetAPen
move.l .Rp,a1
move.w #158,d0
move.w #98,d1
move.w #161,d2
move.w #101,d3
CALLGRAF RectFill ;Done rectangles
.lp lea 8(a5),a5
tst.w (a5)
bmi.b .done
move.l MyScreen,a0 ;Set Colors... (IF NEEDED!)
lea sc_ViewPort(a0),a0 ;a0 -> Screen ViewPort
move.w #4,d0 ;d0 = # of colors
move.l a5,a1 ;a1 -> ColorList
CALLGRAF LoadRGB4 ;(takes effect immed, but doesn't ReThink display)
CALLGRAF WaitTOF
CALLGRAF WaitTOF
CALLGRAF WaitTOF
bra.b .lp
.done rts
.OffClr dc.w $0eee,$0eee,$0eee,$0eee ;color list for "turn off monitor" effect
dc.w $0eee,$0eee,$0eee,$0eee
dc.w $0eee,$0eee,$0eee,$0eee
dc.w $0eee,$0eee,$0eee,$0eee
dc.w $0eee,$0eee,$0eee,$0eee
dc.w $0000,$0eee,$0eee,$0eee
dc.w $0000,$0000,$0eee,$0eee
dc.w $0000,$0000,$0000,$0eee
dc.w $0000,$0000,$0000,$0eee
dc.w $0000,$0000,$0000,$0fff
dc.w $0000,$0000,$0000,$0fff
dc.w $0000,$0000,$0000,$0ddd
dc.w $0000,$0000,$0000,$0eee
dc.w $0000,$0000,$0000,$0ede
dc.w $0000,$0000,$0000,$0ede
dc.w $0000,$0000,$0000,$0ece
dc.w $0000,$0000,$0000,$0ece
dc.w $0000,$0000,$0000,$0dce
dc.w $0000,$0000,$0000,$0cce
dc.w $0000,$0000,$0000,$0cde
dc.w $0000,$0000,$0000,$0dde
dc.w $0000,$0000,$0000,$0eee
dc.w $0000,$0000,$0000,$0ddd
dc.w $0000,$0000,$0000,$0ccc
dc.w $0000,$0000,$0000,$0ddd
dc.w $0000,$0000,$0000,$0ccc
dc.w $0000,$0000,$0000,$0bbb
dc.w $0000,$0000,$0000,$0aaa
dc.w $0000,$0000,$0000,$0999
dc.w $0000,$0000,$0000,$0888
dc.w $0000,$0000,$0000,$0777
dc.w $0000,$0000,$0000,$0666
dc.w $0000,$0000,$0000,$0555
dc.w $0000,$0000,$0000,$0444
dc.w $0000,$0000,$0000,$0333
dc.w $0000,$0000,$0000,$0222
dc.w $0000,$0000,$0000,$0222
dc.w $0000,$0000,$0000,$0111
dc.w $0000,$0000,$0000,$0000
dc.w $0000,$0000,$0000,$0000
dc.w $0000,$0000,$0000,$0000
dc.w $0000,$0000,$0000,$0000
dc.w -1
.Rp dc.l 0 ;windows RastPort
even
***************** NOW CLOSE EVERYTHING *****************
failLoad move.l MyChannel,d1
move.l #NoFileMsg,d2
move.l #EndNoFileMsg-NoFileMsg,d3
CALLDOS Write
bra exit
Fail020 move.l MyChannel,d1
move.l #Fail020Msg,d2
move.l #EndFail020Msg-Fail020Msg,d3
CALLDOS Write
bra exit
failrom move.l MyChannel,d1
move.l #NoRomMsg,d2
move.l #EndNoRomMsg-NoRomMsg,d3
CALLDOS Write
; bra fail
fail move.l MyChannel,d1 ;Error exit!
move.l #FailMsg,d2
move.l #EndFailMsg-FailMsg,d3
CALLDOS Write
;Clean exit...
exit:
.VBInt tst.w VBlankIntActive
beq.b .sub
move.l #INTB_VERTB,d0 ;remove VBlank int server...
lea VBlankIntServer,a1
CALLEXEC RemIntServer
move.w #0,VBlankIntActive
.sub tst.l MySubTask ;free subtask mem...
beq.b .mss
move.l MySubTask,a1
move.l #TC_SIZE,d0
CALLEXEC FreeMem
.mss tst.l MySubStack ;free SubTask's Stack mem...
beq.b .EReq
move.l MySubStack,a1
move.l #8192,d0
CALLEXEC FreeMem
.EReq tst.l EasyReq
beq.b .FReq
move.l EasyReq,a1
CALLREQ rtFreeRequest ;okay to pass NULL...
.FReq tst.l FileReq
beq.b .Tmr
move.l FileReq,a1
CALLREQ rtFreeRequest
.Tmr
.IORq tst.l ConReq ;close device...
beq.b .Amem
move.l ConReq,a1
CALLEXEC CloseDevice
.IORq2 move.l ConReq,a1
move.l #IOSTD_SIZE,d0 ;& free mem for IOStdReq.
CALLEXEC FreeMem
.Amem tst.l Mem_PtrVar ;free Apple mem image
beq.b .BnkMem
move.l Mem_PtrVar,a1
move.l #65545,d0
CALLEXEC FreeMem
.BnkMem tst.l Bank_PtrVar ;Free Rom & Ram banks
beq.b .timer
move.l Bank_PtrVar,a1
move.l #$7000,d0
CALLEXEC FreeMem
.timer move.l CIAAllocBit,d0 ;timer 'x'
bmi.b .hires
move.l #VBlankIntServer,a1 ;Deallocate CIA intrpt
move.l _CIABase,a6
jsr _LVORemICRVector(a6)
clr.l CIAAllocBit
.hires
; tst.l HiResDrawTbl ;free 64k hires draw lookup tbl...
; beq .disk
; move.l HiResDrawTbl,a1
; move.l #65536,d0
; CALLEXEC FreeMem
.disk tst.l disk_Buffer2 ;free disk buffer
beq.b .InsTbl
move.l disk_Buffer2,a1
move.l #disk_TrackLen*35,d0
CALLEXEC FreeMem
.InsTbl ;its a static buffer now
.win tst.l MyWindow ;close window if open
beq.b .scrn1
move.l MyWindow,a0
CALLINT CloseWindow
.scrn1 tst.l MyScreen ;close screen if open
beq.b .BkDp
move.l MyScreen,a0
CALLINT CloseScreen
.BkDp tst.l BackDrop_Plane ;Close Bkdrop Bitplanes if exists
beq.b .txt2pl
move.l BackDrop_Plane,a0
move.w #320,d0
move.w #LINES,d1
CALLGRAF FreeRaster
.txt2pl
;removed text2 planes...
.gr1pl tst.l Gr1_Planes ;Close Gr1 Bitplanes if exists
beq.b .gr2pl
move.l Gr1_Planes,a0
move.w #320,d0
move.w #LINES*4,d1
CALLGRAF FreeRaster
.gr2pl tst.l Gr2_Planes ;Close Gr2 Bitplanes if exists
beq.b .hgr1pl
move.l Gr2_Planes,a0
move.w #320,d0
move.w #LINES*4,d1
CALLGRAF FreeRaster
.hgr1pl tst.l Hgr1_Planes ;Close Hgr1 Bitplanes if exists
beq.b .hgr2pl
move.l Hgr1_Planes,a0
move.w #320,d0
move.w #LINES*3,d1
CALLGRAF FreeRaster
.hgr2pl tst.l Hgr2_Planes ;Close Hgr2 Bitplanes if exists
beq.b .hgrDpl
move.l Hgr2_Planes,a0
move.w #320,d0
move.w #LINES*3,d1
CALLGRAF FreeRaster
.hgrDpl
.temp
.FreBts tst.l PotBits ;if we have any still allocated...
beq.b .lib
move.l PotBits,d0 ;free potgo bits #8 & bit #9... (DATLX & OUTLX)
CALLPOTGO FreePotBits
clr.l PotBits
.lib tst.l _REQBase ;Close ReqTools.lib if open
beq.b 3$
move.l _REQBase,a1
CALLEXEC CloseLibrary
3$ tst.l _IntuitionBase ;Close IntuitionLib if open
beq.b 4$
move.l _IntuitionBase,a1
CALLEXEC CloseLibrary
4$ tst.l _GfxBase ;Close GfxLib if open
beq.b 6$
move.l _GfxBase,a1
CALLEXEC CloseLibrary
6$ tst.l _DOSBase ;Close DosLib if open
beq.b 7$
move.l _DOSBase,a1
CALLEXEC CloseLibrary
7$ rts
CNOP 0,4
*************************** System Pointers **********************
VarList:
_DOSBase dc.l 0 ;space for lib ptr
_GfxBase dc.l 0
_IntuitionBase dc.l 0
_REQBase dc.l 0 ;ptr for ReqTools lib...
_ConBase dc.l 0 ;from IOStdReq.io_Device after opening device...
_PotgoBase dc.l 0 ;resource, don't close it!
_CIABase dc.l 0 ;resource for CIA timers
PotBits dc.l 0 ;bits we allocated to read joystick btn #2
MyScreen dc.l 0
MyWindow dc.l 0
MyChannel dc.l 0
Mem_PtrVar dc.l 0 ;ptr to start of Apple Memory Block
Bank_PtrVar dc.l 0 ;ptr to block of Rom & Ram Banks
WinRastPort dc.l 0
InstTbl_Var dc.l 0 ;ptr to 256K JmpTbl of 6502 instructions
ConReq dc.l 0 ;ptr to IOStdReq for CON access
HiResDrawTbl dc.l 0 ;ptr to 64k lookup tbl for byte -> Plane data
***************************** Input stuff ***************************
EVEN
KeyBuffer ds.b 80
EVEN
InputStrct ds.b ie_SIZEOF ;actual structure!
CNOP 0,4
*************************** ReqTools variables *************************
EasyReq dc.l 0 ;ptr to my EasyRequester struct...
FileReq dc.l 0 ;ptr to my File Requester struct...
*************************** BitPlane Raster Pointers *************************
Gr1_Planes dc.l 0
Gr2_Planes dc.l 0
Hgr1_Planes dc.l 0
Hgr2_Planes dc.l 0
BackDrop_Plane dc.l 0
*************************** task & signal vars ***********************
MySubTask dc.l 0
MySubStack dc.l 0
ParentSigBit dc.l 0
ParentSigMask dc.l 0
ChildSigBit dc.l 0
ChildSigMask dc.l 0
ParentTaskPtr dc.l 0
********************** Disk drive interface variables ***********************
disk_Buffer dc.l 0 ;Ptr to 1st disk buffer ** 2 fields must be together **
disk_Buffer2 dc.l 0 ;Ptr to 2nd disk buffer, or NULL if not present
disk_Track dc.b 00 ;Track currently resting on. 0 -> 34
disk_Track2 dc.b 00 ;** These 2 byte fields MUST follow each other **
disk_Phase dc.b 0 ;a 0,1,2 or 3 based on last hi-set phase...
disk_Phase2 dc.b 0 ;** These 2 byte fields MUST follow each other **
disk_Changed dc.b 0 ;boolean of whether data has been changed
disk_Changed2 dc.b 0 ;(used for "Save changes to disk xxx first?")
disk_TkStrt dc.l 0 ;Ptr to memory where track info starts
disk_TkPos dc.l 0 ;Offset (0 -> 4096) into track
disk_Q6 dc.b 0 ;
disk_Q7 dc.b 0 ;r/w mode boolean... 0 = read, !0 = Write
disk_DriveW dc.w 0 ;drive selected (0=drive 1 or 1=drive 2)
disk_Motor dc.b 0 ;drive on? Boolean 0=off, 1=on
disk_Latch dc.b 0 ;latch where data goes to be written...
Dest_Disk_Buffer dc.l 0 ;ptr to disk buffer used for disk image "loading"
Src_Disk_Buffer dc.l 0 ;ptr to disk buffer used for disk image "saving"
disk_TrackLen EQU $18a0 ;CONST length of track...
;Filler dcb.l 1024
EndVarList dc.l 0 ;---- end of variables to be cleared at start time! ----
StartA0 dc.l 0 ;(Outside VarList on purpose)
StartD0 dc.l 0 ;save CLI info when start...
EVEN
SECTION SpriteData,DATA_C
SpriteImage dc.w $0000,$0000 ;system position stuff
dc.w %0000000000000000,%0000000000000000 ;data...
dc.w %0000000000000000,%0000000000000000
dc.w %0000000000000000,%0000000000000000
dc.w %0000000000000000,%0000000000000000
dc.w $0000,$0000 ;reserved by system
SECTION MemoryHunk1,BSS
InstLookUpTableMem ds.b 262148
SECTION MemoryHunk2,BSS
HiResDrawTableMem ds.b 65536
SECTION MemoryHunk3,BSS
DiskBufferMem ds.b disk_TrackLen*35 ;alloc 215K ram for disk buffer
***************************************************************************************
SECTION InitializedStructs,DATA
;------------------------ Intuition Structures --------------------------
MyNewScreen:
dc.w 0,0,320,LINES,2 ;x/y/width/height/depth
dc.b 0,1 ;detailpen/blockpen
dc.w 0 ;viewmodes
dc.w CUSTOMSCREEN!SCREENQUIET ;type
dc.l .TxtAtr,.Ttl ;Font,Title
dc.l 0,0 ;Gadgets,BitMap
.Ttl dc.b "Happy Bear?",0
EVEN
.TxtAtr dc.l .Font ;Text attribute for NewScreen
dc.w 8
dc.b FS_NORMAL
dc.b FPF_ROMFONT!FPF_DESIGNED
.Font dc.b "topaz.font",0
EVEN
MyNewWindow:
dc.w 0,0,320,LINES ;x/y/w/h
dc.b 0,1 ;detail/block pens
dc.l RAWKEY!MOUSEBUTTONS!INTUITICKS ;IDCMP codes
dc.l SMART_REFRESH!NOCAREREFRESH!BACKDROP!RMBTRAP!BORDERLESS ;flags
dc.l 0,0 ;gadget,checkmark
dc.l 0 ;WndwTtl
dc.l 0 ;Screen (FILL LATER)
dc.l 0 ;super bitmap
dc.w 40,40,-1,-1 ;min w/h, max w/h
dc.w CUSTOMSCREEN ;type of scrn to open on
.Ttl dc.b 0,"APPLE 2000 Window",0
EVEN
*********************** Speed Regulation/Timer stuff ***************************
CIATimerLo dc.l 0 ;ptrs for alloc'd CIA timer regs
CIATimerHi dc.l 0
CIAControlReg dc.l 0
CIAAllocBit dc.l -1 ;Allocated Int bit (used for de-alloc)
LastStopCycle dc.l 0 ;Cycle # we started regulation period on
CPF equ 150 ;assuming 1.024 Mhz clock???
RealCycPerFrame dc.l CPF
WaitCycPerFrame dc.l CPF
;--------------------- Names & Messages --------------------------------
SubTaskName dc.b "Apple 6502 CPU Emulation",0
StartMsg dc.b "Libraries, AppleRom, Screen, Window Opened Ok...",10,13,0
FailMsg dc.b "Whoops, failed somewhere!",10,13
EndFailMsg
NoRomMsg dc.b "Startup Error: _APPLE.ROM file not found! ",10,13
EndNoRomMsg
FailCIAMsg dc.b "Startup Error: Couldn't obtain either CIAB timer!",10,13
EndFailCIAMsg
Fail020Msg dc.b "Sorry, Apple 2000 requires at least a 68020 CPU.",10,13
EndFail020Msg
RomName dc.b "_Apple.Rom",0
DiskRomName dc.b "_Disk.Rom",0
MMUMsg dc.b "Sorry, this version requires an MMU.",10,13
NoFileMsg dc.b "File specified not found! ",10,13
EndNoFileMsg
BSMsg1 dc.b "Experimental Code Caching ",0
BSMsg2 dc.b "On",10,13,0
BSMsg3 dc.b "Off",10,13,0
BSMsg4 dc.b "-Shadowed- video refreshing",0
BSMsg5 dc.b "-Periodic Refresh- video refreshing",0
dosname DOSNAME ;from the dos_lib.i include... dcb ...
execname EXECNAME
grafname GRAFNAME
intname INTNAME
reqname REQTOOLSNAME
ciaBname CIABNAME
potgoname dc.b "potgo.resource",0
conname dc.b "console.device",0
BSMsg6 dc.b "Sorry, AAA video drivers not complete.",10,13
* ReqTools Messages/TagLists *
LoadMsg dc.b "Select File to Load:",0
SaveMsg dc.b "Select File to Save:",0
;QuitMsg dc.b "Really Quit?"
;QuitAnsMsg dc.b "Yes|No"
CNOP 0,4
;------------------------ MyColor Tables ---------------------------
; Each color Table is the # of colors followed by the xRGB definition for each (WORDS)
MainColorTable dc.w $0004
dc.w $0000,$089a,$0fff,$0888
dc.w $0000,$0eee,$000a,$0888 ;old colors
TxtColorTable dc.w $0004
dc.w $0000,$0eee,$0000,$0eee
HiResColorTable dc.w $0010
dc.w $0000,$0eee,$0000,$0eee,$0666,$0888,$0aaa,$0ccc
dc.w $0000,$00e0,$0a0e,$0eee,$0000,$0e60,$000e,$0eee
GrColorTable dc.w $0020
dc.w $0000,$0eee,$0000,$0eee,$0666,$0888,$0aaa,$0ccc
dc.w $0000,$0000,$0000,$0000,$0000,$0000,$0000,$0000
dc.w $0000,$0e00,$0008,$0a0e,$00a0,$0a9a,$000a,$000e
dc.w $0830,$0e60,$0ba9,$0f3d,$00e0,$0ed0,$00ae,$0eee
Flash1ColorTbl dc.w $0004
dc.w $0000,$0eee,$0000,$0eee
Flash2ColorTbl dc.w $0004
dc.w $0000,$0eee,$0eee,$0000
EVEN
;----------------------- My DiskRom image -----------------------------
MyDiskRom:
dc.b $A2,$20,$A0,$00,$A2,$03,$86,$3C,$A2,$09,$BD,$40,$C6,$9D,$0E,$04
dc.b $CA,$10,$F7,$A9,$60,$85,$2B,$AD,$EE,$C0,$AD,$EC,$C0,$AD,$EA,$C0
dc.b $AD,$E9,$C0,$A9,$00,$8D,$28,$C0,$A9,$90,$8D,$28,$C0,$D0,$21,$60
dc.b $EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA,$EA
dc.b $C1,$D0,$D0,$CC,$C5,$A0,$B2,$B0,$B0,$B0,$EA,$EA,$EA,$EA,$EA,$EA
dc.b $A9,$00,$85,$26,$85,$3D,$85,$41,$A9,$08,$85,$27,$48,$EA,$AD,$EC
dc.b $C0,$EA,$EA,$C9,$D5,$D0,$F7,$AD,$EC,$C0,$C9,$AA,$D0,$F5,$AD,$EC
dc.b $C0,$C9,$96,$D0,$E9,$AD,$29,$C0,$D0,$09,$F0,$07,$60,$EA,$EA,$EA
dc.b $EA,$EA,$EA,$AD,$29,$C0,$85,$40,$EA,$C5,$41,$D0,$D1,$AD,$29,$C0
dc.b $C5,$3D,$D0,$CA,$AD,$EC,$C0,$C9,$D5,$D0,$F9,$F0,$09,$EA,$EA,$EA
dc.b $EA,$EA,$EA,$EA,$EA,$EA,$AD,$EC,$C0,$C9,$AA,$D0,$EA,$AD,$EC,$C0
dc.b $C9,$AD,$D0,$AA,$A9,$00,$A0,$56,$4D,$28,$C0,$88,$99,$00,$03,$D0
dc.b $F7,$4D,$28,$C0,$91,$26,$C8,$D0,$F8,$4D,$28,$C0,$D0,$90,$F0,$06
dc.b $EA,$EA,$EA,$90,$87,$EA,$68,$A2,$56,$CA,$30,$FB,$B1,$26,$5E,$00
dc.b $03,$2A,$5E,$00,$03,$2A,$91,$26,$C8,$D0,$EE,$E6,$27,$E6,$3D,$A5
dc.b $3D,$CD,$00,$08,$A6,$2B,$90,$DB,$4C,$01,$08,$00,$00,$00,$00,$00
;--------------------------- BackUp Bitmap data ---------------------
OrigScrnRasInfo dc.l 0 ;backup stuff to restore to close screen...
OrigPlane1 dc.l 0
OrigPlane2 dc.l 0
OrigPlane3 dc.l 0
OrigPlane4 dc.l 0
OrigPlane5 dc.l 0
OrigRows dc.w 0
OrigDepth dc.b 0
EVEN
;
; SECTION MemoryHunk4,BSS
; ds.b 1
***************************************************************************************