-
Notifications
You must be signed in to change notification settings - Fork 0
/
kcpsm6_rom.psm
100 lines (87 loc) · 1.88 KB
/
kcpsm6_rom.psm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
; Port addresses
constant scsi_control, 0'd
constant transfer_control, 1'd
constant transfer_data, 2'd
constant transfer_address_lo, 3'd
constant transfer_address_hi, 4'd
constant transfer_size_lo, 5'd
constant transfer_size_hi, 6'd
; SCSI control register bits
constant scsi_control_selected, 01
constant scsi_control_sel, 02
constant scsi_control_atn, 04
constant scsi_control_io, 08
constant scsi_control_cd, 10
constant scsi_control_msg, 20
constant scsi_control_bsy, 40
constant scsi_control_en, 80
; Transfer control register bits
constant transfer_control_start, 01
constant transfer_control_busy, 02
constant transfer_control_err, 04
start:
load s0, 00
output s0, scsi_control
wait_for_select:
input s0, scsi_control
test s0, scsi_control_selected
jump z, wait_for_select
assert_bsy:
load s0, c0
output s0, scsi_control
wait_for_selected:
input s0, scsi_control
test s0, scsi_control_sel
jump nz, wait_for_selected
command:
load s0, d0
call transfer_byte
input s0, transfer_data
output s0, 20
rl s0
rl s0
rl s0
and s0, 07
load sB, get_command_size'upper
load sA, get_command_size'lower
add sA, s0
addcy sB, 00
call@ (sB, sA)
compare s0, ff
load s3, s0
load s0, d0
load s1, 01
load s2, 00
load s4, 00
load s5, 03
call transfer_block
status:
load s0, d8
load s1, 02
call transfer_byte
command_complete:
load s0, f8
load s1, 00
call transfer_byte
done:
jump start
transfer_block:
output s0, scsi_control
output s1, transfer_address_lo
output s2, transfer_address_hi
output s3, transfer_size_lo
output s4, transfer_size_hi
load s0, 01
output s0, 01
jump transfer_data_wait
transfer_byte:
output s0, scsi_control
output s1, transfer_data
transfer_data_wait:
input s0, transfer_control
test s0, 06
jump nz, transfer_data_wait
return
table command_size#, [05, 09, 09, ff, ff, 0b, ff, ff]
get_command_size:
load&return s0, command_size#