From 98cab31fc3659e33aef260efca55bf9f1753164c Mon Sep 17 00:00:00 2001 From: Lars-Dominik Braun Date: Mon, 11 Feb 2019 11:49:19 +0100 Subject: Add source files from Michael --- system/shard-x86-at/7/src/SHMAIN.ASM | 241 +++++++++++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 system/shard-x86-at/7/src/SHMAIN.ASM (limited to 'system/shard-x86-at/7/src/SHMAIN.ASM') diff --git a/system/shard-x86-at/7/src/SHMAIN.ASM b/system/shard-x86-at/7/src/SHMAIN.ASM new file mode 100644 index 0000000..b7b618f --- /dev/null +++ b/system/shard-x86-at/7/src/SHMAIN.ASM @@ -0,0 +1,241 @@ +;**************************************************************************** +;*======= Copyright (C) 1985,86 Martin Schoenbeck, Spenge ==================* +;* * +;* Routinen zur Verteilung der Auftraege auf verschiedene Kanaele * +;* und Kanal 32 * +;* * +;**************************************************************************** + +;****************************************************************************** +; routinen, die das restsystem vom SHard erwartet +;****************************************************************************** +; routinen im restsystem, die SHard benutzen kann +;systemstart = cs:1e10h +;inputinterrupt = cs:1e13h +;timerinterrupt = cs:1e16h +;warte = cs:1e19h +;freieumel0 = cs:1e1ch +;info = cs:1e1fh +; +;****************************************************************************** +;****************************************************************************** +; kanalspezifische funktionen +i_output proc far + push bp + push si + push di + push bx + push dx + push ax + push es + push ds ;bis hierhin nach funktion restaurieren + mov si,ds ;wir brauchen den alten wert von ds in es + mov es,si + mov si,cs ;wir brauchen ds = cs + mov ds,si + push bx ;fuer versorgung der funktion sichern + call select + pop bx + call shard:[si] ;routine anspringen + pop ds ;register wieder herstellen + pop es + pop ax + pop dx + pop bx + pop di + pop si + pop bp + ret +i_output endp + +i_blockin label far + push bp + mov bp,2 ;kennung blockin + jmp short dispatch + +i_blockout label far + push bp + mov bp,3 ;kennung blockout + jmp short dispatch + +i_iocontrol label far + push bp + mov bp,4 ;kennung iocontrol + jmp short dispatch + +control32: ;spezialaufrufe indirekt ueber kanal 32 gekommen + push cs + call i_control32 + ret + +i_control32: + push bp + mov bp,5 ;kennung control32 + jmp short dispatch + +;****************************************************************************** +; dispatch routine um aufrufe auf die kanalspezifischen treiber zu verteilen +; +; in: al = kanal +; bp auf dem stack +; bp = 2 bei blockin +; 3 bei blockout +; 4 bei iocontrol +; 5 bei control ueber kanal 32 +; aufruf mit jmp dispatch +; +; funktion: aufruf der entsprechenden funktion des kanaltreibers mit +; si = devicetypecontrolblock +; di = channelcontrolblock +; auf dem stack: bp, si, di, dx, es, ds, bx, returnadresse +; +; die routinen muessen deshalb keine register sichern. +; soll in ds:bx etwas zurueckgeliefert werden, so ist dies ueber den +; stack zu tun. +; +; out: die gewuenschte funktion wurde ausgefuehrt +; bp, si, di, dx, bx unveraendert, ausnahme: bx in bestimmten faellen wo dies +; ausdruecklich verlangt wird. flags, cx (ggf. bx) wie von der funktion geliefert. +dispatch proc far + push si ;register sichern um sie nach ende der Funktion + push di + push dx ;zu restaurieren + push es + push ds + push bx + mov si,ds ;wir brauchen den alten wert von ds in es + mov es,si + mov si,cs ;wir brauchen ds = cs + mov ds,si + call dispexecute ;fuehre dispatch aus + pop bx ;register wieder herstellen + pop ds + pop es + pop dx + pop di + pop si + pop bp + ret ;fertig, funktion ausgefuehrt +dispatch endp + +dispexecute: + push bx ;sichern, um versorgung der funktion durchfuehren + push dx ;zu koennen + call select ;adressen fuer diesen kanal laden + add bp,si ;adresse fuer offset der funktionstabelle in dtcb ausrechnen + mov bl,shard:[bp] ;offset nach bl + mov bh,0ffh ;maximal 255 byte grosse tabelle +;bx enthaelt jetzt negativen offset + add bx,si ;start der tabelle fuer funktionswerte ausrechnen +; +; als funktionswert wird derzeit nur der bereich von -128 bis +127 akzeptiert. +; -1 dient dabei als tabellenendekennzeichnung und wird fuer alle undefinierten +; funktionswerte aufgerufen +; +; die tabelle besteht aus jeweils einem byte funktionsschluessel +; im bereich -128 - +127 und zwei byte funktionsadresse. + mov dl,cl ;niederwertigen teil nach dl + mov al,ch ;hoeheren bits von cx muessen 0 oder 0ffh sein + or al,al ;ist es 0 + jz dispfunctloop ;ja, ok + inc al ;oder -1 + ifnz ;nein, dann -1 als funktionswert +dispfunctloop: + mov al,shard:[bx] ;aktuellen tabelleneintrag suchen + inc bx ;und auf dazugehoerige adresse + cmp al,dl ;gefunden + jz dispfuncfound ;ja + inc al ;oder -1 + jz dispfuncfound + inc bx ;adresse ueberspringen + inc bx + jmp dispfunctloop +dispfuncfound: + mov bp,bx ;adresse der routine nach bp + pop dx ;dx wieder herstellen + pop bx ;bx wiederherstellen + jmp shard:[bp] ;jmp funktion + +;*************************************************************************** +; select routine, um die tabellen eines bestimmten kanals zu adressieren +; +; in: al = kanalnummer +; +; out: si = dtcb adresse +; di = ccb adresse +; bx, dx zerstoert +select: + push cx + mov dx,offset selectentry ;laenge eines eintrags in selecttabelle + mov bx,offset selecttable + mov cl,shard:[bx] ;anzahl kanaele laden + mov ch,0 + inc bx ;auf eigentliche tabelle +selectloop: + cmp al,shard:[bx] ;kanal gefunden + jz selectfound + add bx,dx ;auf naechsten kanal + loop selectloop +; hier haben wir einen unbekannten kanal +; bx zeigt jetzt auf den 'nilkanal' +selectfound: +; hier wurde der passende kanal gefunden + mov di,shard:[bx]+1 ;adresse channelcontrolblock + mov si,shard:[bx]+3 ;adresse devicetypecontrolblock + pop cx + ret + +;******************************************************************************** +;* definition des typs 'shardkanal' fuer operation ueber kanal 32 + device shardchannel + + dtcbroutines iocontrol + routine 1,devicetype + routine 2,frout_ok + routine 5,nil_size + routine 6,priv_operation + routine 8,priv_operation + routine 9,priv_operation + routine -3,priv_operation + routine -4,priv_operation + routine -5,reboot_request + routine -1,unknowncontrol + dtcbroutines control32 + routine -2,timer_init + routine -1,no_channel_setup + dtcbroutines blockin + routine -4,clockread + dtcbroutines blockout + routine -4,clockwrite + routine -1,no_blockinout + dtcbparams nil_output,0 ;output,no in_out + +priv_operation: + mov al,bl ;kanalnummer nach al + mov bl,0 ;vermerken: privilegiert + jmp control32 + +priv_op_question: + mov al,bl ;kanalnummer nach al + mov bl,1 ;vermerken: abfrage + jmp control32 + +reboot_request: + mov byte ptr reboot_byte,1 + ret + +reboot_byte db 0 + +longmove: + rep movsw + ret + +i_sysend proc far + cmp byte ptr cs:reboot_byte,1 + ifz + mov al,0 + mov cx,-102 + call control32 ;laufwerk parken, wenn implementiert + ret +i_sysend endp + \ No newline at end of file -- cgit v1.2.3