source: trunk/page00/boot.asm @ 9

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

boot.asm is now cleaned up! Unfortunately, it feels like I just offloaded everything to other files. :(

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