Caling custom interrupt without using "call interrupt"

If you have questions about any aspect of QBasic programming, or would like to help fellow programmers solve their problems, check out this board!

Moderators: Pete, Mods

Post Reply
mikefromca
Coder
Posts: 41
Joined: Wed Oct 16, 2019 11:28 am

Caling custom interrupt without using "call interrupt"

Post by mikefromca »

I was fiddling around with webserv.bas from http://rubbermallet.org/software/webserv.html and am still doing so especially now that it breaks down after each HTTP request. I could partly blame some web browsers because they like to do prefetching.

So now I want to make the software even faster by replacing his routines to "call interrupt" with my own that will use "call absolute" so it works in all versions of DOS Qbasic. (1.1, 4.0, and 4.5).

The problem I have is the assembly language itself. To call an interrupt one would use:

Code: Select all

Int xx
where xx is a fixed interrupt number, but I want to pass a variable to it instead, so I can make a simpler assembler routine like this for Qbasic:

Code: Select all

PUSH BP
MOV BP, SP
MOV BX, [BP+06h]
Int BL
POP BP
RETF
and then execute it in Qbasic like this:

Code: Select all

d$="(above assembly in binary code)"
dseg%=varseg(d$)
doff%=sadd(d$)
def seg=dseg%
call absolute(intno%,doff%)
def seg=0
But the problem is nasm (the assembler compiler I use) complains about the INT line because it doesn't want to accept a variable as an interrupt number.

How do I go about fixing this?
MikeHawk
Veteran
Posts: 61
Joined: Sun Jul 08, 2018 11:23 am

Re: Caling custom interrupt without using "call interrupt"

Post by MikeHawk »

That's probably more an ASM question than a QB question. Anyway, a while back Hans Lunsing wrote a replacement for Call InterruptX in assembly so QBasic 1.1 could also support interrupts. The code is available right here. I don't know much about assembly but it should be possible to retrieve the instructions he used via the hexadecimal code in DATA and see how he managed to pull it off.

Code: Select all

DATA 55,8B,EC,8B,5E,0C,8B,17,0A,F6
DATA 74,07,C7,07,FF,FF,E9,A7,00,8B
DATA 5E,06,8B,1F,2E,88,97,77,00,32
DATA C0,80,FA,25,74,05,80,FA,26,75
DATA 02,0C,02,50,1E,06,56,57,9C,8B
DATA 76,0A,80,FA,20,7C,05,80,FA,30
DATA 7C,0A,81,7C,08,FF,FF,74,03,8B
DATA 6C,08,8B,44,0E,25,D5,0F,50,8B
DATA 04,8B,5C,02,8B,4C,04,8B,54,06
DATA 8B,7C,0C,FF,74,0A,81,7C,12,FF
DATA FF,74,03,8E,44,12,81,7C,10,FF
DATA FF,74,03,8E,5C,10,5E,9D,CD,00
DATA 55,8B,EC,9C,83,C5,0E,F6,46,FE
DATA 02,74,02,45,45,1E,56,8E,5E,FC
DATA 8B,76,08,89,04,89,5C,02,89,4C
DATA 04,89,54,06,8F,44,0A,89,7C,0C
DATA 8F,44,10,8C,44,12,8F,44,0E,8F
DATA 44,08,F6,46,FE,02,74,02,44,44
DATA 9D,5F,5E,07,1F,58,5D,CA,08,00
Post Reply