Stephane, the Source Code forum is for working source code, not
for help requests. Please take this up in the PB/DOS Forum.
[Moved from Source Code forum by admin]
------------------
Tom Hanlin
PowerBASIC Staff
Announcement
Collapse
No announcement yet.
PBDOS : CRT_IO Assembly routines
Collapse
X
-
Stephane,
I am not going to write your code for you, but I will give you
a couple of pointers.
(1) NEVER use ret, retf, or retn to end a PB inline assembler
function/sub! PB handles that stuff internally. If you have to
end a PB inline assembler function or sub ahead of time, do a
jmp to a label at the end of the function or sub.
(2) You should ALWAYS use ! push at the beginning of your PB inline
assembler function or sub to save the registers that your function or sub
uses. Then, at the end of the ASM code, put in the ! pop lines to
restore those registers to their original states. Make sure you put in
the ! pop lines in the REVERSE order that you put in the ! push lines.
------------------
Leave a comment:
-
PBDOS : CRT_IO Assembly routines
Dear Programmers
Can you please look at if there errors and can you corrected if
there is one displayed
Thanks for your help
This is ONLY for PBDOS
Code:'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC ClearEol 'CODESEG ' PROC ClearEol ' USES SI, DI ' MOV AH, 0Fh ' INT 10h ' CMP AL, 2 ' JNB @@80 ' ' MOV AX, 40 ' PUSH AX ' JMP @@getcursor '@@80: ' MOV AX, 80 ' PUSH AX '@@getcursor: ' MOV AH, 03h ' MOV BH, 00h ' INT 10h ' ' POP AX ' MOV DH, 00h ' SUB AX, DX ' PUSH AX ' MOV AH, 08h ' MOV BH, 00h ' INT 10h ' MOV BL, AH ' POP CX ' MOV AL, 32 ' MOV BH, 00h ' MOV AH, 09h ' INT 10h ' ' RET ' ENDP ClearEol 'END SUB pbClearEol() ASM mov ah, &h0f ASM int &h10 ASM cmp al, 2 ASM jnb @@80 ASM mov ax, 40 ASM push ax ASM jmp @@getcursor @@80: ASM mov ax, 80 ASM push ax @@getcursor: ASM mov ah, &h03 ASM mov bh, &h00 ASM int &h10 ASM pop ax ASM mov dh, &h00 ASM sub ax, dx ASM push ax ASM mov ah, &h08 ASM mov bh, &h00 ASM int &h10 ASM mov bl, ah ASM pop cx ASM mov al, 32 ASM mov bh, &h00 ASM mov ah, &h09 ASM int &h10 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC ClrScr 'CODESEG ' PROC ClrScr ' USES SI, DI ' ' MOV AH, 0Fh ' INT 10h ' MOV AH, 00h ' INT 10h ' ' RET ' ENDP ClrScr 'END SUB pbClrScr() ASM mov ah, &h0f ASM int &h10 ASM mov ah, &h00 ASM int &h10 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC Dec 'CODESEG ' PROC Dec ' ARG getal:WORD ' ' MOV AX, [WORD getal] ' DEC AX ' RET 'END SUB pbDecr(BYVAL wGetal AS WORD) ASM mov ax, [WORD wGetal] ASM dec ax ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC delline 'CODESEG ' PROC delline ' USES SI, DI ' ' MOV AH, 03h ' MOV BH, 00h ' INT 10h ' ' PUSH DX ' PUSH CX ' ' MOV AH, 08h ' MOV BH, 00h ' INT 10h ' POP CX ' POP DX ' MOV BL, AH ' MOV CH, DH ' MOV CL, 00 ' MOV DL, 80 ' MOV AX, 0600h ' INT 10h ' RET ' ENDP delline 'END SUB pbDelLine() ASM mov ah, &h03 ASM mov bh, &h00 ASM int &h10 ASM push dx ASM push cx ASM mov ah, &h08 ASM mov bh, &h00 ASM int &h10 ASM pop cx ASM pop dx ASM mov bl, ah ASM mov ch, dh ASM mov cl, 00 ASM mov dl, 80 ASM mov ax, &h0600 ASM int &h10 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC DiskFree 'CODESEG ' PROC DiskFree ' ARG drive :WORD ' ' MOV AH, 36h ' MOV DL, [BYTE drive] ' INT 21h ' ' CMP AX, 65535 ' JNE @@disk_ok ' ' MOV AX, -1 ' MOV DX, -1 ' RET ' '@@disk_ok: ' MUL CX ' MUL BX ' ' RET ' ENDP DiskFree 'END SUB pbDiskFree(BYVAL wDrive AS WORD) ASM mov ah, &h36 ASM mov dl, [BYTE wDrive] ASM int &h21 ASM cmp ax, 65535 ASM jne @@disk_ok ASM mov ax, -1 ASM mov dx, -1 ASM ret @@disk_ok: ASM mul cx ASM mul bx ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC DiskSize 'CODESEG ' PROC Disksize ' ARG drive :WORD ' ' MOV AH, 36h ' MOV DL, [BYTE drive] ' INT 21h ' ' CMP AX, 65535 ' JNE @@disk_ok ' ' MOV AX, -1 ' MOV DX, -1 ' RET ' '@@disk_ok: ' MUL DX ' MUL CX ' RET ' ENDP Disksize 'END SUB pbDiskFree(BYVAL wDrive AS WORD) ASM mov ah, &h36 ASM mov dl, [BYTE wDrive] ASM int &h21 ASM cmp ax, 65535 ASM jne @@disk_ok ASM mov ax, -1 ASM mov dx, -1 ASM ret @@disk_ok: ASM mul dx ASM mul cx ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC DSeg 'CODESEG ' PROC DSeg ' MOV AX, DS ' RET ' ENDP DSeg 'END SUB pbDSeg() ASM mov ax, ds ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC GetVerify ' 'CODESEG ' PROC GetVerify ' MOV AH, 54h ' INT 21h ' MOV AH, 00h ' RET ' ENDP GetVerify 'END SUB pbGetVerify() ASM mov ah, &h54 ASM int &h21 ASM mov ah, &h00 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC INC 'CODESEG ' PROC INC ' ARG getal:WORD ' MOV AX, [WORD getal] ' INC AX ' RET 'END SUB pbIncr(BYVAL wGetal AS WORD) ASM mov ax, [WORD wGetal] ASM inc ax ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC insline 'CODESEG ' PROC insline ' USES SI, DI ' MOV AH, 03h ' MOV BH, 00h ' INT 10h ' PUSH DX ' PUSH CX ' MOV AH, 08h ' MOV BH, 00h ' INT 10h ' POP CX ' POP DX ' MOV BL, AH ' MOV CH, DH ' MOV CL, 00 ' MOV DL, 80 ' MOV AX, 0701h ' INT 10h ' RET ' ENDP insline 'END SUB pbInsLine() ASM MOV AH, &h03 ASM MOV BH, &h00 ASM INT &h10 ASM PUSH DX ASM PUSH CX ASM MOV AH, &h08 ASM MOV BH, &h00 ASM INT &h10 ASM POP CX ASM POP DX ASM MOV BL, AH ASM MOV CH, DH ASM MOV CL, 00 ASM MOV DL, 80 ASM MOV AX, &h0701 ASM INT &h10 ASM RET END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC KeyPressed 'CODESEG ' PROC KeyPressed ' MOV AH, 01h ' INT 16h ' JZ @@geen_toets ' MOV AX, -1 ' RET ' '@@geen_toets: ' MOV AX, 0 ' RET ' ENDP KeyPressed 'END SUB pbKeyPressed() ASM mov ah, &h01 ASM int &h16 ASM jz @@No_key ASM mov ax, -1 ASM ret @@No_Key: ASM mov ax, 0 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC Odd 'CODESEG ' PROC Odd ' ARG getal:WORD ' MOV AX, [WORD getal] ' MOV DX, AX ' SHR DX, 1 ' SHL DX, 1 ' CMP AX, DX ' JE @@even ' MOV AX, -1 ' RET '@@even: ' MOV AX, 0 ' RET ' ENDP Odd 'END SUB pbOdd(BYVAL wGetal AS WORD) ASM mov ax, [WORD wGetal] ASM mov dx, ax ASM shr dx, 1 ASM shl dx, 1 ASM cmp ax, dx ASM je @@Odd ASM mov ax, -1 ASM ret @@Odd: ASM mov ax, 0 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC SeekEof 'CODESEG ' PROC SeekEof ' ARG handle :WORD ' MOV AX, 4202h ' MOV CX, 0000h ' MOV DX, 0000h ' MOV BX, [WORD handle] ' INT 21h ' ' RET ' ENDP SeekEof 'END SUB pbSeekEOF(BYVAL wfHandle AS WORD) ASM mov ax, &h4202 ASM mov cx, &h0000 ASM mov dx, &h0000 ASM mov bx, [WORD wfHandle] ASM int &h21 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC SeekEoln 'CODESEG ' PROC SeekEoln ' USES SI, DI ' MOV AH, 0Fh ' INT 10h ' CMP AL, 2 ' JNB @@80 ' MOV AX, 39 ' PUSH AX ' JMP @@getcursor ' '@@80: ' MOV AX, 79 ' PUSH AX '@@getcursor: ' MOV AH, 03h ' MOV BH, 00h ' INT 10h ' MOV AH, 02h ' MOV BH, 00h ' POP CX ' MOV DL, AL ' INT 10h ' RET ' ENDP SeekEoln 'END SUB pbSeekEOLN() ASM MOV AH, &h0F ASM INT &h10 ASM CMP AL, 2 ASM JNB @@80 ASM MOV AX, 39 ASM PUSH AX ASM JMP @@getcursor @@80: ASM MOV AX, 79 ASM PUSH AX @@getcursor: ASM MOV AH, &h03 ASM MOV BH, &h00 ASM INT &h10 ASM MOV AH, &h02 ASM MOV BH, &h00 ASM POP CX ASM MOV DL, AL ASM INT 10h ASM RET END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC SetCBreak 'CODESEG ' PROC SetCBreak ' ARG flag :WORD ' MOV DX, [WORD flag] ' NEG DX ' MOV AX, 3301h ' INT 21h ' RET ' ENDP SetCBreak 'END SUB pbSetCtrlBreak(BYVAL wFlag AS WORD) ASM mov dx, [WORD wFlag] ASM neg dx ASM mov ax, &h3301 ASM int &h21 ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC SPTR 'CODESEG ' PROC SPTR ' MOV AX, SP ' RET ' ENDP SPTR 'END SUB pbStackPtr() ASM mov ax, sp ASM ret END SUB 'IDEAL 'MODEL MEDIUM, BASIC 'PUBLIC SSEG 'CODESEG ' PROC SSEG ' MOV AX, SS ' RET ' ENDP SSEG 'END SUB pbStackSeg() ASM mov ax, ss ASM ret END SUB
------------------
Tags: None
Leave a comment: