Calling the Main ROM from Option ROM: Difference between revisions
From Bitchin100 DocGarden
Jump to navigationJump to search
(New page: <pre> STDCALL: DI SHLD HOLDH ;Caller's HL XCHG SHLD HOLDD ;Caller's DE POP H ;(HL)=Routine to Call MO...) |
No edit summary |
||
| Line 1: | Line 1: | ||
The Main (BASIC or OS) ROM contains many routines that come in handy when | |||
writing code designed to run from the Option ROM. For example, extensive routines | |||
for doing text I/O to the LCD screen are available in the Main ROM. | |||
The trampoline code to transit to the Main ROM and back is tricky to get right. | |||
Various material is available in the Compuserve archives, and Mo Budlong's book | |||
"Secrets of the ROM Revealed." | |||
In developing the utility ROM image that ships with REX, Steve Adolph put this | |||
old code through its paces and found room for improvement. Included here are | |||
the routines needed for leveraging the Main ROM from the Option ROM | |||
== Source Code == | |||
<pre> | <pre> | ||
| Line 94: | Line 109: | ||
RET | RET | ||
</pre> | </pre> | ||
[[Category:Model T Developer Reference]] [[Category:Option ROM]] | |||
Latest revision as of 22:21, 18 May 2009
The Main (BASIC or OS) ROM contains many routines that come in handy when writing code designed to run from the Option ROM. For example, extensive routines for doing text I/O to the LCD screen are available in the Main ROM.
The trampoline code to transit to the Main ROM and back is tricky to get right.
Various material is available in the Compuserve archives, and Mo Budlong's book "Secrets of the ROM Revealed."
In developing the utility ROM image that ships with REX, Steve Adolph put this old code through its paces and found room for improvement. Included here are the routines needed for leveraging the Main ROM from the Option ROM
Source Code
STDCALL:
DI
SHLD HOLDH ;Caller's HL
XCHG
SHLD HOLDD ;Caller's DE
POP H ;(HL)=Routine to Call
MOV E,M
INX H
MOV D,M ;DE=Routine to Call
INX H ;HL=Return Address
PUSH H
LXI H,OPON ;return through OPON
PUSH H
PUSH D ;Return Address
LHLD HOLDD ;Caller's DE
XCHG
LHLD HOLDH ;Caller's HL
PUSH H ; 0363, FB C9 EI, RET
lxi h,0363h ; return here ---> EI; RET
XTHL ; works in T200 and M100
jmp STD_ON
INTCALL:
SHLD INTH ;Caller's HL
XCHG
SHLD INTD ;Caller's DE
POP H ;(HL)=Routine to Call
MOV E,M
INX H
MOV D,M ;DE=Routine to Call
INX H ;HL=Return Address
PUSH H
LXI H,OPON ;return through OPON
PUSH H
PUSH D ;Return Address
LHLD INTD ;Caller's DE
XCHG
LHLD INTH ;Caller's HL
JMP STD_ON ;make sure STD_ON does not enable interrupts!
;---------------------------------------------------------
;STD_ON: Turns off the Option ROM (or turns on Standard ROM)
;dedicated to rom calls and interrupts
;---------------------------------------------------------
; modification to STDCALL to delay the
EI till the end.
.ORG 007EH
STD_ON:
PUSH PSW
PUSH H ; 26C8, F1 C9 POP PSW, RET
LXI H,26C8H ; it returns to this location --> pop psw; ret
XTHL
; return to location pushed on stack
lda 0FF45h
ani 0FEh ; manage FF45 properly
sta 0FF45h
OUT 0E8H
RET ; RET can be found at 008EH in stdrom
; in both M100 and T200
OPON: ; this code in upper ram somewhere safe, like ALTLCD
; this routine critical for proper return from
STDCALL and INTCALL
di
PUSH PSW ; Model 100 logic.
lda 0FF45h
ori 001h ; manage FF45 properly
sta 0FF45h ; sensitive - cannot take an interrupt here
; either the rom switch is screwed up, or
; PSW gets trashed, or FF45 gets trashed
; if the interrupt occurs after sta 0FF45 but before
; out E8, then we might not return to REXROM (and the
; rest of port E8 gets screwed up)
; we would return to somewhere in main rom.
OUT 0E8H
POP PSW
ei
RET