OPTROM Switching

From Bitchin100 DocGarden
Revision as of 09:07, 27 May 2010 by 209.195.69.117 (talk)
Jump to navigationJump to search

Some time was spent in developing an improved method to call main ROM from option ROM, and to handle interrupts from within the optrom.

The goal was to

  • use only the stack
  • minimize code size
  • reduce execution time



OPON: .EQU 0FAA4H


-----------------------------------------------------------------------
ROM start
-----------------------------------------------------------------------

.org 0000h

RST0: di JMP program ; standard entry .DB 0,0,0,0 RST1: RET .DB 0,0,0,0,0,0,0 RST2: RET ;Not used .DB 0,0,0,0,0,0,0 RST3: RET ;Not Used .DB 0,0,0,0,0,0,0 RST4: RET ;Not Used .DB 0,0,0 TRAP: DI CALL INTCALL RST5: RET ;Not Used .DB 0,0,0 RST55: DI CALL INTCALL RST6: JMP STDCALL ;RST 6 used as short call to a Standard ROM routine. .DB 0 RST65: DI ;Replaces the 6.5 interrupt and sets up a call to 6.5 in Standard ROM CALL INTCALL RST7: RET ;Not Used .DB 0,0,0 RST75: DI ;Replaces the 7.5 interrupt and sets up a call to 7.5 in Standard ROM CALL INTCALL

.org 0040h

OPON_img: ; auto copied on power up ; 8 bytes PUSH PSW ; temp store psw mvi a,01h OUT 0E8H pop psw ret

.db 00h



.org 0048h

---------------------------------------------------------
The STDCALL routine allows a program running in the
the Option ROM to call and return to an address in the
Option ROM.
Syntax is to use a RST 6 plus the address to be called.
RST 6
rvect--> DW 04B44H (cvect)
pvect-->
---------------------------------------------------------

STDCALL: ; 23 bytes ; stack = rvect xthl inx h inx h xthl ; fix up first stack entry ; stack = pvect ; hl=hl'

push h lxi h, OPON xthl ; stack = pvect, OPON ; hl=hl'

push h push d ; stack = pvect, OPON, hl', de'

ldsi 06h ; point de to stack location of return vector


lhlx ; hl=pvect dcx h dcx h ; point hl=pvect-2 xchg ; de=pvect-2 lhlx ; hl=cvect

pop d ; de=de' xthl ; hl=hl', stack= pvect, OPON, cvect

jmp STDON


---------------------------------------------------------
Routine for the hardware traps.
return address on entry is related to which interrupt occured.
after interrupt occurs
ivect DI
call INTCALL
rvect -->
so stack = pvect, rvect
---------------------------------------------------------

INTCALL: ; final stack must be opon, introutine ; interrupts are off ; enter with return location on stack, indicating int routine ; stack = pvect, rvect ; 20 bytes push h push d ; stack = pvect, rvect, hl', de'

ldsi 04h

lhlx ; hl= rvect

dcx h dcx h dcx h dcx h ; hl = ivect

push h ; stack = pvect, rvect, hl', de', ivect

lxi h,OPON shlx ; stack = pvect, OPON, hl', de', ivect

pop h ; hl=ivect pop d ; de=de'

xthl ; stack = pvect, OPON, ivect ; hl=hl', de=de'

jmp STDON

---------------------------------------------------------
OPEXIT/STDON
Turns off the Option ROM (or turns on Standard ROM)
---------------------------------------------------------

.org 0085h

STDON: PUSH PSW PUSH H ; 26C8, F1 C9 POP PSW, RET LXI H,26C8H ; it returns to this location --> pop psw; ret XTHL

OPEXIT: ; return to location pushed on stack xra a OUT 0E8H RET ; RET can be found at 008EH in stdrom ; in both M100 and T200


EXIT: .org 00094H pop h lxi h,0000h xthl ; restart

jmp OPEXIT