asc2scan() ja scan2asc()
Author: Jare
Added: 6. elokuuta 2015 kello 22.01
Edited: 6. elokuuta 2015 kello 22.01
Category: Syötteet
Description
Muuntaa ascii-merkkejä KeyHit() yms. funktioiden käyttämään scan-koodimuotoon ja päinvastoin.
En ole tätä nyt hirveästi testaillut. Periaatteessa tämän pitäisi kyetä tulkitsemaan esimerkiksi 0-näppäin vastaavaksi ascii-merkiksi riippumatta siitä, onko kyseessä numpadin näppäin 0 vai tavallinen näppäin 0. Tämä konversio on kuitenkin "häviöllinen": jos muunnos tehdään takaisin toisinpäin, ei voida tiedää, kumpi näppäin on kyseessä, joten koodin pitäisi palauttaa tavallisen 0-nppäimen scan-koodi. Sama pätee kaikkiin muihinkin merkkeihin, joille on näppäimistössä kaksi näppäintä.
scan2asc() ei osaa huomioida mahdollisen shiftin tai alt gr:n tilaa, joten se palauttaa aina ascii-koodin olettaen, että shiftiä tai alt gr:ää ei ole painettu. Esimerkkinä, jos scan2asc():lle syötetään näppäimen E scan-koodi, palautetaan ascii-koodi, joka vastaa pikku-e-kirjainta, eikä isoa E-kirjainta tai €-merkkiä vastaavaa ascii-koodia.
Taustaa
-------
TEE TÄMÄ VAIN, JOS FUNKTIOISSA ON KORJATTAVAA. Muuntomerkkijonojen generointiin kehitin alkeellisen ohjelman, jossa scan-koodit selvitetään KeyDown()-funktion avulla. Ohjelma käynnistetään, ja näppäimet ja merkit "tallennetaan" seuraavasti:
1. Varmista, että caps lock ei ole päällä.
2. Painetaan numpadista kaikki merkit yksi kerrallaan läpi (jako, kerto, miinus, plus ja numerot). Järjestyksellä ei ole väliä
3. Painetaan yksitellen näppäimiä space, tab ja enter.
4. Painetaan alt gr pohjaan ja käydään yksitellen läpi kaikki näppäimet, joissa alt gr tekee jonkin erikoismerkin. Yksinkertaisinta on käydä läpi kaikki näppäimet 0 - 9, a - ö ja erikoismerkit (ei numpadin näppäimiä).
5. Painetaan vasen shift pohjaan ja käydään läpi kaikki näppäimet, joissa shift tekee eri merkin kuin ilman shiftiä.
6. Käydään jälleen kerran läpi kaikki merkinsyöttönäppäimet (poislukien numpad), tällä kertaa ilman shiftiä tai alt gr:ää.
7. Painetaan F1. Ohjelma tallentaa tulokset tiedostoon "ascii conversion.txt" ja sulkeutuu. Tulokset voidaan suoraan poimia CB-lähdekoodiin kyseisestä tiedostosta.
Aina kun näppäintä painetaan, sen scan- ja ascii-arvot sijoitetaan muuntomerkkijonoihin. Periaatteessa näppäinten painallusjärjestyksellä ei ole väliä (ja saman näppäimen/merkin voi painaa uudestaan monta kertaa ilman, että muuntomerkkijonon pituus kasvaa turhaan), mutta järjestys vaikuttaa siihen, minkä scan-koodin konversio palauttaa silloin, kun tehdään muunnos asc2scan() merkille, jolle on olemassa kaksi näppäintä. scan2asc()-muunnoksessa taas järjestys määrää sen, mikä ascii-merkki palautetaan sellaisen näppäimen kohdalla, jolla on useita merkkivaihtoehtoja riippuen shiftin tai alt gr:n käytöstä.
Mikäli asc2scan() tai scan2asc() -funktioissa on virheitä, koodin lopussa olevalla generointiohjelmalla voitte yrittää tehdä korjatut muuntomerkkijonot.
Code
Select all1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | Function asc2scan(ascii)
to_scan$ = " 015 028 057002003004005006007043009010043012051053052008011002003004005006007008009010052051086011086012003030048046032018033034035023036037038050049024025016019031020022047017045021044009012010 053 030048046032018033034035023036037038050049024025016019031020022047017045021044008 011 018 004005 041 029 041 040026 039 040026 039 "
Return Int(Mid(to_scan, ascii*3, 3))
EndFunction
Function scan2asc(scan)
to_ascii$ = " 049050051052053054055056057048043 009113119101114116121117105111112229 013181097115100102103104106107108246228167 039122120099118098110109044046045 042 032 045 043 060 045 "
Return Int(Mid(to_ascii, scan*3, 3))
EndFunction
//Muuntomerkkijonojen generointiohjelma (NORMAALISTI EI TARVITSE KOPIOIDA MUKAAN!)
SCREEN 500,900
file = OpenToWrite("ascii conversion.txt")
to_scan$ = String(" ",255*3)
to_ascii$ = String(" ",255*3)
Repeat
again:
WaitKey
UpdateGame
If KeyDown(cbKeyF1) Then Exit
ascii = GetKey()
If ascii = 0 Then Goto again
For scan = 1 To 255
If scan <> cbKeyLShift And scan <> cbKeyRAlt And KeyDown(scan) Then Exit
Next scan
ascii_s$ = ascii
While Len(ascii_s) < 3
ascii_s = "0"+ascii_s
Wend
scan_s$ = scan
While Len(scan_s) < 3
scan_s = "0"+scan_s
Wend
to_scan = StrInsert2(to_scan, ascii*3, scan_s)
to_ascii= StrInsert2(to_ascii, scan*3, ascii_s)
Forever
WriteLine file, "to_scan$ = "+Chr(34)+to_scan+Chr(34)
WriteLine file, "to_ascii$ = "+Chr(34)+to_ascii+Chr(34)
CloseFile file
Function StrInsert2(haystack$, offset, needle$, legacy_offset=0)
Return StrRemove(StrInsert(haystack, offset-1+legacy_offset, needle), offset+Len(needle)+legacy_offset, Len(needle))
EndFunction
|
Comments
No comments. You can be first!
Leave a comment
You must be logged in to comment.