QBASIC - maskinkode - array - INT21 - Convert String gox.gif (837 bytes)MASM: Qbasic - INT21

En tekst kan konverteres til store bogstaver med Qbasic's funktion UCASE$() - men denne funktion konverterer ikke æ, ø og å. Man kan selv skrive en Qbasic-funktion, som konverterer æ, ø og å, men det kan gøres hurtigere med INT 21 funktionen 6521h: Convert String.

 

Med Qbasic's funktion LCASE$() kan en tekst konverteres til små bogstaver - men ikke Æ, Ø og Å. Man kan selv skrive en Qbasic-funktion, som konverterer, men der er findes ingen INT 21 funktion, som kan konvertere til små bogstaver. Så her vil vi skrive en funktion i MASM-assembler.

 

Basic-koden

Definitions
TYPE Tregs
  ax AS INTEGER
  bx AS INTEGER
  cx AS INTEGER
  dx AS INTEGER
  si AS INTEGER
  di AS INTEGER
  ec AS INTEGER
END TYPE
  
  
DECLARE SUB init ()
DECLARE SUB Int21h ()
 
DECLARE FUNCTION UpCaseQ$ (t$)
DECLARE FUNCTION UpCaseI$ (t$)
 
DECLARE FUNCTION LoCaseQ$ (t$)
DECLARE FUNCTION LoCaseM$ (t$)
 
 
 
konvertering af små bogstaver (også æ, ø og å) til store
- med Qbasic
- med INT 21, 6521: Convert String
konvertering af store bogstaver (også Æ, Ø og Å) til små
- med Qbasic
- med MASM assembler
DIM SHARED r AS Tregs
DIM SHARED i21 AS STRING * 80
DIM SHARED lcs AS STRING * 80
DIM SHARED Int21 AS INTEGER
DIM SHARED LoCase AS INTEGER
cpu registers
buffer for Int21 machine code
buffer for LoCase machine code
Int21 code offset in data segment
LoCase code offset
 
Program
init
t$ = "ål og æblegrød"
  
PRINT t$
PRINT UCASE$(t$)
PRINT UpCaseQ$(t$)
PRINT UpCaseI$(t$)
t$ = UpCaseI$ (t$)
PRINT LCASE$(t$)
PRINT LoCaseQ$(t$)
PRINT LoCaseM$(t$)
ål og æblegrød 
åL OG æBLEGRøD 
ÅL OG ÆBLEGRØD 
ÅL OG ÆBLEGRØD 
 
Ål og ÆblegrØd
ål og æblegrød
ål og æblegrød
 
Subroutines and Functions
SUB init
  Int21 = VARPTR(i21)
  BLOAD "int21.bin", Int21
  LoCase = VARPTR(lcs)
  BLOAD "locase.bin", LoCase
END SUB
 
 
  koden i int21.bin >MASM: Qbasic - INT21
 
  koden i locase.bin >MASM: Qbasic - LoCase
 
SUB Int21h%
  CALL ABSOLUTE(r, Int21)
END SUB
 
FUNCTION UpCaseQ$ (t$)
  FOR i% = 1 TO LEN(t$)
    c$ = MID$(t$, i%, 1)
    SELECT CASE c$
      CASE "a" TO "z": c$ = UCASE$(c$)
      CASE "æ": c$ = "Æ"
      CASE "ø": c$ = "Ø"
      CASE "å": c$ = "Å"
    END SELECT
    MID$(t$, i%, 1) = c$
  NEXT
  UpCaseQ$ = t$
END FUNCTION
  
 
FUNCTION UpCaseI$ (t$)
  r.ax = &H6521
  r.cx = LEN(t$)
  r.dx = SADD(t$)
  Int21h
  UpCaseI$ = t$
END FUNCTION
    
INT 21 funktionen 6521h: Convert String
 
FUNCTION LoCaseQ$ (t$)
  FOR i% = 1 TO LEN(t$)
    c$ = MID$(t$, i%, 1)
    SELECT CASE c$
      CASE "A" TO "Z": c$ = LCASE$(c$)
      CASE "Æ": c$ = "æ"
      CASE "Ø": c$ = "ø"
      CASE "Å": c$ = "å"
    END SELECT
    MID$(t$, i%, 1) = c$
  NEXT
  LoCaseQ$ = t$
END FUNCTION
  
 
FUNCTION LoCaseM$ (t$)
  CALL ABSOLUTE(t$, LoCase)
  LoCaseM$ = t$
END FUNCTION