mirror of
https://github.com/AppleWin/AppleWin.git
synced 2024-11-17 21:04:45 +00:00
200 lines
4.2 KiB
Plaintext
200 lines
4.2 KiB
Plaintext
;AppleWin : An Apple //e emulator for Windows
|
|
;
|
|
;Copyright (C) 1994-1996, Michael O'Brien
|
|
;Copyright (C) 1999-2001, Oliver Schmidt
|
|
;Copyright (C) 2002-2005, Tom Charlesworth
|
|
;Copyright (C) 2006, Tom Charlesworth, Michael Pohoreski
|
|
;
|
|
;AppleWin is free software; you can redistribute it and/or modify
|
|
;it under the terms of the GNU General Public License as published by
|
|
;the Free Software Foundation; either version 2 of the License, or
|
|
;(at your option) any later version.
|
|
;
|
|
;AppleWin is distributed in the hope that it will be useful,
|
|
;but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
;MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
;GNU General Public License for more details.
|
|
;
|
|
;You should have received a copy of the GNU General Public License
|
|
;along with AppleWin; if not, write to the Free Software
|
|
;Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
;
|
|
|
|
; Description: Firmware for harddisk card
|
|
;
|
|
; Author: Copyright (c) 2005, Robert Hoem
|
|
;
|
|
|
|
; Modified by Tom Charlesworth:
|
|
; . Fixed so it can be assembled by a65 v1.06
|
|
; . TO DO: Make code relocatable
|
|
;
|
|
|
|
; constants
|
|
hd_execute = $c0f0
|
|
hd_error = $c0f1
|
|
hd_command = $c0f2
|
|
hd_unitnum = $c0f3
|
|
hd_memblock = $c0f4
|
|
hd_diskblock = $c0f6
|
|
hd_nextbyte = $c0f8
|
|
|
|
command = $42
|
|
unitnum = $43
|
|
memblock = $44
|
|
diskblock = $46
|
|
|
|
slot6 = $c600
|
|
OS = $0801
|
|
|
|
; The Autoboot rom will call this.
|
|
; This is also the entry point for such things as IN#7 and PR#7
|
|
|
|
;; code
|
|
*= $c700 ; org $c700
|
|
|
|
start
|
|
|
|
; Autoboot and ProDos look at the following few opcodes to detect block devices
|
|
lda #$20
|
|
lda #$00
|
|
lda #$03
|
|
lda #$3C
|
|
|
|
; Lets check to see if there's an image ready
|
|
lda #$00
|
|
sta hd_command
|
|
|
|
; Slot 7, disk 1
|
|
lda #$70 ; Slot# << 4
|
|
sta hd_unitnum
|
|
lda hd_execute
|
|
|
|
; error capturing code. Applewin is picky
|
|
; about code assigning data to registers and
|
|
; memory. The safest method is via I/O port
|
|
pha
|
|
lda hd_error
|
|
clc
|
|
cmp #1
|
|
bne noerr0
|
|
sec
|
|
noerr0
|
|
pla
|
|
bcc hdboot
|
|
|
|
; no image ready, boot diskette image instead
|
|
jmp slot6
|
|
|
|
; image ready. Lets boot from it.
|
|
; we want to load block 1 from s7,d1 to $800 then jump there
|
|
hdboot
|
|
lda #$70 ; Slot# << 4
|
|
sta unitnum
|
|
lda #$0
|
|
sta memblock
|
|
sta diskblock
|
|
sta diskblock+1
|
|
lda #$8
|
|
sta memblock+1
|
|
lda #$1
|
|
sta command
|
|
jsr cmdproc
|
|
bcc goload
|
|
jmp slot6
|
|
goload
|
|
|
|
; X=device
|
|
ldx #$70 ; Slot# << 4
|
|
jmp OS
|
|
|
|
; entry point for Prodos' block driver
|
|
; simple really. Copy the command from $42..$47
|
|
; to our I/O ports then execute command
|
|
cmdproc
|
|
clc
|
|
lda $42
|
|
sta hd_command
|
|
lda $43
|
|
sta hd_unitnum
|
|
lda $44
|
|
sta hd_memblock
|
|
lda $45
|
|
sta hd_memblock+1
|
|
lda $46
|
|
sta hd_diskblock
|
|
lda $47
|
|
sta hd_diskblock+1
|
|
lda hd_execute
|
|
|
|
; check for error
|
|
pha
|
|
lda command
|
|
cmp #1
|
|
bne skipSread
|
|
jsr sread
|
|
skipSread
|
|
lda hd_error
|
|
clc
|
|
cmp #1
|
|
bne noerr2
|
|
sec
|
|
noerr2
|
|
pla
|
|
rts
|
|
|
|
|
|
; if there's no error, then lets read the block into memory
|
|
; because Applewin is picky about memory management, here's what I did:
|
|
; on read, hd_nextbyte = buffer[0], therefore we'll read that byte 256 times (in which
|
|
; the emulated code increments the buffer by 1 on each read) to (memblock),y
|
|
; increment memblock+1 and read the secod 256 bytes via hd_nextbyte.
|
|
;
|
|
; if I could figure out how to consistantly get applewin to update it's memory regions all
|
|
; this code can be moved into the emulation code (although, this is how I'd build the hardware
|
|
; anyway...)
|
|
|
|
sread
|
|
tya
|
|
pha
|
|
ldy #0
|
|
loop1
|
|
lda hd_nextbyte
|
|
sta (memblock),y
|
|
iny
|
|
bne loop1
|
|
inc memblock+1
|
|
ldy #0
|
|
loop2
|
|
lda hd_nextbyte
|
|
sta (memblock),y
|
|
iny
|
|
bne loop2
|
|
pla
|
|
tay
|
|
rts
|
|
|
|
|
|
|
|
; $CsFE = status bits (BAP p7-14)
|
|
; 7 = medium is removable
|
|
; 6 = device is interruptable
|
|
; 5-4 = number of volumes (0..3 means 1..4)
|
|
; 3 = device supports Format call
|
|
; 2 = device can be written to
|
|
; 1 = device can be read from (must be 1)
|
|
; 0 = device status can be read (must be 1)
|
|
|
|
; $C7 = Removable, Interruptable, #Volumes=1, Supports write/read/status
|
|
; $D7 = Removable, Interruptable, #Volumes=2, Supports write/read/status
|
|
|
|
|
|
; datablock. This starts near the end of the firmware (at offset $FC)
|
|
;; data
|
|
*= $c7fc ; org $c7fc
|
|
.word $7fff ; how many blocks are on the device.
|
|
.byte $D7 ; specifics about the device (number of drives, read/write/format capability, etc)
|
|
.byte <cmdproc ; entry point offset for Prodos
|
|
|
|
.end
|