OPTROM Switching
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