CSEG SEGMENT
ASSUME CS:CSEG,DS:DSEG
CSLENGTH PROC
; S (Segment) = [BP+6]
; S (Offset) = [BP+4]
; Z = [BP-2]
PUSH BP
MOV BP,SP
SUB SP,2
PUSH DS
PUSH BX
PUSH SI
MOV WORD PTR [BP-2],0 ; Z := 0
LLOOP:
MOV DS,[BP+6] ; While S[Z] <> #0 Do
MOV BX,[BP+4]
MOV SI,[BP-2]
CMP BYTE PTR [BX+SI],0
JE LEND
INC WORD PTR [BP-2] ; Inc(Z)
JMP LLOOP
LEND:
MOV AX,[BP-2] ; Length := Z
POP SI
POP BX
POP DS
MOV SP,BP
POP BP
RET 4
CSLENGTH ENDP
INVERT PROC
; X = [BP+8]
; S (Segment) = [BP+6]
; S (Offset) = [BP+4]
; C = [BP-1]
; Z = [BP-3]
PUSH BP
MOV BP,SP
SUB SP,3
PUSH DS
PUSH AX
PUSH BX
PUSH SI
MOV AX,[BP+6] ; Z := Length(S)
PUSH AX
MOV AX,[BP+4]
PUSH AX
CALL CSLENGTH
MOV [BP-3],AX ; If X < Z Div 2 Then
MOV AX,[BP-3]
SHR AX,1
CMP [BP+8],AX
JAE IEND
MOV DS,[BP+6] ; C := S[X]
MOV BX,[BP+4]
MOV SI,[BP+8]
MOV AL,[BX+SI]
MOV [BP-1],AL
MOV SI,[BP-3] ; S[X] := S[Z-X-1]
SUB SI,[BP+8]
DEC SI
MOV AL,[BX+SI]
MOV SI,[BP+8]
MOV [BX+SI],AL
MOV AL,[BP-1] ; S[Z-X-1] := C
MOV SI,[BP-3]
SUB SI,[BP+8]
DEC SI
MOV [BX+SI],AL
MOV AX,[BP+8] ; Invert(X+1,S)
INC AX
PUSH AX
MOV AX,[BP+6]
PUSH AX
MOV AX,[BP+4]
PUSH AX
CALL INVERT
IEND:
POP SI
POP BX
POP AX
POP DS
MOV SP,BP
POP BP
RET 6
INVERT ENDP
OUTPUT PROC
; X = [BP+8]
; S (Segment) = [BP+6]
; S (Offset) = [BP+4]
PUSH BP
MOV BP,SP
PUSH DS
PUSH AX
PUSH BX
PUSH DX
PUSH SI
MOV DS,[BP+6] ; If S[X] <> #0 Then
MOV BX,[BP+4]
MOV SI,[BP+8]
CMP BYTE PTR [BX+SI],0
JE OEND
MOV AH,2 ; Write(S[X])
MOV DL,[BX+SI]
INT 21h
MOV AX,[BP+8] ; Output(X+1,S)
INC AX
PUSH AX
MOV AX,[BP+6]
PUSH AX
MOV AX,[BP+4]
PUSH AX
CALL OUTPUT
OEND:
POP SI
POP DX
POP BX
POP AX
POP DS
POP BP
RET 6
OUTPUT ENDP
XDIRECTION PROC
; Z = [BP+8]
; Y = [BP+6]
; X = [BP+4]
PUSH BP
MOV BP,SP
PUSH AX
PUSH DX
MOV DX,[BP+4] ; Write(X:5)
CALL DEZOUT
CMP WORD PTR [BP+8],1 ; If Z > 1 Then
JBE XDEND
MOV AX,[BP+8] ; xDirection(Z-1,Y,X+Y)
DEC AX
PUSH AX
MOV AX,[BP+6]
PUSH AX
ADD AX,[BP+4]
PUSH AX
CALL XDIRECTION
XDEND:
POP DX
POP AX
POP BP
RET 6
XDIRECTION ENDP
YDIRECTION PROC
; Z = [BP+6]
; Y = [BP+4]
PUSH BP
MOV BP,SP
PUSH AX
PUSH DX
MOV AX,10 ; xDirection(10,Y,Y)
PUSH AX
MOV AX,[BP+4]
PUSH AX
PUSH AX
CALL XDIRECTION
MOV AH,2 ; WriteLn
MOV DL,13
INT 21h
MOV DL,10
INT 21h
CMP WORD PTR [BP+6],1 ; If Z > 1 Then
JBE YDEND
MOV AX,[BP+6] ; yDirection(Z-1,Y+1)
DEC AX
PUSH AX
MOV AX,[BP+4]
INC AX
PUSH AX
CALL YDIRECTION
YDEND:
POP DX
POP AX
POP BP
RET 4
YDIRECTION ENDP
KLAUSUR PROC
MOV AX,DSEG
MOV DS,AX
MOV AX,0 ; Output(0,S)
PUSH AX
MOV AX,SEG S
PUSH AX
MOV AX,OFFSET S
PUSH AX
CALL OUTPUT
MOV AH,2 ; Write(' ','*',' ')
MOV DL,' '
INT 21h
MOV DL,'*'
INT 21h
MOV DL,' '
INT 21h
MOV AX,0 ; Invert(0,S)
PUSH AX
MOV AX,SEG S
PUSH AX
MOV AX,OFFSET S
PUSH AX
CALL INVERT
MOV AX,0 ; Output(0,S)
PUSH AX
MOV AX,SEG S
PUSH AX
MOV AX,OFFSET S
PUSH AX
CALL OUTPUT
MOV AH,2 ; WriteLn
MOV DL,13
INT 21h
MOV DL,10
INT 21h
MOV DL,13 ; WriteLn
INT 21h
MOV DL,10
INT 21h
MOV AX,10 ; yDirection(10,1)
PUSH AX
MOV AX,1
PUSH AX
CALL YDIRECTION
MOV AX,4C00h
INT 21h
KLAUSUR ENDP
CSEG ENDS
IO SEGMENT
ASSUME CS:IO
DEZOUT PROC FAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,DX
CMP AX,0
JE DNULL3
MOV CX,5
DLOOP1:
MOV DX,0
MOV BX,10
DIV BX
PUSH DX
LOOP DLOOP1
MOV BX,0
MOV CX,5
DLOOP2:
POP DX
ADD BX,DX
CMP BX,0
JE DNULL1
ADD DL,'0'
MOV AH,2
INT 21h
JMP DNULL2
DNULL1:
MOV DL,' '
MOV AH,2
INT 21h
DNULL2:
LOOP DLOOP2
JMP DEND
DNULL3:
MOV DL,'0'
MOV AH,2
INT 21h
DEND:
POP DX
POP CX
POP BX
POP AX
RET
DEZOUT ENDP
IO ENDS
DSEG SEGMENT
S DB "Ein mal Eins",0,0,0,0
DSEG ENDS
SSEG SEGMENT STACK
DW 1024 DUP (?)
SSEG ENDS
END KLAUSUR