-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmos-interface - old.asm
207 lines (173 loc) · 3.19 KB
/
mos-interface - old.asm
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
;
; Title: AGON MOS - MOS assembly interface
; Author: Jeroen Venema
; Created: 15/10/2022
; Last Updated: 26/11/2022
;
; Modinfo:
; 15/10/2022: Added _putch, _getch
; 21/10/2022: Added _puts
; 22/10/2022: Added _waitvblank, _mos_f* file functions
; 26/11/2022: __putch, changed default routine entries to use IY
.include "mos_api.inc"
XDEF _putch
XDEF __putch
XDEF _getch
XDEF __getch
XDEF _waitvblank
XDEF _mos_fopen
XDEF _mos_fclose
XDEF _mos_fgetc
XDEF _mos_fputc
XDEF _mos_feof
XDEF _getsysvar8bit
XDEF _getsysvar16bit
XDEF _getsysvar24bit
XDEF _getkeycode ;; JH
segment CODE
.assume ADL=1
_putch:
__putch:
push iy
ld iy,0
add iy, sp
ld a, (iy+6)
rst.lil 10h
ld hl,0
ld l,a
ld sp,iy
pop iy
ret
_getch:
__getch:
push iy
push ix
ld a, mos_sysvars ; MOS Call for mos_sysvars
rst.lil 08h ; returns pointer to sysvars in ixu
_getch0:
ld a, (ix+sysvar_keycode) ; get current keycode
or a,a
jr z, _getch0 ; wait for keypress
push af ; debounce key, reload keycode with 0
xor a
ld (ix+sysvar_keycode),a
pop af
pop ix
pop iy
ret
; _waitvblank:
; push iy
; ld a, mos_sysvars
; rst.lil 08h
; ld a, (iy + sysvar_time + 0)
; $$: cp a, (iy + sysvar_time + 0)
; jr z, $B
; pop iy
; ret
_waitvblank:
push ix
ld a, mos_sysvars
rst.lil 08h
ld a, (ix + sysvar_time + 0)
$$: cp a, (ix + sysvar_time + 0)
jr z, $B
pop ix
ret
; _getsysvar8bit:
; push iy
; ld a, mos_sysvars
; rst.lil 08h
; ld a, (iy) ; sysvars base address
; ld d,0
; ld e,a
; add iy,de ; iy now points to (mos_sysvars)+parameter
; ld a, (iy)
; pop iy
; ret
_getsysvar8bit:
push ix
push bc
ld c, a ; get parameter (UINT8) (offset)
ld a, mos_sysvars
rst.lil 08h ; get sysvars pointer (base address) in IX
ld b, 0
add ix, bc
ld a, (ix) ; return UINT8 value from the relevant sysvar
pop bc
pop ix
ret
; TODO - 24 bit result!
_getsysvar16bit:
_getsysvar24bit:
push ix
push bc
ld c, a ; get parameter (UINT8) (offset)
ld a, mos_sysvars
rst.lil 08h ; get sysvars pointer (base address) in IX
ld b, 0
add ix, bc
ld hl, (ix) ; return UINT16 value in HL
;ld de, (ix + 2)
pop bc
pop iy
ret
; JH
_getkeycode:
push ix
ld a, mos_getkey
rst.lil 08h ; keycode now in A
pop ix
ret
_mos_fopen:
push iy
ld iy,0
add iy, sp
ld hl, (iy+6) ; address to 0-terminated filename in memory
ld c, (iy+9) ; mode : fa_read / fa_write etc
ld a, mos_fopen
rst.lil 08h ; returns filehandle in A
ld sp,iy
pop iy
ret
_mos_fclose:
push iy
ld iy,0
add iy, sp
ld c, (iy+6) ; filehandle, or 0 to close all files
ld a, mos_fclose
rst.lil 08h ; returns number of files still open in A
ld sp,iy
pop iy
ret
_mos_fgetc:
push iy
ld iy,0
add iy, sp
ld c, (iy+6) ; filehandle
ld a, mos_fgetc
rst.lil 08h ; returns character in A
ld sp,iy
pop iy
ret
_mos_fputc:
push iy
ld iy,0
add iy, sp
ld c, (iy+6) ; filehandle
ld b, (iy+9) ; character to write
ld a, mos_fputc
rst.lil 08h ; returns nothing
ld sp,iy
pop iy
ret
_mos_feof:
push iy
ld iy,0
add iy, sp
ld c, (iy+6) ; filehandle
ld a, mos_feof
rst.lil 08h ; returns A: 1 at End-of-File, 0 otherwise
ld sp,iy
pop iy
ret
end