Een muis interrupt aanroep functie voor QBasic:


; Mouse interrupt call procedure for QBasic.
push bp           ; Save previous bp.
mov bp,sp         ; Set new bp.
push si           ; Save si.
mov si,[bp+6]     ; Load registers structure offset. 
mov ax,[si]       ; Load values into CPU registers.
mov cx,[si+2]     ;
mov dx,[si+4]     ; 
mov bx,[si+6]     ; 
int 0x33          ; Call mouse interrupt.
mov [si],ax       ; Save CPU registers to structure.
mov [si+2],cx     ; 
mov [si+4],dx     ; 
mov [si+6],bx     ; 
pop si            ; Restore si.
pop bp            ; Restore bp.
retf 2            ; Return and remove arguments from stack.

Gewoon assembleren met Nasm of iets soortgelijks.

Een QBasic voorbeeld:


DEFINT A-Z

TYPE RegistersStr
 ax AS INTEGER
 cx AS INTEGER
 dx AS INTEGER
 bx AS INTEGER
END TYPE

DECLARE FUNCTION LoadWrapper$ ()
DECLARE SUB CallInt33h ()

DIM SHARED Int33h AS STRING
DIM SHARED Registers AS RegistersStr

 CLS
 Int33h = LoadWrapper$

 Registers.ax = &H1
 Registers.cx = &H0
 Registers.dx = &H0
 Registers.bx = &H0
 CallInt33h

 DO
  Registers.ax = &H3
  Registers.cx = &H0
  Registers.dx = &H0
  Registers.bx = &H0
  CallInt33h
  LOCATE 1, 1: PRINT Registers.cx, Registers.dx, " ";
 LOOP WHILE INKEY$ = ""
 
END

SUB CallInt33h
 DEF SEG = VARSEG(Int33h)
 CALL ABSOLUTE(Registers, SADD(Int33h))
END SUB

FUNCTION LoadWrapper$
DIM FileH AS INTEGER

 FileH = FREEFILE
 OPEN "Int33h.BIN" FOR INPUT LOCK READ WRITE AS FileH
 CLOSE FileH

 FileH = FREEFILE
 OPEN "Int33h.BIN" FOR BINARY LOCK READ WRITE AS FileH
  Int33h = INPUT$(LOF(FileH), FileH)
 CLOSE FileH

 LoadWrapper$ = Int33h
END FUNCTION

Getest met QBasic 1.1 en QuickBASIC 4.5. Werkt waarschijnlijk ook met QuickBASIC 7.1 en VBDos.

Aanpassen om andere registers en interrupts te gebruiken zou eenvoudig moeten zijn. :-)

Nieuwe versies van programma's oorspronkelijk voor qb45 en aangepast om te werken met QBasic volgen waarschijnlijk binnenkort! :-)

Ik moet nog ergens een complete PDS7.1 basic hebben liggen, nooit gebruikt... ;)

Leuk! :-)

PDS 7.1 heeft als ik me niet vergis CALL INTERRUPT wat mijn projectje daar overbodig maakt.

PS:
In VBDOS moet VARSEG vervangen worden met SSEG! Anders werkt het niet.

[Bericht gewijzigd door Peter Swinkels op (28%)]

Hier is een volledig functionerend programma dat laat zien hoe je de muis kunt gebruiken in QBasic:

https://github.com/PeterSwinkels/QBDraw/

Wat het bijwerken van mijn andere project betreft was ik een beetje te optimistisch. QBasic heeft meer beperkingen ten opzichte van QuickBASIC dan dat ik me realiseerde.

Op donderdag 23 januari 2025 15:33:26 schreef Peter Swinkels: Getest met QBasic 1.1 en QuickBASIC 4.5.

Met Quickbasic, de compiler, kun je simpelweg de assembler routines meelinken.

Dat zal best, maar het doel was specifiek QBasic uit te breiden. Met QuickBASIC heb je al CALL INTERRUPT dus zijn mijn assembler procedures daar niet nodig. :-)

Het wordt pas echt interessant als je interrupt service routines kunt maken, zodat je niet hoeft te pollen maar een interrupt krijgt bij een toetsaanslag, er een update van de muis beschikbaar is, de systeemtimer afloopt, etc.

Op zondag 26 januari 2025 20:15:18 schreef SparkyGSX:
Het wordt pas echt interessant als je interrupt service routines kunt maken, zodat je niet hoeft te pollen maar een interrupt krijgt bij een toetsaanslag, er een update van de muis beschikbaar is, de systeemtimer afloopt, etc.

Omleiden van interrupts naar eigen ISR code is niet zo ingewikkeld.
Of je daar zoveel aan hebt binnen QBasic is de vraag...

Dat weet ik, dat heb ik ~25 jaar geleden ook gedaan in DOS met Turbo Pascal en met C. Het is heel gemakkelijk om dat verkeerd te doen en de machine te crashen, in een virtuele machine is dat al wat minder vervelend.

Ik denk niet dat het de TS veel interesseert of je er iets aan hebt, gezien de QBasic in een DOS emulator.

[Bericht gewijzigd door SparkyGSX op (20%)]

Ik heb wel eens programma's in QBasic gezien die zich gedragen als een TSR als ik me het goed herinner. Kun je beter in C of assembleer taal schrijven als je het mij vraagt.

Overigens, met een beetje handigheid kun je zo'n oude programmeertaal nog best veel laten doen. :-)

TSR's schreef ik altijd in assembly, oude basic's zijn daar eigenlijk niet geschikt voor...

Ik heb o.a. een tsr geschreven voor een ISA watchdogprint (resette de pc als die 'vast' liep en geen antwoord meer gaf...)

WD.ASM

Ziet er knap uit, maar wat is een ISA watchdogprint precies?

Watchdogprint bevat een microcontroller (8742 of 87C576, die hebben een ISA interface) die door de op de pc draaiende software moet worden aangestuurd binnen een minuut.
Doet 'ie dat niet, dan sluit de watchdog een relais over de resetschakelaar om de pc opnieuw te booten.

Werd heel veel gebruikt bij babbelboxen e.d. (want daar was uitval zeer duur, tot 60 gulden per minuut... :+ )
En ja, zelfs de beste dos programma's liepen wel eens vast...

Wat, babbelboxen of watchdog timers?

Ja hoor, ongeveer elke microcontroller heeft er één, soms meerdere. In de embedded wereld zijn ze nog heel gebruikelijk.