source: trunk/page00/boot.asm @ 11

Last change on this file since 11 was 11, checked in by brandonlw, 10 years ago

Whoops

File size: 13.6 KB
Line 
1 DEFINE PAGE00, SPACE=ROM
2 SEGMENT PAGE00
3
4 include "includes\os2.inc"
5
6 EXTERN PutS,PutC,ifastcopy,CallUSBActivityHook,CheckLowBatteriesTurnOff,SaveOScreen
7 EXTERN RunLinkActivityHook,HandleLinkKeyActivity
8 EXTERN _APP_PUSH_ERRORH,_APP_POP_ERRORH,FindSym,PushRealO1,Mov9ToOP1,FPAdd,OP1ToOP2,LCDDelay
9 EXTERN Placeholder005Fh,Placeholder0006h,Placeholder004Eh,Placeholder0003h,Placeholder0035h
10 EXTERN outputPage,NZIf83Plus,_ZERO_PORT_3,_OUT_PORT_3,AnimateRunIndicator,PowerOff
11 EXTERN DispHexA,DispHexHL,IPutC,ReadKeyboardKey
12 EXTERN curBlink,resetAPDTimer,UpdateAPD,BCALL,BJUMP
13 EXTERN HandleDefaultUSBInterrupt,ReadUSBInterruptData,HandleUSBInterruptInitialize
14 EXTERN HandleUSBACablePluggedIn,HandleUSBACableUnplugged,HandleUSBBCablePluggedIn,HandleUSBBCableUnplugged
15
16;0000h:
17boot:  jp BootCalculator
18;0003h:
19       jp Placeholder0003h
20;0006h:
21       jr Placeholder0006h_1
22;0008h:
23       jp OP1ToOP2
24;000Bh:
25       jp LCDDelay
26;000Eh:
27;I'm not sure what this is for yet.
28       nop
29       ret
30;0010h:
31       jp FindSym
32;0013h:
33;This is "bit 4,(iy+02h) \ ret", but I'm not sure that anything external actually knows of this.
34       nop
35       nop
36       nop
37       nop
38       ret
39;0018h:
40       jp PushRealO1
41;001Bh:
42;This is "call _RecAByteIO \ nop \ ret", but I'm not sure anything external actually knows of this.
43       nop
44       nop
45       nop
46       nop
47       ret
48;0020h:
49       jp Mov9ToOP1
50;0023h:
51;This is "call _SendAByte \ nop \ ret", but I'm not sure anything external actually knows of this.
52       nop
53       nop
54       nop
55       nop
56       ret
57;0028h:
58       jp BCALL
59;002Bh:
60;This is "sub a \ ld (basic_prog+1),a \ ret", but I'm not sure anything external actually knows of this.
61       nop
62       nop
63       nop
64       nop
65       ret
66;0030h:
67       jp FPAdd
68;0033h:
69       jr LdHLInd
70;0035h:
71       jp Placeholder0035h
72;0038h:
73       jr handleUSBEvents
74;003Ah:
75resumeInterruptHandler:
76       in a,(interruptStatusPort)
77       bit INT_TRIGGER_TIMER1,a
78       jp nz,firstCrystalTimerExpired
79       bit INT_TRIGGER_TIMER2,a
80       jp nz,secondCrystalTimerExpired
81       bit INT_TRIGGER_TIMER3,a
82       jp nz,thirdCrystalTimerExpired
83       jp continueInterruptHandler
84;004Eh:
85       jr Placeholder004Eh_1
86;0050h:
87       jp BJUMP
88;0053h:
89       jp BootCalculator
90;0056h:
91       DB 0FFh,0A5h
92;0058h:
93       DB 0FFh
94;0059h:
95       jp _APP_PUSH_ERRORH
96;005Ch:
97       jp _APP_POP_ERRORH
98;005Fh:
99       jp Placeholder005Fh
100;I don't think anything external depends on 0062h-006Ah.
101;0062h:
102       DB 23h,0Fh ;penCol coordinates for displaying OS version
103;0064h:
104       DB "0.01 ",0
105Placeholder0006h_1:
106       jp Placeholder0006h
107Placeholder004Eh_1:
108       jp Placeholder004Eh
109LdHLInd:
110       ld a,(hl)
111       inc hl
112       ld h,(hl)
113       ld l,a
114       ret
115;0075h:
116;This is used as the hard-coded return point for BCALL/BJUMP routines.
117       ex (sp),hl
118       push af
119       ld a,l
120       out (6),a
121       pop af
122       pop hl
123       ret
124
125;This routine is no longer at 006Ah, but most programs shouldn't care at all.
126handleUSBEvents:
127       ex af,af'
128       exx
129       in a,(usbStatusPort)
130       xor 0FFh
131       and 1Fh
132       jr z,resumeInterruptHandler
133       bit USBActivityHookEnabled,(iy+hookFlags4)
134       jr z,$F
135       ld b,2Ch
136       ld c,a
137       call CallUSBActivityHook
138       jr z,interruptReturnA
139$$:    in a,(usbEventPort)
140       ld b,a
141       or a
142       jr z,noUSBEvents
143       bit onRunning,(iy+onFlags)
144       jr z,linkActivityDetectedTurnOn    ;turn on the calculator because we have link stuff going on
145       in a,(7)
146       cp 81h
147       jr nz,linkActivityDetectedTurnOn
148       ld a,b
149       bit 4,a
150       jr nz,AcablePluggedIn
151       bit 5,a
152       jr nz,AcableUnplugged
153       bit 6,a
154       jr nz,BcablePluggedIn
155       bit 7,a
156       jr nz,BcableUnplugged
157       bit 1,a
158       jr nz,usbInitializeDetected
159noUSBEvents:
160       in a,(55h)
161       ld b,a
162       and 11h
163       xor 11h
164       jr z,resumeInterruptHandler
165       in a,(7)
166       cp 81h
167       jr nz,linkActivityDetectedTurnOn   ;turn on the calculator because we have link stuff going on
168       bit 4,b
169       jr z,readUSBData
170       ;Handle default USB interrupt, I guess
171       call HandleDefaultUSBInterrupt
172       jr $F
173readUSBData:
174       call ReadUSBInterruptData
175$$:    bit onRunning,(iy+onFlags)
176       jr z,linkActivityDetectedTurnOn
177       jr interruptReturnA
178AcablePluggedIn:
179       call HandleUSBACablePluggedIn
180       jr interruptReturnA
181AcableUnplugged:
182       call HandleUSBACableUnplugged
183       jr interruptReturnA
184BcablePluggedIn:
185       call HandleUSBBCablePluggedIn
186       jr interruptReturnA
187BcableUnplugged:
188       call HandleUSBBCableUnplugged
189       jr interruptReturnA
190usbInitializeDetected:
191       call HandleUSBInterruptInitialize
192       jr interruptReturnA
193continueInterruptHandler:
194       bit INT_TRIGGER_HW2,a
195       jr nz,secondHardwareTimerTriggered
196       bit INT_TRIGGER_LINK,a
197       jr nz,linkActivityDetectedTurnOn
198       rra
199       jr c,onKeyPressed
200       rra
201       jr c,firstHardwareTimerTriggered
202       jr interruptReturnStandard
203interruptReturnA:
204       push af
205       ld a,INTERRUPT_MASK_POWER   ;keep calculator powered at least
206       out (interruptEnPort),a
207       pop af
208       out (interruptEnPort),a
209interruptReturnStandard:
210       ld a,iNormal
211       bit enableHW2Timer,(iy+interruptFlags)
212       jr z,interruptDirectReturnA
213interruptReturnEnableTimer2:
214       or INTERRUPT_MASK_HW2       ;enable hardware timer 2
215interruptDirectReturnA:
216       out (interruptEnPort),a
217       ex af,af'
218       exx
219       ei
220       reti
221secondHardwareTimerTriggered:
222;This only fires when enableHW2Timer,(iy+interruptFlags) is set, and that's only done by _getKey.
223       ld a,INTERRUPT_MASK_HW2
224       bit enableHW2Timer,(iy+interruptFlags)
225       jr z,interruptReturnA
226       ld a,(iy+interruptFlags)
227       xor skipHW2Timer ;toggles skipHW2Timer bit
228       ld (iy+interruptFlags),a
229       bit skipHW2Timer,(iy+interruptFlags)
230       jr nz,shtt1
231;Set the battery state
232       set batteriesGood,(iy+interruptFlags)
233       in a,(statusPort)
234       bit statusBatteriesGood,a
235       jr nz,$F
236       res batteriesGood,(iy+interruptFlags)
237$$:    ld a,STATE_MODE0_DEFAULT
238       out (interruptStatusPort),a
239       res hw2TimerSkipped,(iy+linkKeyFlags)
240       res enableHW2Timer,(iy+interruptFlags)    ;disable HW2 timer, we're done
241       set intBattCheckComplete,(iy+scriptFlag)
242       ld a,INTERRUPT_MASK_POWER+INTERRUPT_MASK_ON
243       jr interruptReturnA
244shtt1: set hw2TimerSkipped,(iy+linkKeyFlags)
245       ld a,STATE_MODE0_DEFAULT
246       out (interruptStatusPort),a
247       ;Why we do this again, I'm not sure.
248       ld a,STATE_MODE0_DEFAULT
249       out (interruptStatusPort),a
250       ld a,INTERRUPT_MASK_POWER+INTERRUPT_MASK_ON
251       push af
252       ld a,INTERRUPT_MASK_POWER
253       out (interruptEnPort),a
254       pop af
255       out (interruptEnPort),a
256       jr interruptReturnEnableTimer2
257firstCrystalTimerExpired:
258secondCrystalTimerExpired:
259thirdCrystalTimerExpired:
260;I'm not using these, so any interrupts generated by them should just be acknowledged and forgotten.
261       xor a
262       out (31h),a
263       out (34h),a
264       out (37h),a
265       jr interruptReturnStandard
266firstHardwareTimerTriggered:
267       res intBattCheckComplete,(iy+scriptFlag)
268       res hw2TimerSkipped,(iy+linkKeyFlags)
269       bit enableHW2Timer,(iy+interruptFlags)
270       jr z,$F
271       bit turnOffIfLowBatteriesFound,(iy+batteryCheckFlags)
272       call nz,CheckLowBatteriesTurnOff
273       set turnOffIfLowBatteriesFound,(iy+batteryCheckFlags)
274$$:    bit indicRun,(iy+indicFlags)
275       call nz,AnimateRunIndicator
276       bit indicOnly,(iy+indicFlags)
277       jr nz,interruptReturnOn
278       call ReadKeyboardKey
279       bit curAble,(iy+curFlags)
280       call nz,curBlink
281       call UpdateAPD
282       ;Deal with link activity hook
283       bit LinkActivityHookEnabled,(iy+scriptFlag)
284       jr z,interruptReturnOn
285       bit ignoreBPLink,(iy+scriptFlag)
286       jr nz,interruptReturnOn
287       call NZIf83Plus
288       jr z,$F
289       in a,(bport)
290       and D0D1_bits
291       cp D0LD1L
292       call nz,RunLinkActivityHook
293       jr interruptReturnOn
294$$:    in a,(laStatusPort)
295       and 00011000b ;receiving/received data?
296       jr z,interruptReturnOn
297       ld a,80h
298       out (laEnPort),a
299       xor a
300       out (laEnPort),a
301       set linkAssistEnabled,(iy+linkAssistFlags)
302       call RunLinkActivityHook
303interruptReturnOn:
304       ld a,INTERRUPT_MASK_POWER+INTERRUPT_MASK_ON
305       jr interruptReturnA
306linkActivityDetectedTurnOn:
307       res shift2nd,(iy+shiftFlags)
308       push hl
309       sub a
310       push af
311       ld a,INTERRUPT_MASK_POWER
312       out (interruptEnPort),a
313       pop af
314       out (interruptEnPort),a
315;Turn ourselves on if we're not already
316       jr handleWokenUp
317onKeyPressed:
318       call HandleOnKeyPress
319       ;If we managed to return from HandleOnKeyPress, we're on and just happened to press ON
320       ;So enable only the first hardware timer and march onward
321       res skipHW2Timer,(iy+interruptFlags)
322       ld a,INTERRUPT_MASK_POWER+INTERRUPT_MASK_HW1
323       jr interruptReturnA
324HandleOnKeyPress:
325;We either just started holding down the key or we just released it, find out what to do
326       in a,(statusPort)
327       and STATUS_NON_83P_MASK
328       jr z,$F
329       ld a,(speedPort)
330       ld e,a
331       xor a
332       out (speedPort),a
333$$:    ld b,0
334debounceOnLoop:
335       ld hl,1016h                 ;hard-coded debounce delay at 6MHz
336$$:    in a,(interruptStatusPort)
337       and INT_STATUS_ON_MASK
338       cp b
339       ld b,a
340       jr nz,debounceOnLoop
341       dec hl
342       ld a,l
343       or h
344       jr nz,$B
345       cp b
346       jr z,handleKeyOn
347       ;We just released ON, either boot or return
348       in a,(memPageBPort)
349       ld b,a
350       in a,(statusPort)
351       and STATUS_NON_83P_MASK
352       jr z,$F
353       ld a,e
354       out (speedPort),a
355       ld a,b
356       cp 81h
357       jr dol1
358$$:    ld a,b
359       and 4Fh
360       cp 41h
361dol1:  jr nz,WaitForStart
362       bit onRunning,(iy+onFlags)
363       ret nz
364       pop hl
365       call _ZERO_PORT_3
366       ld a,iNormal
367       jr interruptDirectReturnA
368handleKeyOn:
369;We're pressing down ON, so either turn on or do nothing
370       in a,(statusPort)
371       and STATUS_NON_83P_MASK
372       jr z,handleWokenUp
373       ld a,e
374       out (speedPort),a
375handleWokenUp:
376;Either link activity was detected or we pressed ON, so either boot or do pretty much nothing
377;  depending on our on/off status (RAM page swapped in, onRunning,(iy+onFlags), etc.)
378       ld a,STATE_MODE0_DEFAULT
379       out (interruptStatusPort),a
380       in a,(statusPort)
381       and STATUS_NON_83P_MASK
382       jr z,$F
383       in a,(memPageBPort)
384       cp 81h
385       jr dol2
386$$:    in a,(memPageBPort)
387       and 4Fh
388       cp 41h
389dol2:  jr nz,TurnCalculatorOn
390       bit shift2nd,(iy+shiftFlags)
391       jr z,_2ndNotPressedWithOn
392       bit echoKeyRemotely,(iy+scriptFlag)
393       jr nz,$F
394       bit returnOffKey,(iy+getKeyFlags)
395       jr z,PowerOff
396$$:    set kOffPressed,(iy+getKeyFlags)
397       ret
398_2ndNotPressedWithOn:
399;We're (probably) turned on and we just happened to press ON
400       res turnOffIfLowBatteriesFound,(iy+batteryCheckFlags)
401       call resetAPDTimer
402       bit onRunning,(iy+onFlags)
403       jr z,TurnCalculatorOn
404       set onInterrupt,(iy+onFlags)
405       ret
406
407BootCalculator:
408       di
409       ;Basic port outputs
410       ld a,lcd8BitMode
411       call LCDDelay
412       out (LCDinstPort),a
413       ld a,STATE_MODE0_DEFAULT
414       out (interruptStatusPort),a
415       ld a,INTERRUPT_MASK_LINK+INTERRUPT_MASK_ON
416       out (interruptEnPort),a
417       ld a,lcdXAutoIncrementMode
418       call LCDDelay
419       out (LCDinstPort),a
420       ;Set up RAM pages
421       xor a
422       out (memPageCPort),a
423       ;Set up RAM pointers
424       ld sp,0FFC5h
425       ld iy,flags
426       ;Do any other initialization
427       ;Appear "off"
428       xor a
429       out (memPageBPort),a
430WaitForStart:
431       ld a,STATE_MODE0_DEFAULT
432       out (interruptStatusPort),a
433       call _ZERO_PORT_3
434       ld a,INTERRUPT_MASK_LINK+INTERRUPT_MASK_ON
435       out (interruptEnPort),a
436       ei
437       halt
438TurnCalculatorOn:
439       ;Set everything back up
440       ld a,STATE_MODE0_DEFAULT
441       out (interruptStatusPort),a
442       ld a,41h
443       call NZIf83Plus
444       jr nz,$F
445       ld a,81h
446$$:    out (memPageBPort),a
447       ld a,1
448       out (speedPort),a
449       xor a         ;Still not really sure what this is about
450       out (0Fh),a
451       call _ZERO_PORT_3
452       ld a,lcdTurnOn
453       out (LCDinstPort),a
454       ld a,INTERRUPT_MASK_POWER+INTERRUPT_MASK_HW1+INTERRUPT_MASK_ON
455       out (interruptEnPort),a
456       set onRunning,(iy+onFlags)
457;Start the OS, minimal as it is
458       set indicRun,(iy+indicFlags)
459       ld hl,1
460       ld (curRow),hl
461       ld hl,sTest
462       call PutS
463       B_CALL DispBootVer
464       ld hl,8000h
465       ld (editTop),hl
466       inc hl
467       ld (editCursor),hl
468       inc hl
469       ld (editTail),hl
470       inc hl
471       ld (editBtm),hl
472       ld a,' '
473       ld (curUnder),a
474       set curAble,(iy+curFlags)
475       set apdAble,(iy+apdFlags)
476       set apdRunning,(iy+apdFlags)
477$$:    B_CALL getKey
478       ld hl,6
479       ld (curRow),hl
480       call DispHexA
481       cp 37h
482       jr nz,notKey
483       ld a,(iy+12h)
484       xor 00001000b
485       ld (iy+12h),a
486       jr $B
487notKey:cp 38h
488       call z,PowerOff
489       jr $B
490sTest:
491       DB "This is a test!",0
492
Note: See TracBrowser for help on using the repository browser.